HTTP请求走私攻击详解
字数 1313 2025-11-08 10:03:28

HTTP请求走私攻击详解

1. 攻击描述

HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,主要发生在多个服务器(如反向代理服务器与后端应用服务器)对HTTP请求解析不一致时。攻击者通过构造特殊的HTTP请求,使其中一个服务器误将部分请求内容解释为另一个独立请求,从而绕过安全控制、窃取数据或篡改请求。

2. 攻击原理

关键背景:HTTP请求边界解析差异

  • HTTP/1.1协议允许通过Content-Length(CL)和Transfer-Encoding(TE)两种头部标识请求体长度。
  • 若同一请求中同时存在这两个头部,不同服务器可能优先处理其中一个,导致对请求体结束位置的判断出现分歧。
  • 常见场景:反向代理(如Nginx)与后端服务器(如Apache、IIS)的解析逻辑不同。

两种主要攻击类型

  1. CL-TE走私:前端代理使用Content-Length,后端使用Transfer-Encoding
  2. TE-CL走私:前端代理使用Transfer-Encoding,后端使用Content-Length
  3. TE-TE走私:前后端均支持Transfer-Encoding,但通过混淆编码格式(如大小写、重复头部)触发解析差异。

3. 攻击步骤示例(以CL-TE为例)

步骤1:构造恶意请求
攻击者发送以下请求,其中:

  • Content-Length: 44 表示请求体长度为44字节。
  • Transfer-Encoding: chunked 表示后端应使用分块编码解析。
POST /api HTTP/1.1  
Host: example.com  
Content-Length: 44  
Transfer-Encoding: chunked  

0  

GET /secret HTTP/1.1  
Host: example.com  

步骤2:前端代理解析

  • 前端代理根据Content-Length: 44读取44字节(从0到第二个Host行结束),将整个内容作为单个请求转发给后端。

步骤3:后端服务器解析

  • 后端优先处理Transfer-Encoding: chunked,按分块编码解析:
    • 第一块:0(长度为0,表示结束)。
    • 剩余内容(GET /secret...)被误认为下一个请求,并发送给后端应用。

步骤4:攻击效果

  • 第二个请求(GET /secret)可能绕过认证,直接访问敏感接口。
  • 若与其他用户请求并发,可能篡改他人请求(如窃取Cookie)。

4. 防御措施

  1. 禁用协议混淆
    • 配置服务器严格拒绝同时包含CLTE头部的请求。
  2. 统一解析标准
    • 确保整个请求链(代理+后端)使用相同的解析优先级(如优先处理TE)。
  3. 使用HTTP/2
    • HTTP/2通过帧机制明确划分请求边界,从根本上避免走私问题。
  4. 安全配置
    • 对反向代理(如Nginx)设置chunked_transfer_encoding off强制使用CL。
    • 后端服务器启用严格模式(如Apache的MergeSlashes On)。

5. 检测方法

  • 发送测试请求并观察响应延迟、异常状态码或数据泄露。
  • 使用工具(如http-request-smuggling扫描器)自动化检测。

通过理解解析差异、构造特定载荷,并结合防御配置,可有效应对HTTP请求走私攻击。

HTTP请求走私攻击详解 1. 攻击描述 HTTP请求走私(HTTP Request Smuggling)是一种利用HTTP协议解析差异的攻击技术,主要发生在多个服务器(如反向代理服务器与后端应用服务器)对HTTP请求解析不一致时。攻击者通过构造特殊的HTTP请求,使其中一个服务器误将部分请求内容解释为另一个独立请求,从而绕过安全控制、窃取数据或篡改请求。 2. 攻击原理 关键背景:HTTP请求边界解析差异 HTTP/1.1协议允许通过 Content-Length (CL)和 Transfer-Encoding (TE)两种头部标识请求体长度。 若同一请求中同时存在这两个头部,不同服务器可能优先处理其中一个,导致对请求体结束位置的判断出现分歧。 常见场景:反向代理(如Nginx)与后端服务器(如Apache、IIS)的解析逻辑不同。 两种主要攻击类型 CL-TE走私 :前端代理使用 Content-Length ,后端使用 Transfer-Encoding 。 TE-CL走私 :前端代理使用 Transfer-Encoding ,后端使用 Content-Length 。 TE-TE走私 :前后端均支持 Transfer-Encoding ,但通过混淆编码格式(如大小写、重复头部)触发解析差异。 3. 攻击步骤示例(以CL-TE为例) 步骤1:构造恶意请求 攻击者发送以下请求,其中: Content-Length: 44 表示请求体长度为44字节。 Transfer-Encoding: chunked 表示后端应使用分块编码解析。 步骤2:前端代理解析 前端代理根据 Content-Length: 44 读取44字节(从 0 到第二个 Host 行结束),将整个内容作为单个请求转发给后端。 步骤3:后端服务器解析 后端优先处理 Transfer-Encoding: chunked ,按分块编码解析: 第一块: 0 (长度为0,表示结束)。 剩余内容( GET /secret... )被误认为 下一个请求 ,并发送给后端应用。 步骤4:攻击效果 第二个请求( GET /secret )可能绕过认证,直接访问敏感接口。 若与其他用户请求并发,可能篡改他人请求(如窃取Cookie)。 4. 防御措施 禁用协议混淆 : 配置服务器严格拒绝同时包含 CL 和 TE 头部的请求。 统一解析标准 : 确保整个请求链(代理+后端)使用相同的解析优先级(如优先处理 TE )。 使用HTTP/2 : HTTP/2通过帧机制明确划分请求边界,从根本上避免走私问题。 安全配置 : 对反向代理(如Nginx)设置 chunked_transfer_encoding off 强制使用CL。 后端服务器启用严格模式(如Apache的 MergeSlashes On )。 5. 检测方法 发送测试请求并观察响应延迟、异常状态码或数据泄露。 使用工具(如 http-request-smuggling 扫描器)自动化检测。 通过理解解析差异、构造特定载荷,并结合防御配置,可有效应对HTTP请求走私攻击。