|
一、先总结一下攻击方式: 在重设忘记密码的HTTP请求中,攻击者可以透过修改header中的Host或 X-Forwarded-Host字段为自己设定的domain,使得网站送email给受害者的重设密码链接为自己的自制URL。 透过这手法,攻击者也就可以透过官方核发的email,欺骗收信者点击URL而外泄重设密码token或是导向恶意网站。
二、拿对岸的网站以方便实作: 1.至重设密码网页,输入存在的email,并且按下送出
2.抓包后,修改Host为www.baidu.com
3.收到信后,发现连结确实被成功修改
三、说明:
1. 研究源码时,想到密码重设链接制作过程中,因为使用者email收信时与送出的网站没有关联,如果domain不写成hard code,势必要有方式取得重设密码链接的domain,也就使得很多网站开发者误用客户端可以控制的$_SERVER['HTTP_HOST']。
因此攻击者只要在重设密码链接时,修改Host header就可以成功修改email的连结。
2. 虽说近年来,工程师资安意识抬头应该会避免使用$_SERVER['HTTP_HOST'],而使用$_SERVER['SERVER_NAME'],但是在测试的网站中,却依然常常看见,让我百思不解。 3. 继续追查下去,发现在apache 2以上,预设$_SERVER_NAME竟然会取自$_HTTP_HOST ?!,如同国外文章https://bz.apache.org/bugzilla/show_bug.cgi?id=49347 ,经过自己架设实作环境后,验证确实如此,也就不难说明为什么这漏洞依然存在许多网站。
(1)自行撰写一个网页http://hha.com.tw/hostheader.php进行测试
(2)送出http://hha.com.tw/hostheader.php并且修改hostheader为evil.com.tw,发现网站确实依然会使用hostheader的信息! (Apache2.2.21)
4.经过实测其他网站后,最后结论发现只要是Nginx和Apache网站,几乎都可以透过Host或是 X-Forwarded-Host而成功修改连结,或许是与各种webserver预设设定有相关
|