一、Host碰撞的基本原理

1. HTTP请求中的Host头

HTTP/1.1协议要求每个请求必须包含一个Host头部字段,用于指定客户端要访问的目标域名。例如:

1
2
3
GET /index.php HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0

Web服务器通过这个Host头来判断请求应该路由到哪一个虚拟主机(Virtual Host)。如果服务器没有正确处理非法或未知的Host头,则可能将请求转发到错误的后端服务上。


2. Nginx/Apache反向代理配置不当导致Host碰撞

当企业使用Nginx/Apache作为反向代理时,通常会为多个域名配置不同的后端服务。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name www.a.com;

location / {
proxy_pass http://internal-a-server;
}
}

server {
listen 80;
server_name www.b.com;

location / {
proxy_pass http://internal-b-server;
}
}

如果没有显式地设置默认的default_server块或未对无效Host头进行过滤,那么当用户以IP地址+自定义Host头的方式访问服务器时,Nginx/Apache可能会将请求转发到某一个匹配的虚拟主机后端服务上。


3. Host碰撞的关键点

  • IP地址访问:直接访问某个服务器的IP地址,而非域名。

  • Host头伪造:在HTTP请求中添加任意目标域名的Host头。

  • 反向代理逻辑触发:如果该域名仍存在于Nginx/Apache的配置中,即使该域名不再对外提供服务,也可能被成功转发到对应的后端服务上。


二、Host碰撞的应用场景

1. 资产收集阶段的隐藏服务探测

在红队项目中,常见的资产收集工具(如Sublist3r、Assetfinder、Hunter)可以找到大量域名,但这些域名可能已不再解析到公网IP。此时,若能获取目标企业的IP段范围,并尝试用这些域名与IP组合进行Host碰撞,就有可能访问到原本隐藏在内网的服务。

示例:

  • 收集到域名列表:a.test.com, b.test.com, c.test.com

  • 找到IP段:192.168.100.0/24 或 10.10.0.0/16

  • 构造请求:

    1
    curl -H "Host: a.test.com" http://10.10.0.10/

2. 绕过基于IP的访问控制

某些服务器配置中只允许通过域名访问,而禁止直接使用IP地址访问(如返回403 Forbidden),但这种限制往往只依赖于Host头的判断。因此,可以通过Host碰撞绕过限制。


3. 探测已删除但仍在运行的服务

企业在上线新系统或迁移服务时,可能会删除旧域名的A记录,但并未关闭对应的服务。这类服务往往存在安全漏洞或配置缺陷,是攻击者重点关注的对象。


三、Host碰撞的检测方法

1. 使用Burp Suite手动测试

在Burp Proxy中拦截请求,修改Host头为目标域名,并发送至目标IP地址。

2. 自动化脚本批量探测

1. 推荐开源工具

(1)hostcollider.py

GitHub 项目地址:

Text
1
https://github.com/takito1995/Host-Collision-Scanner

功能特点:

  • 自动化发送伪造 Host 的 HTTP 请求

  • 支持批量扫描

  • 对比响应大小与状态码,识别有效碰撞结果

使用方法:

1
python hostcollider.py -i ips.txt -d domains.txt

(2)vhostscan

GitHub 项目地址:

Text
1
https://github.com/codingo/VHostScan

功能特点:

  • 支持基于 TLS 和 SNI 的虚拟主机扫描

  • 可配合 BurpSuite 使用

  • 支持递归字典爆破

使用方法:

1
VHostScan.py -t 192.168.1.1 -w subdomains.txt

2. 自研 Python 脚本实现 Host 碰撞探测(完整代码)

以下是一个完整的 Python 自动化 Host 碰撞探测脚本,适用于红队实战与安全研究:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import requests
import sys

def host_collision(ip_list, domain_list):
headers = {
'User-Agent': 'Mozilla/5.0',
'Connection': 'close'
}

with open(ip_list, 'r') as f_ips:
ips = [line.strip() for line in f_ips if line.strip()]

with open(domain_list, 'r') as f_domains:
domains = [line.strip() for line in f_domains if line.strip()]

for ip in ips:
for domain in domains:
try:
url = f"http://{ip}"
headers['Host'] = domain
response = requests.get(url, headers=headers, timeout=5)

# 判断是否为有效 Host 碰撞(可根据实际需求调整条件)
if response.status_code == 200 and len(response.text) > 100:
print(f"[+] 成功碰撞:IP={ip}, Host={domain}")
print(f" 响应长度: {len(response.text)}")
print(f" 响应摘要: {response.text[:200]}...\n")
except Exception as e:
print(f"[-] 请求失败:{url} ({e})")

if __name__ == '__main__':
if len(sys.argv) != 3:
print("Usage: python host_collide.py <ip_list.txt> <domain_list.txt>")
sys.exit(1)

ip_list = sys.argv[1]
domain_list = sys.argv[2]

host_collision(ip_list, domain_list)

✅ 使用说明:

  1. 准备两个字典文件:

    • ip_list.txt: 包含目标 IP 地址列表

      Text
      1
      2
      192.168.1.1
      192.168.1.2
    • domain_list.txt: 包含目标域名列表

      Text
      1
      2
      3
      www.example.com
      admin.example.com
      test.example.com
  2. 执行命令:

    1
    python host_collide.py ip_list.txt domain_list.txt
  3. 输出示例:

    Text
    1
    2
    3
    [+] 成功碰撞:IP=192.168.1.1, Host=admin.example.com
    响应长度: 1234
    响应摘要: <!DOCTYPE html><html lang="en">...

四、Host 碰撞在实战中的拓展应用场景

1. 结合 SSRF 绕过本地限制

在 SSRF 中,有时只能访问本地 IP 地址,但无法访问具体域名资源。此时可以通过伪造 Host 头来访问内部系统。

2. 搭配 XSS 利用

通过 Host 碰撞访问到后台系统后,植入 XSS payload 获取管理员 Cookie。

3. 搭配 WAF Bypass

一些 WAF 仅检查 URL 路径,不对 Host 头做校验,可借此绕过 WAF 检测规则。


五、Host碰撞的防御措施

1. 配置Nginx/Apache的default_server

明确指定默认Server块,拒绝未绑定Host头的请求。

1
2
3
4
server {
listen 80 default_server;
return 403; # 或其他拒绝方式
}

2. 删除不再使用的虚拟主机配置

及时清理过期的Server块,避免遗留配置被利用。

3. 强制使用域名访问

对于关键服务,可在应用层验证Host头是否合法,否则拒绝访问。

1
2
3
4
5
// PHP示例
if ($_SERVER['HTTP_HOST'] != 'www.expected-domain.com') {
header("HTTP/1.1 403 Forbidden");
exit();
}

4. 设置WAF规则拦截异常Host头

在Web应用防火墙(WAF)中设置规则,检测并阻断非法Host头请求。


六、实战案例参考(来自文档)

来源:【文档名】:记一次红队项目经历分享(上)

1. 访问某些域名时发现指向的是内网 IP。

2. 访问某些 IP+端口 时会返回 4xx 状态码。

3. 访问某些 IP+端口 时返回 200 状态码,但无论在域名后输入什么都没有变化。

在实战中,我们常常需要对企业进行全面的资产收集。在这个过程中,会收集到大量的资产信息,包括域名和IP地址。然而,直接访问这些资产时,经常会遇到以下几种情况:

在上述情况下,HOST 碰撞便成为了一种值得尝试的手段。


七、总结

项目 内容
核心原理 利用服务器配置不当,通过Host头伪装访问内部服务
应用场景 资产探测、隐藏服务访问、绕过IP限制
检测方式 手工Burp测试、自动化脚本
防御建议 设置default_server、删除冗余配置、WAF策略

Host碰撞技术在红队渗透、漏洞挖掘和资产探测中具有极高的实用价值,但也应引起甲方企业的高度重视,防止因配置疏忽导致敏感资产暴露。