前言
Xss bypass waf 并且构造函数 使危害更大,一般我们找到一个在js里面的可控点往往不能使危害更大,比如打开页面就执行
正文
正在干活,同事法来一条消息
XSS?搞起
随手试了下,发现网站存在WAF
XSS利用第一步,寻找可控点
根据提供的链接,找到了两个可控点
首先来看下第一个可控点,是一个input,来看看又没过滤 "
"
没有被过滤和转义,好家伙走起
构造一波,在Chrome高亮显示帮助我们看清楚,我们已经把前面的 "
给截断了
oncange 没被识别为攻击拦截,但是onclick 被拦截了,应该是对组合关键词进行了识别
这里给两个参考资料,一个是我自己整理的绕过XSS bypass方法,另一个是 owasp 的
https://www.loongten.com/2019/12/29/pentest-learn-xss-bypass/
https://owasp.org/www-community/xss-filter-evasion-cheatsheet
发现这个函数没被waf拦截
Nice 走起 输入payload " onInput=prompt(83936)
但是在页面上面好像看不到,仔细观察下发现type是hidden,被隐藏了,我们把他给改了
" onInput=prompt(83936) type="input
看到页面上面可以显示出来了我们刚刚构造的框
出来了,很棒,尝试输入几个字看看
拼接函数
但是这样子只能让人去输入东西的时候才会触发,这种危害很明显不怎么打,本来就是反射型XSS再加上还要手动触发,这样不行。
我们刚刚还看到有一个可控点,我们来看看
可以看到这边也是没过滤的情况,而且%0D%0
成功截断了前面的注释,但是这个东西在一个方法里面才能被调用,还是得手动才能触发,鸡肋,这个看起来是翻页的时候可以触发。
我们来分析下这个函数
我们可以看到,这个可控点被 1、2 这两个地方的方法限制在了里面。
这时候我们就可以尝试下截断上面的方法,绕出来,让他能直接执行。
截断方法
首先我们得截断掉离可控点最近的一个,就是 1 的标记 使用 }
显示400,并不是被WAF拦截,看来是程序内部识别的时候是json形式的,我们url转义下
没有报错,我们再来看看代码
成功绕过了第一个
再加个 ;
让他一行可以执行多条语句
此时payload 为 %0D%0A%7D;prompt(83936)//
再接下来绕过第二个 加上 %7D%7D)
就是 }})
可以看到前面的方法已经给我们闭合了
Console里面也产生了报错,提示没结尾
构造结尾方法
这个时候我们的代码是这样子的
可以看到后面有 } })
需要闭合掉,还有后面一大串字符得想办法让他不生效,达到不报错的时候就能执行我们的语句了
首先我们加个 function 来构造方法试试
很好,waf拦截了。。
{}
闭合还有一种方式就是把他给构造进json里面去,变成json变量的一部分
var a={
我们来构造下 }});prompt(83936);var a={
url编码后 %0D%0A%7D%7D);prompt(83936);var a=%7B
然后我们再来看看
可以看到一个 {
已经和下面的 }
形成闭合
这时候直接把剩下的 })
给闭合了
可以看到已经闭合了后面两个,但是存在报错
再进行url输解决报错就太麻烦了,我们直接放到console里面
我们先来检查下,每个符号是不是对应上了,这里chrome提供了提示,很方便
检查下来没有问题,尝试删除中间的一段东西看看
发现问题是我复制多东西了。。。
删掉最后多复制的东西,在看看
还是在报错,我们继续做减法
Nice 看来是{"+"&search_channel="+"&area="+"&page="+curPage+"&pageSize="+pageSize; }
的问题
在json里面的格式是有key和value 那么得构造
1 | { |
可以看到报错换了一个,这个应该是我多加的一个 "
的问题,去掉他
又换了个报错,还是刚刚那个问题,json字符串没对上,我们改改
有点烦,我们看看能不能直接干掉最后一个 ;
构造一个字符串,然后把后面的一串直接注释掉
最后Payload 为
}});prompt(83936);var a=({a:{a:""//
最后编码下,成功触发
着时候我们看到,函数已经绕过了其他括号限制,成功可以直接打开页面的时候触发了,不再需要手动去触发。
总结
总结下几个点
- 寻找可控点
- 尝试特殊符号是否被过滤拦截
- 有waf尝试waf没被过滤的函数
- 然后尝试触发
那么构造直接打开页面触发的也是一一样,上面几步之后
- 分析方法体
- 尝试特殊字符 }{“// 有没有被过滤
- 尝试闭合方法
- 解决报错情况
(前端js基础还是挺重要的)