虚拟主机 (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)时非常有用。
-
OJ/gobuster - 用 Go 编写的目录/文件、DNS 及虚拟主机爆破工具。
方法论 (Methodology)
当 Web 服务器在同一个 IP 地址上托管多个网站时,它会使用 虚拟托管 (Virtual Hosting) 技术来决定在收到请求时提供哪个站点。
在 HTTP/1.1 及更高版本中,每个请求都必须包含 Host 标头:
该标头告知服务器客户端尝试访问的具体域名。
- 如果服务器仅托管一个站点:
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 的内容:
带有修改后主机名 ("site-b.com") 的请求则会返回站点 B 的内容(这可能会揭示一些新信息):
虚拟主机指纹识别 (Fingerprinting VHOSTs)
将 Host 标头设置为其他已知或猜测的域名,可能会得到 不同的响应。
判断成功命中不同虚拟主机的常见迹象:
- 不同的 HTML 标题 (Title)、Meta 描述或品牌名称。
- 不同的 HTTP
Content-Length(响应体大小)。 - 不同的 HTTP 状态码 (如 200 vs 403 或重定向)。
- 自定义的错误页面。
- 指向完全不同域名的重定向链。
- 证书中的“使用者备用名称” (Subject Alternative Names) 列出了其他域名。
注意:利用 DNS 历史记录来识别以前曾与目标域名关联过的旧 IP 地址。然后针对这些 IP 地址“喷洒” (Spray) 当前的域名。如果成功,这将揭示服务器的真实地址,从而通过直接与源站交互来绕过 Cloudflare 或其他 WAF 防护。