漏洞不是 Host 头本身,而是“应用程序错误地信任了 Host 头的内容”。

一、什么是 Host 碰撞?

Host 碰撞(也称 Host 头注入攻击)是指:
攻击者通过伪造 HTTP 请求中的 Host 头字段,欺骗服务器返回非预期的内容或行为。

在 HTTP/1.1 协议中,一个 IP 地址上可以托管多个网站(虚拟主机),服务器依靠请求头中的 Host 字段来判断用户想访问哪个网站。

例如:

  • Host: www.example.com
  • Host: admin.example.com

如果服务器没有严格校验 Host 头的合法性,就可能被利用。


二、为什么会出现 Host 碰撞?

出现 Host 碰撞的主要原因包括:

  1. 服务器配置不当

    • 未限制允许的 Host 值(如只接受特定域名)。
    • 使用了通配符虚拟主机(catch-all vhost)。
  2. 应用程序信任 Host 头

    • 应用直接使用 Host 头生成重定向 URL、密码重置链接、API 回调地址等。
    • 例如:https://<Host>/reset-password?token=xxx,若 Host 可控,则可钓鱼。
  3. 缓存中毒(Cache Poisoning)

    • CDN 或反向代理根据 Host 头缓存内容,攻击者构造恶意 Host 可污染缓存,影响其他用户。
  4. 内部系统暴露

    • 某些内网服务(如管理后台)仅通过 Host 头区分是否为“合法访问”,外部可通过伪造 Host 访问。

五、如何利用 Host 碰撞?

  1. Web 缓存投毒(Web Cache Poisoning)

    • 诱导 CDN 缓存恶意页面,影响所有用户。
  2. 密码重置劫持

    • 若重置链接为 https://<Host>/reset?token=xxx,可让受害者点击你控制的域名链接,窃取 token。
  3. 绕过访问控制

    • 某些系统认为 Host: admin.local 是内网访问,允许高权限操作。
  4. SSRF 辅助攻击

    • 结合其他漏洞,通过 Host 头触发内部请求。


# import requests
#
# headers = {
#     'host': 'www.baidu.com'
# }
# response = requests.get('http://117.172.121.190:5080/', headers=headers)
# if int(response.status_code) == 200:
#     print('碰撞成功')

那么对应bp靶场的对应的简单的测试

直接按照题目要求把host从原本的改完localhost即可

由于信任了host头导致的问题-密码重置问题

攻击者拥有一个自己控制的服务器(比如 abc123.exploit-server.net)。
由于目标网站的代码错误地信任了 HTTP 请求中的 Host 头,
当攻击者发送一个 Host: abc123.exploit-server.net 的密码重置请求时,
目标服务器就把本该指向 https://shop.com/reset?token=SECRET123 的链接,
改成了 https://abc123.exploit-server.net/reset?token=SECRET123,
并把这个“有毒”的链接发到了受害者(如 carlos)的邮箱里。

点击选项(按照顺序发包)

第二个请求请求管理员获取token

第三个配合从第二个包获取的token然后删除即可

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐