本帖最后由 y0uki11 于 2016-3-6 12:50 编辑
0x01:起因在某网站下载资料,需要帐号。登录的时候竟然报了一个:thinkphp 保存IP字段 too long的一个错误,心想此网站必有漏洞,F5刷新了下,错误没了?! 抱着网站必有洞的想法,测试了下,发现存在任意密码重置漏洞。 0x02:测试站点:xxxx.com 准备工作,注册了两个帐号:
然后就开始找回密码了。
找回A帐号收到连接如:xxxx.com/pass.html?code= 01368edd5f367dcce22dd4d48686932a
抓包看下POST /pass/reset包里只有两个密码字段: 还有cookie里sessid等信息。没有一些敏感信息,然后打开:
B的重置连接:xxxx.com/pass.html?code= 92f1e67cba08f414da5e8cfa65e9aa7a 这里说明:使用的是QQ邮箱,B邮箱是A的英文帐号邮箱(不影响测试,1个QQ两个邮箱地址)
到这里发现个问题: 找回还是A帐号,打开重置连接正常。我再打开B帐号的重置连接,结果显示重置的还是A帐号。也就是说如果后面假设有C,D,E帐号重置密码连接,打开的话显示的还是A,这里隐隐约约感觉有问题。
大概是这样: 不管正常用户与恶意用户进行找回密码,那么第一次的这个邮件收到能打开的话,就能确定是我们自己通过身份验证重置密码,这个无异议。第二次重置的帐号(B)假设为他人的,那么其他人在收到这个链接后打开肯定是重置自己的帐号(B)。但是我这里是这样:
A,B都是我自己的,我如何才能重置B帐号呢??? 发现换个浏览器打开B的连接重置的是B帐号,如果修改sessid打开的又变成重置A了。 然后我就在想啊想:已经可以确定这个sessid很有用啊,如何重置这个第二个帐号呢???sessid啊,sessid,sessid
忽然柳暗花明,想到去年有个聚美优品的漏洞,当初没看懂啥意思,只记得好像也是sessid的问题,结果发现是同一个问题。测试下,成功重置任意帐号的密码,这里也在说下过程:
1. 首先都是在同一浏览器里操作 2. 找回A,登录邮箱打开邮件,但是不要打开重置的连接
3. 然后再找回B(由于是同一个邮箱也会收到B连接,不用管)
4. 打开A的重置连接(注意看连接里code),重置的是B的密码,提交即可
0x03:分析
简单分析下逻辑流程可能会有一些出入,首先说下那个重置的连接:
打开重置密码的连接,服务器首先会判断连接是否存在: 不存在:返回404 存在:正常打开
但是打开后即使把code全删除还正常打开,即使有后续其他帐号的重置连接,打开后找回的帐号还是第一次打开的那个帐号(先判断连接是否存在,再判断sessid, sessid or code)
我们第二次找回时,由于是同一个浏览器这是会把第一个的sessid信息给覆盖掉,所有打开的第一次的连接(A),却显示重置的是第二次(B)的帐号,重置成功而且重置后能注册登录。
0x04:总结
测试重置密码漏洞时,如果发现session有些问题,可以用如上方法测试下
=============================== 思路清晰有条理,文章排版整洁,故通过。
|