利用分块传输吊打所有WAF
字数 1147 2025-08-18 11:37:53

HTTP分块传输绕过WAF技术详解

1. 分块传输基础

分块传输编码(Chunked Transfer Coding)是HTTP/1.1协议中定义的一种传输机制,允许服务器将数据分成一系列块发送,每个块都有自己的大小指示器。

1.1 分块传输格式规范

根据RFC7230规范,分块传输的基本格式如下:

chunked-body = *chunk last-chunk trailer-part CRLF
chunk = chunk-size [ chunk-ext ] CRLF chunk-data CRLF
chunk-size = 1*HEXDIG
last-chunk = 1*("0") [ chunk-ext ] CRLF
chunk-data = 1*OCTET ; a sequence of chunk-size octets

关键点:

  • 每个块由块大小(十六进制)、可选扩展、CRLF、块数据和CRLF组成
  • 最后一个块的大小为0
  • 块扩展可以包含元数据、控制信息或随机化消息体大小

2. 绕过WAF的技术

2.1 使用注释扰乱分块数据包

技术原理
分块传输允许在长度标识处添加分号";"作为注释,格式为:chunk-size [ chunk-ext ],其中chunk-ext可以包含注释。

示例

9;kkkkk1234567=14;ooo=22223450\r\n
[chunk-data]\r\n

绕过效果

  • Imperva、360等高级WAF虽然能处理常规分块传输
  • 但大多数WAF无法正确处理分块数据包中长度标识处的注释
  • 导致WAF无法正确识别和重组数据包

实际案例
常规分块传输被拦截:

POST /xxxxxx.jsp HTTP/1.1
...
Transfer-Encoding: Chunked

9
xxxxxxxxx
9
xx=xxxxxx
9
xxxxxxxxx
1d
9&a=1 and 32=20
\r\n

添加注释后成功绕过:

POST /xxxxxx.jsp HTTP/1.1
...
Transfer-Encoding: Chunked

9;xxxxxxxxx
xx=xxxxxx
9;xxxxxxxxx
1;testsdasdsadd
9;test&a=1 and 3;test444442=20
\r\n

2.2 绕过ModSecurity的技术

技术原理
ModSecurity作为中间件插件,依赖中间件解析HTTP数据包。通过发送畸形的分块数据包,利用中间件的容错性使ModSecurity无法正确处理请求。

技术特点

  1. ModSecurity会直接获取中间件处理后的完整HTTP数据包
  2. 常规分块或加注释的分块都无法绕过
  3. 但发送畸形的分块数据包可能导致中间件报错但仍处理请求

实际案例
常规请求被拦截:

http://10.10.10.10/sql.php?id=2%20union

畸形分块请求绕过:

POST /sql.php?id=2%20union HTTP/1.1
...
Transfer-Encoding: chunked

1aa
0
\r\n

响应结果
虽然Apache返回400错误,但参数仍传递到PHP,绕过了ModSecurity的检测。

2.3 绕过响应内容检测

当ModSecurity配置为过滤响应内容时(如包含"root"关键字),可通过以下方式绕过:

  1. 正常请求被拦截:
http://10.10.10.10/sql.php?id=1
  1. 畸形分块请求:
POST /sql.php?id=1 HTTP/1.1
Host: 10.10.10.10
Connection: keep-alive
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked
Content-Length: 163

123
10
\r\n
  1. 结果:
  • Apache返回400错误
  • 但响应中仍包含"root"关键字
  • ModSecurity未检测400错误的数据包

3. 技术限制

  1. 无法绕过Filter类防护
  2. 无法绕过代码层通用防护
  3. 对某些特殊设计的WAF可能无效

4. 防御建议

  1. WAF应完整实现RFC7230规范,正确处理分块传输中的注释
  2. 中间件应对畸形分块请求进行严格校验
  3. 采用多层防御策略,不依赖单一防护手段
  4. 及时更新WAF规则和中间件版本

5. 总结

分块传输绕过WAF的技术主要包括:

  1. 利用分块长度标识处的注释干扰WAF解析
  2. 发送畸形分块数据包利用中间件容错性绕过检测
  3. 这些技术对Imperva、ModSecurity等主流WAF有效

该漏洞于2017年4月已提交给ModSecurity官方,但截至文章发布时间仍未完全修复。

HTTP分块传输绕过WAF技术详解 1. 分块传输基础 分块传输编码(Chunked Transfer Coding)是HTTP/1.1协议中定义的一种传输机制,允许服务器将数据分成一系列块发送,每个块都有自己的大小指示器。 1.1 分块传输格式规范 根据RFC7230规范,分块传输的基本格式如下: 关键点: 每个块由块大小(十六进制)、可选扩展、CRLF、块数据和CRLF组成 最后一个块的大小为0 块扩展可以包含元数据、控制信息或随机化消息体大小 2. 绕过WAF的技术 2.1 使用注释扰乱分块数据包 技术原理 : 分块传输允许在长度标识处添加分号";"作为注释,格式为: chunk-size [ chunk-ext ] ,其中 chunk-ext 可以包含注释。 示例 : 绕过效果 : Imperva、360等高级WAF虽然能处理常规分块传输 但大多数WAF无法正确处理分块数据包中长度标识处的注释 导致WAF无法正确识别和重组数据包 实际案例 : 常规分块传输被拦截: 添加注释后成功绕过: 2.2 绕过ModSecurity的技术 技术原理 : ModSecurity作为中间件插件,依赖中间件解析HTTP数据包。通过发送畸形的分块数据包,利用中间件的容错性使ModSecurity无法正确处理请求。 技术特点 : ModSecurity会直接获取中间件处理后的完整HTTP数据包 常规分块或加注释的分块都无法绕过 但发送畸形的分块数据包可能导致中间件报错但仍处理请求 实际案例 : 常规请求被拦截: 畸形分块请求绕过: 响应结果 : 虽然Apache返回400错误,但参数仍传递到PHP,绕过了ModSecurity的检测。 2.3 绕过响应内容检测 当ModSecurity配置为过滤响应内容时(如包含"root"关键字),可通过以下方式绕过: 正常请求被拦截: 畸形分块请求: 结果: Apache返回400错误 但响应中仍包含"root"关键字 ModSecurity未检测400错误的数据包 3. 技术限制 无法绕过Filter类防护 无法绕过代码层通用防护 对某些特殊设计的WAF可能无效 4. 防御建议 WAF应完整实现RFC7230规范,正确处理分块传输中的注释 中间件应对畸形分块请求进行严格校验 采用多层防御策略,不依赖单一防护手段 及时更新WAF规则和中间件版本 5. 总结 分块传输绕过WAF的技术主要包括: 利用分块长度标识处的注释干扰WAF解析 发送畸形分块数据包利用中间件容错性绕过检测 这些技术对Imperva、ModSecurity等主流WAF有效 该漏洞于2017年4月已提交给ModSecurity官方,但截至文章发布时间仍未完全修复。