Most of web application security vulnerabilities, leverage user input in ways that were not initially intended 通过 their developer(s). 密码重置中毒 is one such vulnerability, that leverages commonly unthought of headers, such as the Host header seen in an HTTP request:

GET //example.com/[email protected] HTTP/1.1
Host: evilhost.com

注意我们在URL中指定主机的区别( example.com )和另一个恶意主机(位于主机标头(evilhost.com )。

示例–密码重置

在大多数Web应用程序中,一项常见功能是能够重置密码。要求这样做有时可能涉及向您的收件箱发送一封电子邮件,该邮件的URL嵌入特殊的一次性令牌中以供单击。一次性令牌在那里允许用户设置新密码而不必指定旧的(当前)密码。

构建该URL的一部分是确定域应该是什么,在PHP中看起来可能类似于:

$resetPasswordURL = “//{$_SERVER[‘HTTP_HOST’]}/reset-password.php?token=12345678-1234-1234-1234-12345678901”;

This is then injected into an email template and sent to the user as expected. From the Developer’s perspective, he is always expecting $_SERVER[“HTTP_HOST”] to be  example.com  因此很少会对输入执行任何其他的完整性检查。

针对性攻击

作为恶意行为者,您想控制特定个人的帐户。通过利用密码重置中毒,您可以:

    1. 获取网站上使用的目标电子邮件地址。
      有时,这是通过以下方式完成的:a)社会工程学攻击(网络钓鱼,网络钓鱼等)
      b)OSINT(开源情报)
      c)挖掘旧数据泄露行为以获取用户信息。
    2. 代表第一步中定义的目标发送密码重置请求,并带有修改后的Host标头,如下所示:
      POST //example.com/reset.php HTTP/1.1
      Accept: */*
      Content-Type: application/json
      Host: evilhost.com
      
      {“email”: “target@company.com”}

      如果我们回头看前面的代码,它将对重置密码URL进行字符串内插(例如):

      //evilhost.com/reset-password.php?token=12345678-1234-1234-1234-12345678901

    3. 等待目标接收到如下操作的电子邮件:密码重置中毒这些电子邮件对用户而言似乎完全安全,尤其是如果链接隐藏在某些按钮或图像后面时。主要是由于该电子邮件实际上是由正确的应用程序而非恶意主机发送的事实。
    4. 单击链接后,将提取受害者的密码重置令牌。在这一点上,通过克隆站点以使其看起来好像用户正在访问正确的站点,攻击可以更进一步。通常通过以下两种方式之一完成此操作:
      a)攻击者克隆了应用程序的一部分(例如登录页面),并在用户单击链接后将其呈现给用户。
      b)攻击者的网站(evilhost.com)充当实际网站的代理,从而使行为和内容与原始网站相同,从而使所有内容对最终用户而言都是无缝的。这是最令人信服的方法。

整治

From a development perspective, do not trust the Host header, or any input header for that matter. Instead, the application’s base URL should be determined 通过 some configuration depending on the environment. A good example is a config.ini file such as:

[GLOBAL]
DB_URL=mysql://
DB_USER=root
DB_PASS=toor

[APPLICATION]
BASE_URL=  example.com  

This can then be string interpolated safely as a constant in the previous code. Assume there is some utility function get_config(section, entry):

$resetPasswordURL = “//” . get_config(‘APPLICATION’, ‘BASE_URL’) . ”/reset-password.php?token=12345678-1234-1234-1234-12345678901”;

此外,作为应用程序开发人员,您应该支持并高度鼓励多因素身份验证,以避免恶意行为者仅使用密码重置令牌来劫持帐户。理想情况下还避免使用2FA方法,例如 短信认证.

结论

密码重置中毒是那些看起来很琐碎,非常实用的攻击之一,而不是理论上的攻击,通常被用作低下的成果。  错误赏金计划.

就是说,它们非常容易受到保护,并易于说明为什么您应该始终谨慎对待任何可能的用户输入形式。当开发人员利用 Web应用程序安全扫描程序 自动检测此类漏洞。 Acunetix 不仅会测试主机头是否有密码重置中毒,还将测试其他 主机头攻击 帮助您完全保护您的Web应用程序。

 

 

Source://www.acunetix.com/blog/