6

浅谈Bypass Waf – 下(实战篇)

 2 years ago
source link: https://www.secpulse.com/archives/173213.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

浅谈Bypass Waf – 下(实战篇)

文章来源|MS08067 Web漏洞挖掘班 第3期

本文作者:Hi2x(Web漏洞挖掘班讲师)

以下测试均为授权渗透测试:

探测规则1

beepress-image-173213-1644391720.png

在页面发现一处富文本编辑器,并且该内容提交后会显示在对应页面上,这里第一个想到的就是XSS了。

先整个最简单的XSS的Payload试试,抓包看现象:

beepress-image-173213-1644391721.png

发现输入的标签会被HTML实体化编码,所以每次构造Payload时需要解HTML实体。

beepress-image-173213-16443917211.png

从回包的状态码403和Server值可以判断是被Waf拦截了。

那么这时如果我们想要绕Waf的话,就要去思考它对应的正则匹配的规则可能存在的情况了:

1.匹配script

2.匹配alert

3.匹配<.*?>

4.匹配<script>

5.匹配<script>.*?alert.*?</script>

注:.*?表示非贪婪比配,可以匹配任意字符,直到下一个字符出现为止。例如:<.*?>可以匹配<符号开头、后面可以有任意字符直到匹配到>为止。

大致推出比较有可能的就是这集中情况,那我们就可以进行一一验证:

script

beepress-image-173213-1644391722.png

alert

beepress-image-173213-16443917221.png

<(.*?)>

beepress-image-173213-1644391723.png

<script>

beepress-image-173213-1644391724.png

可以发现,拦截的关键字为<script>,则第五种情况无需测试,因为构造的字符串存在<script>,一定会被规则匹配中。
那么该规则过滤了<script>标签,我们就可以思考通过其他标签构造XSS,例如<img>等。

探测规则2

既然可以构造img标签,那也拿img的XSS Payload浅测一下:

beepress-image-173213-16443917241.png

好了,又被拦了。首先大致能排除<img src=xxx>的问题,出于稳健的心理浅测一下:

beepress-image-173213-1644391725.png

说明构造的Payload里面被拦截的特征为:onerror=alert(123)。

那就再简单猜测一下对应的Waf规则吧:

1.匹配onerror=

2.匹配alert(.*?)

3.匹配on.*?=alert(.*?)

4.匹配on.*?=.*?alert(.*?)

一一验证:

onerror=

beepress-image-173213-1644391726.png

拦了onerror=应该也拦了其他的on事件,简单尝试一下:

beepress-image-173213-16443917261.png

那on事件几乎就是无了,得思考思考怎么绕。

alert(.*?)

beepress-image-173213-1644391727.png

看来也被拦截了,那只能试试换prompt(123)或alert`123`

beepress-image-173213-16443917271.png

均已失败告终...所以下面两个on.*?=.*?alert(.*?)和on.*?=alert(.*?)也无需测试都会被Waf拦截。

alert最简单的绕过方式就是换函数了,但是常用的弹窗函数都被禁用了,貌似已经有点困难了;但是突发奇想:研发是否会不会只过滤了常见的弹窗函数,拿document.location.href=xxx试试:

beepress-image-173213-1644391729.png

没拦截这个函数呀,所以并不是所有函数都被拦了,而是常用的alert()、prompt()、confirm()被拦截了。

所以要么换函数,要么强行绕alert函数(我喜欢硬刚,就冲alert了!)

我发现貌似这样判断alert是否被过滤不太严谨,应该重新判断一次:

故试了试如下Payload:

beepress-image-173213-1644391730.png

意外发现竟然没有拦截?所以前面alert(.*?)判断的匹配规则不对,匹配中的应该为 alert(123),前面可能有内容才会匹配

beepress-image-173213-1644391731.png

xxalert没有拦截,那说明过滤的应该是特殊符号,这时上波Fuzz爆破一下,发现只有:和是被拦截的,也就是说,不能使用:alert(123)和 alert(123)

探测规则3

先总结一下前面两波手工探测的成果:
1.过滤了<script>等标签
2.过滤了onerror事件
3.过滤了:alert(123)及 alert(123)
在这里,第一个规则我们可以使用<img>或者<a>,比较好绕过;第二个规则再加上对<script>标签的限制比较难绕过,但仍然可以尝试使用href=javascript:xxxx伪协议绕过;但如果在第二个规则内构造伪协议,则Payload应该为:<a href=javasciprt:alert(123)>,这样的话会匹配中第三个规则:alert(123),所以思路应该还是要换函数:

beepress-image-173213-1644391732.png

这样就可以执行JS代码了,但是没什么用...所以还是要想办法弹窗,但是又必须要绕过:alert(123)等。

灵机一动,Payload就来了!alert()函数是JS BOM的函数,为了调用方便被简写成alert(),而正规的调用方法为window.alert()。那这样Payload就有了:

<a href=javascript:window.alert(123)>test</a>

beepress-image-173213-1644391733.png

页面点击链接看现象:

beepress-image-173213-1644391734.png

beepress-image-173213-16443917341.png

以上漏洞已报送至对应厂商。

本文作者:Ms08067安全实验室

本文为安全脉搏专栏作者发布,转载请注明:https://www.secpulse.com/archives/173213.html


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK