测试 Host 标头注入
ID |
---|
WSTG-INPV-17 |
总结
Web 服务器通常在同一 IP 地址上托管多个 Web 应用程序,通过虚拟主机引用每个应用程序。在传入的 HTTP 请求中,Web 服务器通常根据 Host 标头中提供的值将请求分派到目标虚拟主机。如果不正确验证标头值,攻击者可以提供无效的输入,从而导致 Web 服务器:
- 将请求分派到列表中的第一个虚拟主机。
- 执行重定向到攻击者控制的域。
- 执行 Web 缓存中毒。
- 操作密码重置功能。
- 允许访问不打算从外部访问的虚拟主机。
测试目标
- 评估 Host 标头是否在应用程序中动态解析。
- 绕过依赖于标头的安全控制。
如何测试
初始测试非常简单,只需在 Host 标头字段中提供另一个域(即attacker.com
)。Web 服务器处理标头值的方式决定了影响。当 Web 服务器处理输入以将请求发送到驻留在所提供域中的攻击者控制的主机,而不是驻留在 Web 服务器上的内部虚拟主机时,攻击是有效的。
GET / HTTP/1.1
Host: www.attacker.com
[...]
在最简单的情况下,这可能会导致 302 重定向到提供的域。
HTTP/1.1 302 Found
[...]
Location: http://www.attacker.com/login.php
或者,Web 服务器可以将请求发送到列表中的第一个虚拟主机。
X-Forwarded Host Header Bypass(X 转发的主机标头绕过)
如果通过检查通过主机头注入的无效输入来减轻主机头注入,则可以将值提供给X-Forwarded-Host
标头
GET / HTTP/1.1
Host: www.example.com
X-Forwarded-Host: www.attacker.com
[...]
可能会产生客户端输出,例如:
[...]
<link src="http://www.attacker.com/link" />
[...]
同样,这取决于 Web 服务器如何处理 Headers 值。
Web 缓存中毒
使用此技术,攻击者可以操纵 Web 缓存,向请求它的任何人提供有毒内容。这依赖于对应用程序本身、CDN 或其他下游提供商运行的缓存代理进行毒害的能力。因此,受害者在请求易受攻击的应用程序时将无法控制接收恶意内容。
GET / HTTP/1.1
Host: www.attacker.com
[...]
当受害者访问易受攻击的应用程序时,将从 Web 缓存中提供以下内容。
[...]
<link src="http://www.attacker.com/link" />
[...]
密码重置中毒
在创建使用生成的密钥令牌的密码重置链接时,密码重置功能通常会包含 Host 标头值。如果应用程序处理攻击者控制的域以创建密码重置链接,受害者可能会单击电子邮件中的链接并允许攻击者获取重置令牌,从而重置受害者的密码。
下面的示例显示了一个密码重置链接,该链接在PHP中使用$_SERVER['HTTP_HOST']
的值进行设置,该值是根据HTTP主机头的内容设置的:
$reset_url = "https://" . $_SERVER['HTTP_HOST'] . "/reset.php?token=" .$token;
send_reset_email($email,$rset_url);
通过向密码重置页面发出 HTTP 请求(使用篡改的 Host 标头),我们可以修改 URL 指向的位置:
POST /request_password_reset.php HTTP/1.1
Host: www.attacker.com
[...]
email=user@example.org
然后,指定的域 (www.attacker.com
) 将用于 reset 链接,该链接将通过电子邮件发送给用户。当用户点击此链接时,攻击者可以窃取令牌并破坏他们的帐户。
... Email snippet ...
Click on the following link to reset your password:
https://www.attacker.com/reset.php?token=12345
... Email snippet ...
访问私有虚拟主机
在某些情况下,服务器可能具有不打算从外部访问的虚拟主机。这在水平分割 DNS 设置(内部和外部 DNS 服务器为同一域返回不同的记录)中最为常见。
例如,一个组织可能在其内部网络上只有一个Web 服务器,该服务器托管着他们的公共网站(在 www.example.org
)和内部Intranet(在 intranet.example.org
,但该记录仅存在干内部 DNS服务器上)。虽然不可能在网络外部直接浏览到 intranet.example.org
(因为该域无法解析),但可以通过以下 Host
标头从外部请求访问Intranet:
Host: intranet.example.org
这也可以通过将intranet.example.org
条目添加到您的主机文件中,其公共IP地址为 www.example.org
,或者在您的测试工具中覆盖DNS解析来实现。