HTTP协议bypass WAF(狗/盾)

Posted T00ls

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP协议bypass WAF(狗/盾)相关的知识,希望对你有一定的参考价值。

0x00 前言

1.最近在整理并总结bypass WAF的一些方法,大概几个板块:注入绕过、漏洞exp绕过、上传绕过以及HTTP协议绕过。期间通过学习
很多国内外好的资源收获了不少,也给大家分享些方法。
2.这里仅以HTTP协议其中一部分来bypass WAF来测试并编写sqlmap 的Tamper 发文当天仅测试了安全狗、D盾其他没有测试。

总结的手段大概如下(截图):

HTTP协议bypass WAF(狗/盾)

0x01 HTTP协议

  1. 协议版本。首先HTTP协议从开始的HTTP0.9版本-->1.0--->1.1-->逐步到现在的2.0。不断的在完善,也不断的有特性的改变,所以在进行bypass WAF的时候也可以利用版本的不用同来对WAF进行测试,利用WAF可能没有完全包含全HTTP协议版本的特性点进行fuzz.

  2. HTTP 头部参数。http头参数平时并没有很仔细研究,在阅读相关资料后,你会发现每个头部甚至参数都还有其他特性用法。过WAF的时候也是利用其特性来绕过,常规的样式WAF早就记录,但是可能遗漏很多其他特性。

常见的HTP请求头(如图):


HTTP协议bypass WAF(狗/盾)


这个是最普通的头部字段,其中还有很多没有字段没有体现,有些字段稍微的变化甚至会影响整个payload的样貌,具体更多HTTP头部的介绍可以参考官网的文档:RFC2068、RFC2616、RFC7230、RFC7540等等。

这里举例过WAF的用的是2个HTTP的头参数:Transfer-Encoding、Content-Type等


0x02 Transfer-Encoding

分块传输编码(Chunked transfer encoding)是超文本传输协议(HTTP)中的一种数据传输机制,允许HTTP由网页服务器(客户端)发送给客户端的数据可以分成多个部分。利用点就是把我们攻击代码进行分块传输,WAF不能直接规则匹配到。数据到服务端后会自动根据http头获知是chunked的会自动组合来进行后续的资源响应。

类似于(如图):


HTTP协议bypass WAF(狗/盾)



0x03 Content-Type

这个参数平时查看HTTP头部的时候 肯定都看到多。其实在这个头部的参数里还有个参数:charset 。这个值平时我们看到是没有后面的值,默认是utf-8,没有显示的。其实它还有很多很多的编码。这个参数的含义是给内容进行编码。试想下你客户端提交的数据是不常用的编码且服务端的容器是支持的话,WAF可能不会包含所有的编码还自动解码在判断在编码发给服务端的。这样就达到一个绕过WAF的一种手段。

如图():


HTTP协议bypass WAF(狗/盾)


由于本次测试的环境是:2008+IIS7 IIS支持的编码有:IBM037, IBM500, IBM870, cp875, IBM1026, IBM01047, IBM01140, IBM01141, IBM01142, IBM01143, IBM01144, IBM01145, IBM01146, IBM01147, IBM01148, IBM01149, utf-16, unicodeFFFE, utf-32, utf-32BE, IBM273, IBM277, IBM278, IBM280, IBM284, IBM285, IBM290, IBM297, IBM420,IBM423, IBM424, xEBCDIC-KoreanExtended, IBM-Thai, IBM871, IBM880, IBM905, IBM00924, cp1025

脚本编写选择用的编码是:ibm037


0x04 编写sqlmap tamper过WAF脚本

1.首先是编写chunked 分块传输的编码,根据协议的标准,把数据进行每行分块的传输,我这里设置分块的大小是2。即2个字符就分块。

如图:


HTTP协议bypass WAF(狗/盾)


2 然后就是charset自动编码的代码。功能简单,就是把payload全部进行指定的编码进行编码。如图:


HTTP协议bypass WAF(狗/盾)


3.sqlmap tamper的修改。因为修改了2个HTTP头部参数,需要在tamper中制定头部中添加一个分块传输,以及指定编码。

如图:


HTTP协议bypass WAF(狗/盾)


这里最折腾我就是我明明代码指明了要分快传输头部chunked, 但是实际发包却没有。。。一直没有找到原因。如果哪位老哥知道我错在哪里,请教我一招。。3q

我的解决办法就是直接执行sqlmap的时候强制加上头部:--headers="Transfer-Encoding: chunked"。然后坑又来了,我加上头部后使用proxy=http://127.0.0.1:8080 发现发包不出去,没有数据通讯(折腾了好久。。)主要是通过BP来看看数据包,这样比较直观数据发送是否正常、样貌方便各位看的明白舒服。后来就只能使用wireshark来跟数据给大家展示。

0x05 动态效果

动态图中参数增加了:--data "*" --dbms mssql --dbs --headers="Transfer-Encoding: chunked" --tamper 666666.py --skip-urlencode(不要url编码) 由于代码功底差,代码很乱。一般代码功能实现了,就懒得去优化了。不贴上来丢人了。原理就是这样,大佬们可造最优脚本。

首先是撸安全狗的动态图:

HTTP协议bypass WAF(狗/盾)


HTTP协议bypass WAF(狗/盾)


HTTP协议bypass WAF(狗/盾)


然后是D盾的动态图:

HTTP协议bypass WAF(狗/盾)


0x06 总结

欠缺的还有很多,需要更加学习和实战

以上是关于HTTP协议bypass WAF(狗/盾)的主要内容,如果未能解决你的问题,请参考以下文章

bypass各种waf--php回调后门

从HTTP协议层面探讨Bypass

sql注入系列之(bypass waf 2)

Bypass XSS过滤方法

关于Safe DOG的文件上传bypass

Bypass xss过滤的测试方法