跳转至

虚拟主机 (Virtual Host)

虚拟主机 (Virtual Host, VHOST) 是 Web 服务器(如 Apache、Nginx、IIS)在同一个 IP 地址上托管多个域名或子域名的一种机制。在枚举 Web 服务器时,默认请求往往仅针对主要或默认的虚拟主机。隐藏的虚拟主机可能会暴露额外的功能或漏洞。

摘要 (Summary)

相关工具 (Tools)

  • wdahlenburg/VhostFinder - 通过相似度比较识别虚拟主机。
  • codingo/VHostScan - 一款可配合内网穿透工具使用的虚拟主机扫描器,支持检测通配型 (Catch-all) 场景、别名及动态默认页面。
  • hakluke/hakoriginfinder - 发现反向代理背后的原始主机 (Origin Host) 的工具。在绕过云 WAF(如 Cloudflare)时非常有用。

    prips 93.184.216.0/24 | hakoriginfinder -h https://example.com:443/foo
    
  • OJ/gobuster - 用 Go 编写的目录/文件、DNS 及虚拟主机爆破工具。

    gobuster vhost -u https://example.com -w /path/to/wordlist.txt
    

方法论 (Methodology)

当 Web 服务器在同一个 IP 地址上托管多个网站时,它会使用 虚拟托管 (Virtual Hosting) 技术来决定在收到请求时提供哪个站点。

在 HTTP/1.1 及更高版本中,每个请求都必须包含 Host 标头:

GET / HTTP/1.1
Host: example.com

该标头告知服务器客户端尝试访问的具体域名。

  • 如果服务器仅托管一个站点Host 标头通常会被忽略或设为默认值。
  • 如果服务器托管多个虚拟主机:Web 服务器使用 Host 标头将请求在内部路由到正确的内容。

假设服务器配置如下:

<VirtualHost *:80>
    ServerName site-a.com
    DocumentRoot /var/www/a
</VirtualHost>

<VirtualHost *:80>
    ServerName site-b.com
    DocumentRoot /var/www/b
</VirtualHost>

带有默认主机名 ("site-a.com") 的请求会返回站点 A 的内容:

GET / HTTP/1.1
Host: site-a.com

带有修改后主机名 ("site-b.com") 的请求则会返回站点 B 的内容(这可能会揭示一些新信息):

GET / HTTP/1.1
Host: site-b.com

虚拟主机指纹识别 (Fingerprinting VHOSTs)

Host 标头设置为其他已知或猜测的域名,可能会得到 不同的响应

curl -H "Host: admin.example.com" http://10.10.10.10/

判断成功命中不同虚拟主机的常见迹象:

  • 不同的 HTML 标题 (Title)、Meta 描述或品牌名称。
  • 不同的 HTTP Content-Length (响应体大小)。
  • 不同的 HTTP 状态码 (如 200 vs 403 或重定向)。
  • 自定义的错误页面。
  • 指向完全不同域名的重定向链。
  • 证书中的“使用者备用名称” (Subject Alternative Names) 列出了其他域名。

注意:利用 DNS 历史记录来识别以前曾与目标域名关联过的旧 IP 地址。然后针对这些 IP 地址“喷洒” (Spray) 当前的域名。如果成功,这将揭示服务器的真实地址,从而通过直接与源站交互来绕过 Cloudflare 或其他 WAF 防护。

参考资料 (References)