虾米网的一个可以随意修改其他用户密码的高危漏洞

2011年1月4日 由 翻墙砖家 留言 »

我现在很喜欢在虾米网上听歌(只可惜在线试听的只是96kbps的,真小气),还喜欢让浏览器记住密码,然后每次就不用自己输入用户名密码了,很方便,方便到我会忘记密码 :-( 。于是有一天,我清理了浏览器 cookies,结果当登陆的时候就悲剧了,密码忘了。。。还好虾米网有重置密码的功能,前提是你还没忘记注册邮箱地址。

于是很自然的,我就去重置密码了。当我收到虾米网发到我邮箱的重置密码链接的时候,我震惊了 :-) ,虾米网发给我的信息是这样的:

Hi,翻墙砖家
请点击下面的链接重新设置你的虾米密码:

http://www.xiami.com/member/resetpassword?reset_id=72037

注意:此地址只在一星期内生效!

点击链接进去后不需要其他任何信息就可以修改密码。我马上意识到这里面可能潜在一个严重的bug,为了验证我的想法,我马上又到虾米网连续做了两次找回密码操作,虾米网发给我的两条信息是这样的:

Hi,翻墙砖家
请点击下面的链接重新设置你的虾米密码:

http://www.xiami.com/member/resetpassword?reset_id=72040

注意:此地址只在一星期内生效!

Hi,翻墙砖家
请点击下面的链接重新设置你的虾米密码:

http://www.xiami.com/member/resetpassword?reset_id=72042

注意:此地址只在一星期内生效!

这验证了我的想法:

虾米网在重置密码表中使用一个自増列来生成/保存 reset_id,而且重置密码的时候没有做其他任何安全检查

这直接导致了一个非常严重的漏洞:只要我知道某一个用户的注册邮箱(坑蒙拐骗+威逼利诱…不会太难得到的),我就可以用他(或她,或者它?)的注册邮箱来进行找回密码操作,虾米网会给这个邮箱发送一个重置密码链接,上面的 reset_id 是什么我们不知道,但是可以根据虾米网当前的 reset_id 的值猜测出这个这重置密码链接上的 reset_id 所在范围。

比如,我先用自己的邮箱进行一次密码找回操作,得到虾米网发送的 reset_id(我们暂称这个 reset_id 为 id1),然后马上在使用目标用户的邮箱进行一次密码找回操作,虾米网也会发送一个 reset_id 给目标用户的邮箱(我们称这个 reset_id 为 id2),那么,这两次密码找回操作中虾米网生成的 reset_id 不会相差太远(如果在凌晨等用户不活跃的时刻进行,那么很可能 id2 = id1 + 1 ),明白了吧?

根据猜测到的 reset_id,自己构造一个重置密码链接,用浏览器打开,嘿嘿,就可以直接修改目标用户的密码啦!

经朋友同意,我在我朋友的帐号上进行了测试并获得成功,我只知道他的注册邮箱,就成功的修改了他的帐号密码。

PS:

  • 在用户活跃高峰期,可能两次生成的 reset_id 相差会比较大,这时候可以适当的加大猜测范围,多试几次就可以了,就是会误伤到某个也在找回密码的未知用户,人家的密码莫名其妙的就被你改掉了 :-)
  • 此漏洞在本文章发表之前,我已经通知虾米网,虾米网也已经修复这个 bug。现在虾米网的找回密码链接是这样的:

    http://www.xiami.com/member/resetpassword?reset_id=f/dEEGCE4jo1O******

    貌似没什么大问题了。

  • 虾米网还真是小气,这么大一个 bug,居然就给我留个言说“感谢您提交的bug”,连个感谢信都没 :-( 要是哥缺德一点儿直接公布出去了,哼哼~~~~

例行公事:原创文章,转载请保留原文链接。

广告位

7 条评论

  1. Firm 说道:

    虾米网起码要奖励个几千元才够意思来着。。

  2. neoremind 说道:

    原来的机制确实很糟糕 虾米一封感谢信比较吝啬了 起码应该奖励下载虾米币好几百啊

  3. lovelucy 说道:

    现在这个解决方式貌似也有问题,如果仅仅是用base64或者MD5把id做了一下转换,逆向后仍旧可以获取重设密码地址

发表评论