逆向工程实战手册 第 102 章

第 102 章 运行时路由与 Host 头攻击

现代架构中"一个域名后面有无数服务":反向代理(Nginx/Caddy)、网关、CDN、vhost 路由、容器编排。谁能控制路由,谁就控制访问——Host 头、转发头、路径归一化是攻击的操纵杆。本章覆盖路由解析原理、Host 头攻击、路径混淆、以及多跳架构下的路由决策。

📍 知识点地图 | 主题:路由攻击 | 前置:第67章 | 后续:— | 核心概念:Host头、转发头、路径混淆、vhost

102.1 路由架构(先懂"谁决定去哪")

请求路径:
  客户端 → CDN → 反向代理 → 应用网关 → 后端服务/容器

每层可能决策路由的输入:
  Host 头(vhost 路由: 哪个域名 → 哪个站点)
  Path(路径前缀 → 哪个服务)
  转发头(X-Forwarded-*: 信任链)
  Cookie/Session(粘性路由)
  SNI(TLS 层路由)

102.2 Host 头攻击(最经典的路由攻击)

原理

后端用 Host 头决定:
  □ 生成绝对 URL(链接/重定向)
  □ 路由到虚拟主机
  □ 密码重置邮件链接(第 69 章重置链)
  □ 缓存键(缓存投毒!)

攻击: 修改 Host 头 → 影响后端行为

攻击变体

1. 密码重置投毒(最经典):
   改 Host → 重置链接指向攻击者域名
   POST /forgot-password
   Host: evil.com
   → 受害者收到 evil.com 的重置链接 → 攻击者拿到 token

2. 缓存投毒:
   Host 参与缓存键但未校验 → 污染缓存 → 其他用户收到恶意响应

3. 路由绕过:
   某些代理按 Host 白名单路由 → 改 Host 到内部域名 → 访问内部服务

4. 绝对 URL 注入:
   页面生成的链接用了 Host → XSS/钓鱼(Host 注入脚本)

检测与绕过

□ 修改 Host 观察响应(重定向/链接/路由变化)
□ 双重 Host 头(解析差异)
□ 绝对 URL 生成点(搜索 http:// 拼接)
□ 校验绕过: 加端口/子域/编码(@、#、%0d%0a)

102.3 转发头信任(X-Forwarded-For 等)

常见转发头:
  X-Forwarded-For(客户端 IP)
  X-Forwarded-Host(原始 Host)
  X-Forwarded-Proto(协议)
  X-Real-IP(Nginx)

攻击:
  □ 伪造 XFF 绕过 IP 限制(白名单/限速)
  □ 伪造 XFH 影响路由/绝对 URL
  □ 伪造 X-Forwarded-Proto → 绕过 HTTPS 强制

前提: 后端"信任"这些头(未重写/未校验)
检测: 添加伪造头观察行为变化

102.4 路径归一化与路由混淆(Path Confusion)

代理与后端对路径的解析差异(第 67 章走私同源):
  □ 编码差异: %2e%2e(..)、%252e、双编码
  □ 分隔符: / vs \ vs ;
  □ 参数解析: /api;/admin、/api%3badmin
  □ 规范化: 重复斜杠、点路径

攻击:
  □ 绕过路径前缀校验(/admin → /public/../admin)
  □ 访问代理不路由的路径(后端直接暴露)
  □ WAF 绕过(编码变体)

工具: 路径混淆字典(HackTricks/工具集)+ 手工对比代理直连差异

102.5 vhost 与容器路由(多站点/多容器)

vhost 路由: 同一 IP 多个站点(按 Host 分发)
  攻击: 发现隐藏 vhost(第 57.4 虚拟主机枚举)→ 访问内部站点

容器/微服务路由:
  路径前缀 → 不同服务(/api → API 服务, /admin → 管理服务)
  攻击: 路径混淆到达未暴露服务

K8s 场景(第 54 章):
  Ingress 路由 → Service → Pod
  攻击: 路由配置错误/未保护 Service

102.6 路由攻击测试方法论

1. 架构识别:
   □ 响应头(Server/代理特征)
   □ CDN/代理指纹
   □ 多跳行为(直连 vs 经代理差异)
2. Host 测试:
   □ 修改 Host(重定向/绝对 URL/路由变化)
   □ 伪造转发头(IP/Host/Proto)
3. 路径测试:
   □ 编码/分隔符/归一化变体
   □ 代理直连对比(发现解析差异)
4. 路由枚举:
   □ 隐藏 vhost
   □ 未暴露路径/服务
5. 影响评估:
   □ 重置投毒/缓存投毒/路由绕过

102.7 检查清单

□ 代理/CDN/网关架构识别
□ Host 头攻击(重置投毒/缓存投毒/路由)
□ 转发头伪造(XFF/XFH/Proto)
□ 路径混淆(编码/分隔符/归一化)
□ 隐藏 vhost 枚举
□ 容器/微服务路由
□ 代理直连差异对比
□ 报告: 路由链+操纵点

动手练习

  1. 在本地搭 Nginx 多 vhost,用 Host 头切换访问不同站点,体验 vhost 路由。
  2. 练习"密码重置投毒":改 Host 头让重置链接指向攻击者域名(练习靶场)。
  3. 用路径混淆字典测试一个应用的代理直连差异(观察后端直接可达的路径)。
  4. 分析一个应用的转发头信任:伪造 XFF 测试 IP 限制是否可绕过。

深入阅读

  • 仓库:CTF-Sandbox-Orchestrator/competition-runtime-routing/(运行时路由 CTF 子技能)
  • 仓库:CTF-Sandbox-Orchestrator/competition-runtime-routing/references/runtime-routing.md
  • 仓库:CTF-Sandbox-Orchestrator/competition-request-normalization-smuggling/(路径归一化)
  • 仓库:CTF-Sandbox-Orchestrator/competition-web-runtime/(Web 运行时)
  • 仓库:skills/pentest-tools/references/web-attack-cheatsheet.md