HTTP Host 头注入测试的目标,不是证明服务器“接受了任意主机名”,而是确认不可信的主机信息是否越过信任边界,影响密码重置链接、共享缓存内容或反向代理的路由与访问控制。本文面向已获得书面授权的黑盒 DAST 与业务逻辑验证:仅使用测试账户、受控域名和预先批准的路径,不访问真实用户令牌,不探测未知内网目标,也不向生产公共缓存写入测试内容。
开始前,应确认授权涵盖目标域名、接入地址、测试时间窗、邮件触发次数、缓存隔离方式及代理日志调阅权限。示例中的 .test 域名和 192.0.2.10 均为文档占位值;执行时替换为授权环境,并使用有效的证书信任配置,不以关闭 TLS 校验来掩盖环境问题。

一、明确测试对象与安全停止条件
HTTP/1.1 中的 Host 参与目标主机识别;HTTP/2 中需要关注对应的 :authority。反向代理还可能使用 X-Forwarded-Host、Forwarded 等字段传递原始主机信息。风险来自不同组件对这些值的信任、解析或使用方式不一致,而非这些字段本身的存在。
OWASP 的主机头注入测试指南将虚拟主机分发、重定向等行为纳入验证范围,并指出仅检查 Host 时仍需关注 X-Forwarded-Host。PortSwigger 的相关资料进一步列出了密码重置投毒、缓存投毒和路由相关风险。实际评估应分别建立证据,不能用一个异常响应推定所有影响成立。
| 验证对象 | 本次允许观察的结果 | 不应继续的行为 |
|---|---|---|
| 密码重置 | 测试邮箱中的链接主机名是否被替换 | 触发真实用户邮件、收集他人令牌 |
| 缓存 | 隔离缓存对象是否向正常请求返回测试标记 | 在公共页面投毒、等待真实访客命中 |
| 代理路由 | 预置无敏感信息端点是否被错误转发 | 枚举内网地址、访问管理接口或元数据服务 |
出现以下任一情况,应暂停相关分支并联系业务负责人:
- 邮件发送到非测试账户,或触发异常通知、限流和账户锁定。
- 测试标记进入非隔离缓存对象,或无法确认缓存影响范围。
- 响应出现真实业务数据、管理能力或授权外后端内容。
- 错误率、延迟或监控告警异常。
- 需要通过未知内部主机名才能继续证明影响。
停止后先保存最小必要证据,再按预案清除缓存、撤销令牌或关闭测试路由,不要为“证明得更充分”扩大访问。
二、侦察请求特征,建立可比较的基线
固定连接目标,区分主机字段的作用
一次请求可能同时涉及:
- 网络连接目的地址。
- TLS 握手使用的服务器名称,即 SNI。
- HTTP 请求中的
Host或:authority。 - 代理转发给后端的主机信息。
如果这些变量同时变化,就难以判断差异来自 DNS、TLS、虚拟主机匹配还是应用逻辑。首轮测试宜固定 URL、连接地址、路径和协议,只改变一个字段。
例如,在授权实验环境中记录 HTTP/1.1 基线:
curl --http1.1
--resolve app.example.test:443:192.0.2.10
--connect-timeout 5 --max-time 10
-D baseline.headers -o baseline.body
https://app.example.test/host-check
随后仅改变 Host:
curl --http1.1
--resolve app.example.test:443:192.0.2.10
--connect-timeout 5 --max-time 10
-H 'Host: canary.example.test'
-D host-test.headers -o host-test.body
https://app.example.test/host-check
这里连接地址和 TLS SNI 仍对应 app.example.test,HTTP 主机字段则被替换。/host-check 应是运维预先设置的无敏感信息端点。
示例未使用自动重定向参数,目的是先观察 Location,避免客户端追随未知目标。文件应保存在受控目录;后续涉及会话和令牌的记录还需要加密保存、限制访问。
建立单变量测试矩阵
建议从正常请求出发,按顺序执行,每个变体先发送一次:
| 变体 | 修改内容 | 重点观察 |
|---|---|---|
| 基线 | 不修改 | 状态码、响应摘要、重定向、缓存状态 |
| 主机替换 | 仅修改 Host | 是否拒绝、重定向或切换虚拟主机 |
| 转发主机 | 正常 Host,增加 X-Forwarded-Host | 应用是否信任客户端声明 |
| 标准转发字段 | 单独增加 Forwarded: host=canary.example.test;proto=https | 是否影响链接或路由 |
| 协议对照 | 在明确支持的协议下重复关键验证 | 是否存在协议路径差异 |
Forwarded 中的协议值应与基线一致,避免把协议变化误认为主机变化。HTTP/2 测试时应检查工具实际发送的 :authority,不能直接假定界面中的 Host 就是线上报文。
不要在第一轮混入重复主机头、畸形语法或请求边界变体。这些情况可能涉及解析差异,需要独立授权、专门环境和额外风险控制。
用差异提出假设,而不是直接报漏洞
重点比较:
Location、绝对链接和资源地址是否出现受控标记。- 返回页面是否变成另一虚拟主机的内容。
- 状态码、正文摘要和错误模板是否变化。
- 缓存相关头部是否变化。
- 请求标识能否关联到同一入口与后端。
单次 200、403 或 404 都不足以确认漏洞。任意 Host 返回同一公开页面,可能只是默认虚拟主机配置;只有证明它影响安全敏感结果,才能进一步判断风险。
三、验证密码重置链接是否受主机字段控制
密码重置劫持的关键假设是:应用使用客户端可控的主机信息构造绝对链接,使邮件中的重置地址指向非可信来源。
使用专用账户和最小请求
准备一个专用测试账户及对应测试邮箱。先通过正常流程获取基线邮件,记录链接的协议、主机、端口和路径结构,不把令牌复制到工单或聊天工具。
随后在测试代理中重放一次合法的密码重置请求,仅修改待测字段。以下只是请求结构,路径、参数、会话和防跨站请求伪造字段必须以实际应用为准:
POST /account/password/reset HTTP/1.1
Host: app.example.test
X-Forwarded-Host: canary.example.test
Content-Type: application/x-www-form-urlencoded
Cookie: session=<测试会话>
X-CSRF-Token: <有效测试值>
email=reset-test%40example.test
先测试正常 Host 配合转发主机字段,再独立验证 Host 替换。不要同时修改多个主机来源,否则无法确定实际生效字段。
直接检查邮件,不点击异常链接
优先在邮件原文或受控邮件捕获系统中检查链接:
- 正常请求生成的链接是否指向批准域名。
- 修改后的请求是否使实际链接目标变成受控标记域名。
- 标记是否出现在包含重置路径和令牌的链接中,而非普通展示文本。
- 可见文字与实际链接目标是否一致。
如果测试账户邮件中的令牌链接已指向受控主机,通常已有足够证据证明链接来源可被污染,无需真的将令牌发送到外部接收端。测试域名也可以不提供 HTTP 服务;如确需端到端验证,必须另行确认接收日志、令牌留存和销毁规则。
证据截图应遮盖完整令牌,只保留主机、必要的路径结构和关联编号。邮件安全网关或客户端可能自动扫描链接,因此回连记录本身不能证明用户点击。
区分链接污染与账户接管
| 观察结果 | 可以支持的判断 |
|---|---|
| 仅页面中的普通链接发生变化 | 主机信息影响页面输出,需继续判断用途 |
| 测试邮件的重置链接主机被替换 | 密码重置链接污染成立 |
| 受控接收端收到测试令牌 | 存在令牌外发路径,需排除自动扫描 |
| 在额外授权下完成测试账户密码重置 | 测试账户的完整影响链得到验证 |
没有执行完整链路时,应写明未验证部分及前提条件,不能直接宣称“任意账户接管”。完成验证后,按应用支持的方式使测试令牌失效,并确认旧链接不能继续使用。
四、在隔离对象上验证缓存投毒
缓存投毒关注的是:某个输入改变了响应,却没有被缓存键充分区分,导致其他正常请求收到被改变的响应。注入请求自身看见标记,只证明响应受影响,不证明共享缓存污染。
先证明隔离,再发送标记
优先使用预生产环境、独立缓存命名空间或专门测试主机。生产环境只有在运维确认隔离规则和清除方式后,才进入写入验证。
不要默认随机查询参数能隔离缓存。部分配置会忽略、删除或归一化查询参数。应由配置、日志或受控实验确认测试对象确实独立;无法确认时,只记录潜在风险,不执行污染写入。
测试响应只使用无害标记,例如受控主机名或静态文本,不植入脚本、外部资源或可执行内容。
建立“写入—正常读取—清理恢复”证据链
对一个已确认隔离的缓存对象:
- 清除旧缓存或确认对象尚未缓存。
- 发送带受控主机字段的请求,保存响应。
- 使用独立会话发送不带注入字段的正常请求。
- 检查正常请求是否收到同一标记。
- 清除测试对象,再发送正常请求,确认标记消失。
Age、Via 或产品自定义缓存头可作辅助线索,但不能单独证明共享缓存命中。结合缓存日志、请求标识、时间线和不同会话的读取结果,证据才更可靠。
如果标记仅存在于注入请求响应中,应报告为“主机字段影响响应”;如果正常请求从共享缓存读到标记,才有依据报告缓存污染。风险还取决于受影响内容、对象共享范围、存活时间和清除能力。
五、验证反向代理路由混淆与内部路由绕过
路由混淆、访问控制绕过和服务端请求伪造需要分别判断。主机字段导致后端变化,并不自动意味着突破权限边界;代理转发到了另一虚拟主机,也不等同于应用发起了任意服务端请求。
由运维预置无害路由探针
不要通过猜测内部域名来寻找可访问服务。让运维预先提供:
- 一个明确批准的测试主机名,例如
route-check.example.test。 - 一个只返回固定随机标记的探针端点。
- 该端点从公共入口应当被拒绝的预期规则。
- 可关联入口、路由决策和后端响应的日志字段。
分别用正常主机字段、替换后的 Host、单独设置的转发主机字段访问批准路径。保持请求方法、连接地址和其他条件一致,不做主机名枚举。
用预期规则和日志确认是否越界
较完整的路由绕过证据应包含:
- 既定规则明确禁止公共入口访问该探针后端。
- 基线请求被拒绝,或未到达该后端。
- 仅修改某个主机字段后,响应出现探针标记。
- 代理与后端日志证明请求确实被转发。
- 没有使用本就允许访问该后端的会话或来源地址。
如果标记只是边缘错误模板中的反射内容,就不能证明后端可达。如果该后端原本就允许公开访问,也不能将虚拟主机切换报告为内部路由绕过。
一旦探针证明边界可被跨越,应停止扩展。不要继续尝试管理页面、调试接口或更多内部地址;后续影响由资产负责人结合后端清单和访问控制设计评估。
六、整理证据并给出可复核的风险结论
每个发现应有独立编号,区分“已观察事实”“已验证影响”和“尚未验证的条件”。
建议报告保留以下字段:
- 授权与环境:目标、入口、时间窗、测试来源、环境类型。
- 连接条件:目的地址、SNI、HTTP 版本、主机字段。
- 基线与变体:唯一修改点、脱敏请求、请求次数。
- 响应与副作用:状态码、关键响应头、正文摘要、邮件或路由结果。
- 证据关联:时间戳及其时区、请求标识、代理和后端日志编号。
- 影响边界:测试账户、缓存命名空间或指定探针。
- 清理记录:令牌失效、缓存清除、临时配置回滚及确认结果。
- 限制条件:是否验证完整链路、未验证哪些对象及原因。
原始报文可能包含 Cookie、邮箱、重置令牌和内部拓扑信息,应加密存放;报告附件使用脱敏副本。风险排序应依据实际影响,而不是统一给所有 Host 头注入现象标高危。
七、按信任边界整改,并使用原测试矩阵复测
固定安全敏感链接的可信来源
密码重置、账户激活等链接应使用服务端配置的可信公共来源。多租户应用应从经过验证的租户配置中选择域名,而不是直接拼接请求主机。
主机校验应按合法语法解析,并与允许的主机及端口组合匹配,避免简单子串或后缀匹配。还需明确是否允许别名、非默认端口等情况,保证所有层使用一致规则。
收紧入口与转发字段的信任
在公开入口清除或覆盖外部传入的转发主机字段,再由受信代理按明确规则生成。应用仅信任指定代理来源,且后端不应存在可绕过该入口的公开访问路径。
拒绝未知虚拟主机,并让 TLS、HTTP 主机校验、代理路由和应用配置保持一致。内部服务仍需独立鉴权或网络访问控制,不能把客户端可修改的主机名当作身份凭据。
对齐缓存键与响应变化因素
如果某个字段会改变可缓存响应,就应将其纳入正确的缓存区分逻辑,或在生成响应前消除其影响。仅增加 Host 到缓存键不能解决应用另行信任 X-Forwarded-Host 的问题。
整改还应检查 CDN、反向代理和应用缓存各层,清除可能残留的污染对象,并确认身份敏感或令牌相关响应不会被错误共享。
复测既验证拒绝,也验证业务正常
使用原来的单变量矩阵重新检查:
- 非法主机被明确拒绝,合法主机仍正常工作。
- 伪造转发字段不再改变密码重置链接或代理路由。
- 隔离缓存对象在正常请求下不再返回测试标记。
- 公共入口无法访问内部探针。
- 合法代理链、租户域名和邮件流程未受破坏。
- 临时路由、测试缓存、日志接收端及有效令牌均已清理。
完整的 HTTP Host 头注入验证,应当说明:哪个不可信字段穿过了哪条信任边界、改变了什么安全敏感结果、影响能否复现,以及整改后同一条件为何不再生效。以最小副作用建立这条证据链,才能把黑盒异常转化为可修复、可复核的 Web 安全发现。
- it2021
- it2021.com
- OWASP
- test
- 访问控制

西藏 山南 1F
单变量这点太对了,之前混改字段白测半天