原文:https://lightningsecurity.io/blog/host-header-injection/
假设你要在网站中构建密码重置功能。 由于你的网站网址将来可能会更改,因此你想在密码重置电子邮件中动态生成链接以匹配服务器的网址。快速的Google搜索会返回此StackOverflow问题,以获取PHP中的服务器URL。 你将$ _SERVER ['HTTP_HOST']添加到你的代码中。
如果你还没有意识到,这是一个非常糟糕的做法。 Host头由客户端提供,这意味着攻击者可以将自己的网站嵌入密码重置电子邮件中,从而损害任何用户的帐户。 攻击情形如下所示:
1. 攻击者识别目标用户的电子邮件地址。
2.攻击者修改请求的主机标头,以将目标的密码重置为自己的域。
3.目标接收以下电子邮件:

4. 信任该公司,他们单击重置链接。 由于链接是由主机标头构成的,因此它链接到攻击者的网站。 当目标访问此站点时,其密码重置令牌将发送给攻击者。
5. 攻击者现在使用其密码重置令牌重置目标的密码。
不幸的是,这种攻击并非纯粹是理论上的,在过去的几个月中,我在4个漏洞赏金计划中发现了这种攻击。
举个例子 - Mavenlink
一时兴起,我决定遵循他们的公共HackerOne程序,在Mavenlink上测试此漏洞。Mavenlink允许公司注册mavenlink.com的子域来托管其内容,因此有意义的是,他们需要一种动态确定公司子域的方法。我很快注意到,可以将主机标头设置为mavenlink.com的任何子域,这将反映在电子邮件中。 但是,从mavenlink.com更改域将返回错误,并且不会发送电子邮件。起初,这似乎相对安全。 我找不到一种方法来注入我自己的域-当然,我可以添加一个mavenlink.com的随机子域,但是所有这些都重定向到了正确的页面。然后,我开始测试特殊字符。 经过几次尝试后,我成功了:服务器将在标头中接受一个问号,因此我可以在我的域后加上一个问号,以使基本网址为:
Host: example.com?.mavenlink.com
这使我可以从电子邮件中窃取任何用户的密码重置Token:

在https://hackerone.com/reports/281575上查看已披露的报告。
总结
不要信任Host标头来发送密码重置电子邮件。 在任何时候,你可能也不应该将其用于其他任何用途。相反,如果你需要考虑动态网址,则最好将主机存储为服务器端变量。
译者按:
终极奥义,永远不要相信用户输入。手动狗头.jpg
本文迁移自知识星球“火线Zone”