技术讨论 | 在HTTP协议层面绕过WAF
字数 1514 2025-08-18 11:37:53
HTTP协议层面绕过WAF技术详解
一、背景介绍
随着Web应用安全意识的增强,许多企业通过部署Web应用防火墙(WAF)来保护网站安全。然而,老旧Web应用或追求低成本安全解决方案的系统往往仅依赖WAF作为唯一防护措施。本文详细讲解在HTTP协议层面绕过WAF的技术方法,适用于SQL注入、命令执行、代码执行等多种渗透测试场景。
二、实验环境
- 测试环境:Win10 + XAMPP
- WAF:某狗Web应用防火墙最新版
- 测试脚本:使用
$_REQUEST["id"]接收GET/POST数据 - WAF配置:拦截URL和POST中的
and、or等SQL注入关键词
三、绕过技术详解
1. 利用HTTP Pipeline绕过
原理:
HTTP协议基于TCP封装,Connection字段决定TCP连接是否保持。当值为keep-alive时,连接会保持直到传输结束。
步骤:
- 关闭Burp Repeater的Content-Length自动更新
- 截获POST请求
id=1 and 1=1(会被WAF拦截) - 复制数据包并粘贴到原数据包后面
- 修改第一个数据包:
- 将
id=1+and+1%3D1改为id=1 - 设置Content-Length为修改后内容长度(4)
- 将Connection设为
keep-alive
- 将
特点:
- 两个数据包都能到达服务器
- 可能被某些WAF拦截,但可作为组合技术的一部分
2. 分块编码传输绕过
原理:
使用Transfer-Encoding: chunked头部,将数据分块传输,每块包含十六进制长度值和数据。
步骤:
- 开启Content-Length自动更新
- 添加
Transfer-Encoding: chunked头部 - 对
id=1 and 1=1进行分块编码:9 ← 十六进制长度值 id=1 an ← 数据 3 ← 长度值 d 1=1 ← 数据 0 ← 结束标志
关键点:
- 必须将SQL关键词拆开编码
- 长度值需包括空格
- 以
0独占一行表示结束,后跟两个空行 - 可有效绕过某狗WAF
3. 协议未覆盖绕过
原理:
利用WAF未覆盖的Content-Type类型传输数据。
方法:
- 修改Content-Type为:
multipart/form-data; boundary=69 - 设置分割符内的Content-Disposition:
--69 Content-Disposition: form-data; name="id" 1 and 1=1 --69--
变体技巧:
- 使用小数点作为连接符:
1.and 1=1 - 适用于某些未检测此类变体的WAF
4. 组合技术绕过(分块编码+协议未覆盖)
步骤:
- 在multipart/form-data数据包中添加
Transfer-Encoding: chunked - 对数据部分进行分块编码,需满足以下结构:
- 第2块:包含
Content-Disposition: name="id"和两个空行 - 第3块:数据开始部分,包含长度值、空行和数据
- 第7块:分割边界结束部分
- 第8块:
0后跟两个空行
- 第2块:包含
关键要求:
- 严格计算每块长度(包括空行)
- 确保分块格式正确
- 这是最复杂的绕过方式,但效果最佳
四、技术要点总结
- 分块编码是最有效的独立绕过技术
- 协议未覆盖方法依赖于WAF的检测盲区
- Pipeline技术可作为辅助手段
- 组合技术提供了最高级别的绕过能力
- 关键词处理:拆分、变形(如使用小数点)可增强绕过效果
五、防御建议
- 不应仅依赖WAF作为唯一安全措施
- 应定期更新WAF规则以应对新型绕过技术
- 对输入数据进行严格验证和过滤
- 使用参数化查询防止SQL注入
- 监控异常HTTP请求格式
六、应用范围
这些技术不仅限于SQL注入测试,还可应用于:
- 命令执行测试
- 代码注入测试
- 文件上传绕过
- XSS攻击测试
通过深入理解HTTP协议特性和WAF工作原理,安全测试人员可以更有效地评估Web应用的真实安全性。