在HTTP协议层面绕过WAF

测试环境

后端代码,直接把结果给返回出来:

<?php
echo $_REQUEST['a'];

利用pipline绕过

原理

http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。

利用

  • 正常发包 a=test01 ,返回正常
  • 关闭burp的Repeater的Content-Length自动更新,点击红圈的Repeater在下拉选项中取消update Content-Length选中。这一步至关重要!!!
  • 将第一个数据包的直接复制粘贴一遍,并且把 Connection 字段的值改为 keep-alive
  • 可见返回了两个响应包,当WAF只对其中一个响应包进行检测时,那就可以使用这种方法进行绕过

利用分块编码传输绕过

原理

一般情况HTTP请求包的Header包含Content-Length域来指明报文体的长度。有时候服务生成HTTP回应是无法确定消息大小的,比如大文件的下载,或者后台需要复杂的逻辑才能全部处理页面的请求,这时用需要实时生成消息长度,服务器一般使用chunked编码。

在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。

利用

  • 开启上一部分关闭的content-length自动更新;然后添加以HTTP请求头Transfer-Encoding: chunked;将数据部分进行分块编码(注意长度为十六进制),每一块里长度独占一行,数据独占一行。
  • 将上面数据包最后的一位改成2再测试
  • 分块传输可以在长度标识处加上分号**;**作为注释,有的WAF能够检测分块编码传输,但是遇到添加注释的时候就认不出来了

注意:

  • 分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。
  • 编码过程中长度需包括空格的长度。
  • 最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态。

利用协议未覆盖进行绕过

原理

HTTP头里的Content-Type一般有application/x-www-form-urlencodedmultipart/form-datatext/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。

利用

  • 将头部Content-Type改为multipart/form-data; boundary=69   然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。

但是上面的这种只是正常的数据提交,几乎不会有WAF回不检测这种协议的数据,在实战中可以多尝试几种传输数据协议。

分块编码+协议未覆盖组合绕过

原理

在面对数据分块编码传输和所有协议都进行检测的WAF,则可尝试将上述的两种绕过方式进行组合进行绕过。

利用

在协议未覆盖的数据包中加入Transfer-Encoding: chunked ,然后将数据部分全部进行分块编码

注意:

  • 第2块中需要满足
长度值
空行
Content-Disposition: name="a"
空行

这种形式,且长度值要将两个空行的长度计算在内(空行长度为2)。

  • 第3块,即数据开始部分需满足
长度值 
空行
数据

形式,且需将空行计算在内。

  • 第4块即分割边界结束部分,需满足
长度值
空行
分割结束符
空行

形式,且计算空行长度在内。

  • 第5块需满足
0  
空行
空行

形式。如果不同时满足这四块的形式要求,payload将不会生效。

利用分块编码传输畸形数据绕过

原理

对于加载在中间件上的插件(ModSecurity),所以不需要理会解析http数据包的问题,因为中间件已经帮它处理完了,那么无论使用常规的分块还是加了注释的分块数据包,ModSecurity都能直接获取到完整的http数据包然后匹配危险关键字。但是对于使用Apache服务器来说,它的容错率很强,即使服务器报错了,仍然会把数据传输给PHP解析,并且将解析结果返回。这样一来就可以绕过基于中间件上的WAF,不仅是请求包能够绕过,同时能够绕过响应包的检测。

利用

使用POST方法但是在URL中传参,而POST-BODY中的数据为分块编码的畸形数据,也就是不按照正确的chunked格式进行传输

参考资料

https://www.freebuf.com/news/193659.html

https://www.anquanke.com/post/id/169738#h2-1

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇