if we know some user's email, the we will can reset the user's email by host header attack. 如果我们知道了某个注册用户的邮箱,那么我们就能够通过头注入的方式重置任意用户的密码。所以这个漏洞的攻击前提是在于用户必须要绑定邮箱,且我们知道这个用户的邮箱。
正常的找回密码发送的请求如下:
通过这个图片可以看出来,由于我们是在本地搭建的,所有请求头是localhost。所以我们收到的重置密码的链接如下:
其中这个重置密码连接的Host头就是来自于我们上面找回密码发送请求时的Host头。如果我们修改找回密码时的请求头为我们的恶意Host,那么重置密码的链接也将发生改变。
所以如果一个攻击这修改了请求头为自己的DNS服务器,并且知道某位用户的邮箱,就可以发送一份伪造的重置密码的邮件到用户的邮箱。当用户点击之后,攻击者就可以收到这个请求包括其中的Token,攻击者将其替换为真实的请求头,那么就可以修改掉用户的密码了。
操作步骤如下:
修改重置密码请求的Host头
用户收到的重置密码邮箱如下:
用户点击重置密码的连接
攻击者通过自己的DNS服务器收到如下的信息。
攻击者将其替换为真实的请求头,让访问这个连接就可以修改用户的密码了。
漏洞原因:
造成这个漏洞的原因是在于,在进行邮件请求地址拼接的时候,使用是通过$_M
取的host都信息,而$_M
是通过$_SERVER['HTTP_HOST']
直接获取的HOST头信息,没有进行任何的校验,所以导致攻击者能够能够修改Host头信息,从而进行重置密码的链接的修改。