聊聊密码找回 · Web 安全那些事儿

Web安全爱好者,《PHP WEB安全开发实战》作者

文章正文

WEB安全用户密码找回多案例安全攻防实战

这次文章以wooyun的密码找回代表性漏洞作为案例来讲解,漏洞的描述会通过提交漏洞的原描述加上我的理解一一列出,通过密码找回的过程描述,得出从漏洞的发现到漏洞的分析。

密码找回逻辑测试一般流程,首先尝试正常密码找回流程,选择不同找回方式,记录所有数据包,分析数据包,找到敏感部分,分析后台找回机制所采用的验证手段,修改数据包验证推测

内容主要是逻辑漏洞,技术性质的内容并不多,以发散思维为目标;所以web开发和安全同学都可以来看看

分享内容目录

  1. 用户凭证暴力破解

  2. 返回凭证

  3. 邮箱弱token

  4. 用户凭证有效性

  5. 重新绑定

enter image description here

一、用户凭证暴力破解

四位或者六位的纯数字例子。

微信任意用户密码修改漏洞

漏洞描述

在微信官方的首页上发现了找回密码功能。

img

点击链接之后看到这个功能.来了兴趣。

img

在这个页面输入一个已经注册了微信的手机号。

img

看到了下面的提示信息

img

点击“我已收到验证码”按钮,就跳转到一个修改密码的页面,如下

img

在这一步抓包.得到如下包文

code 区域check=false&phone=18666666666&t=w_password_phone&isemail=0&value=18666666666&method=reset&country=A86&getmethod=web&password=zzzzzz&password2=zzzzzz&verifycode=1234

将包文中的verifycode进行重复提交后,发现会提示下图的信息

img

这样的话.就要想办法去突破.

经过多次尝试后,发现如果在phone=18666666666的号码后面,添加不为数字的字符时,可以绕过这个重复提交的限制.于是我推理出了一个验证逻辑。 如果phone=18666666666的尝试次数大于阀值,则提示请求过于频繁 但在这一步之前没有对phone进行提纯.所以可以将特殊字符带入 但在下一步的时候进行了提纯.只取了phone中的数字部分. 然后在取出此号码的verifycode进行比对. 比对成功则修改密码

img

修改密码成功. 这个地方的薄弱环节在于微信重置密码的验证码为4-5位纯数字. 且数字范围在1000-20000之间 也就是说.我只要尝试19000次.我用50个线程发包.3分钟即可成功修改一个密码.

#### 原因:

虽然设置了请求阀值,但被猜解除了验证方式,并且找到了绕过方式,验证码为4-5位的数字容易爆破

二、返回凭证

天天网任意账户密码重置(二)

描述

之前看到天天网有爆出漏洞的案例,这次我看看还有没有,果然发现了一枚。

和之前的漏洞一样,打开了找回密码页面,按照了正常流程来找回密码,填好邮箱和验证码,点击下一步,然后抓包。

1.jpg

在抓取到的数据包中发现,返回数据中会返回一个加密字符串,这让我有点好奇心起来了,我把它记录下来。

2.jpg

还是按照了正常流程,打开了我的邮箱,看到了一封找回密码的邮件,我点击了里面的链接地址,进入如下的设置新密码的页面。

3.jpg

这个时候,我把之前记录到的可疑字符串和URL做了一下对比,发现之前的字符串就是当前页面URL最后的部分,竟然是同一个!那我推测,天天网的这个找回密码设计是有问题的,那个邮箱验证码就可以直接绕过了。

设置新密码的的URL为 http://login.tiantian.com/new/modify_password/加密字符串/

为了要验证我的猜测,我在这里用天天网客服 service@tiantian.com 做了一次测试。还是用上面的正常找回密码流程,然后抓包获取到加密字符串,然后组合到上面的设置新密码的url中,就成功重置了这个客服账号的密码了。给大家截个图看看。

4.jpg

原因

找回密码问题的答案在页面源码中可以看到。

三、邮箱弱token

奇虎360任意用户密码修改漏洞

描述

360是一个大厂,又是做安全业务的,很好奇它的网站安全性怎么样?

好奇的我做了一个测试,我首先按照正常流程走一次找回密码,打开邮箱,查看给我来的邮件内容:

360个人中心找回密码(重要)!

重设密码地址: http://i.360.cn/findpwd/setpwdfromemail?vc=c4ce4dd3d566ef83f9xxxxxxx&u=xxxx@gmail.com, 马上重设密码! 如果您没有进行过找回密码的操作,请不要点击上述链接,并删除此邮件。

参数vc可以看出是一串32位字符的md5,通过cmd5.com网站解密后发现是个数字,类似1339744000,第一反应猜测是个用户id。我脑袋里马上出来了一个思路,遍历id并且修改u变量是不是可以修改任意用户密码呢?试了一下不可以。 再仔细看了看这个数字,感觉比一般的用户ID大,反复看了几次,突然发现怎么像是个时间戳?

通过时间戳格式化发现,还真是一个时间戳! 再次大胆的猜测了一下这里的流程,用户取回密码时,会产生一个精确的时间戳,和帐号绑定,记录在某个密码重置库内。

修改这个用户密码必须要知道绑定的时间戳才可以,从表面的逻辑来看,好像没问题。不过开发同学忽略了一个细节,什么细节呢?如果这个时间戳是新生成的,我在一定得时间段内进行暴力猜解,很快就可以获取到这个有效得链接。 写了个利用工具测试一下。

img

打开之后果然验证了我的猜测。

img

修改密码成功后,后跳到了登陆页面,用刚刚修改得密码登陆后看到了个人资料页面。

img

原因

使用了特定值的加密作为token,被猜解到使用了时间戳的MD5值。在实际过程中我们也可以尝试用户名,手机,邮箱,等等的不同加密方式。

四、用户凭证有效性

短信验证码例子。

OPPO手机重置任意账户密码(3)

描述

oppo在wooyun上暴露了好几次,这次我也来试试。

先逛逛网站,发现主站的帐号跟nearme开发者社区的帐号是通用的,所以如果只要重置了nearme社区帐号主站帐号也被修改。问题出现在www.nearme.com.cn

依然按照正常找回密码流程来,首先我用自己的手机号186****8188找回密码,点击获取一下验证码,于是这时我手机收到了一个4位的数字验证码。

b1.jpg

然后到这步暂停,我不去使用验证码重置。

接下来我要做安全测试了,用18688888888这个帐号进行测试。

我们点击登录处的忘记密码,输入要找回的帐号18688888888。

q5.jpg

选择通过手机号码找回密码。

q6.jpg

关键的地方在3.身份认证这一步,我把18688888888替换成我自己的手机号186****8188 输入刚才自己手机获取到的验证码:0198,直接确认下一步。

c2.jpg

提交成功,输入新密码:oppoceshi1。

c3.jpg

确认一下,重置成功。

c4.jpg

那么我们接下来就是要用18688888888:oppoceshi1。

登录一下,测试是否成功以我自己的手机号跟验证码修改了此账户的密码。

c5.jpg

登陆成功

c6.jpg

也就是说我已经成功用自己的手机号186****8188重置了18688888888的账户密码。

原因

只验证了验证码的有效性,却没有对验证码和手机号码做绑定验证。

五、重新绑定

手机绑定例子。

网易邮箱可直接修改其他用户密码

描述

这次我们看一个126邮箱的找回密码漏洞,这个还真和上面的方式有点不一样。

我先来注册一个126邮箱测试帐号。

img

点击“立即注册” ,后会跳转到一个手机绑定得安全提示页面来。

img

注意看下这个链接的参数,有个uid,把uid修改成想要黑掉的网易邮箱帐户的uid。

img

填入一个自己的手机号码,再把验证码发回来。

img

img

img

那我们点击确定并进入邮箱,这个时候这个目标网易邮箱已经被越权绑定了密保手机。

现在我们要改密码就比较简单了,走正常的密码取回流程,发现这个邮箱多了一个通过手机的取回方式,这个手机尾号就是我刚刚绑定的手机!

img

img

img

img

img

密码重置成功!!

存在权限判断不当,越权操作的接口是:

http://security.mail.126.com/mobileserv/mbp.do?uid=xxxx&backurl=http://xxx.xx.xx/x

原因:

注册过程的绑定手机页面用过参数修改,将任意账号绑定至可控手机,再来通过密码找回流程找回

最后

通过这篇文章相信你对于密码找回已经有一定的了解,我们发现上面的密码找回思路基本都是通过逻辑推理加技术验证来实现。这种类似的方法还有很多,希望这篇文章对大家的思维能有一点点帮助。


本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。

2017年8月8日,周二晚8点30分,曾负责乌云众测的研发工作,P2P平台网利宝的研发及安全建设工作,中国婚博会PHP高级工程师,慕课网WEB安全领域高级课讲师汤青松带来了主题为《WEB安全:聊聊“密码找回”》的交流。以下是主持人beta整理的问题精华,记录了作者和读者间问答的精彩片段。 * * * 内容摘要: * 密码找回怎么去利用到实战中,怎么去培养这样的思维? * 如果是腾讯qq这种需要验证手机才能登录的账号,怎么办? * 通过撞库获取的账号密码是怎么一回事? * 像淘宝,找回密码时有个提示检测你是否处在安全环境,想了解一下这个后面的逻辑是怎样的? * 密码找回,你认为比较合理或者相对安全的实现思路是什么? * 你在破解过程中运用到的技术倒不是很多,能够给出一套安全的找回密码或更换手机的逻辑流程吗?另外,现在账号这么多,不知道你对单点登录怎么看,怎样对用户体验又好又安全? * 除了这种逻辑漏洞,其它可能造成用户账户不安全的有哪些?除了自我检查验证外有什么其它手段来验证自己接口的安全? * 遇到漏洞问题,请问这种情况下用户该怎么防范?我们平时设计的时候需要注意哪些点? * 以前完整的做过用户的功能开发,比较市面上的一些大公司的做法极其复杂,比如不能用以前用过的密码,好友验证帮助找回等,这背后需要复杂的数据结构来支撑。大小项目应该怎么把握用户帐户安全在开发层面的复杂程度? * 找回密码这个功能要安全,有什么方法不被破解有代码分享或者文章也行? * 如果想让找回密码页面不存在任意密码找回这个逻辑漏洞,如果你去设计怎样设计才能保证最大的安全? * 公众号对接的web APP怎么实现记住密码?下次免登陆吗? * * * **问:密码找回怎么去利用到实战中,怎么去培养这样的思维?** **答:**多看相关的案例,多去实战,这次的文章就是以真实的案列写出来的,你可以完全依葫芦画瓢,去其他网站做一些尝试,在尝试的过程多加思考。多看多做多想这样思维一定会有提升。 * * * **问:如果是腾讯qq这种需要验证手机才能登录的账号,怎么办?** **答:**首先想说的是,找回密码和登录有手机验证并没有直接到关联关系。文章中的微信就是一个很好的案例。如果“需要手机验证才能登录”是代表系统安全性高,怎么去找相关漏洞的话。其实和平时找漏洞的方法也是一样。一看二转三实践,首先是做好准备,做好相关的信息收集, 再者通过收集到的信息去思考,盘点出实现的思路出来,最后就是实践。 * * * **问:通过撞库获取的账号密码是怎么一回事?** **答:**撞库这个词,其实现在已经有很多的解释。 就是黑客收集了一批已经泄露懂账号密码,然后找到某一个平台,写个脚本,去挨个尝试是不是能登陆? 很多人都喜欢用同一套账号登录各个网站。才会出现这样的情况。 * * * **问:像淘宝,找回密码时有个提示检测你是否处在安全环境,想了解一下这个后面的逻辑是怎样的?** **答:**这个每个平台的处理方案不同,并没有一个标准答案。我说说我现在能想得到的一些方式。 判断这个用户之前是否在这个设备登录,判断这个设备是否经常更换用户登录,用户所处IP地址是否常用,所用IP是否在IP黑名单中,该用户最近有没有异常状态(如私信、发帖、涉黄赌毒)。 * * * **问:密码找回,你认为比较合理或者相对安全的实现思路是什么?** **答:**其实清楚了黑客是怎么攻击的,脑袋里自然而然就有了对应防范方案,但是黑客永远是走在前面的,所以多看漏洞案例、安全资讯是很重要的。所以最好的思路就是了解对方入侵的方法。 * * * **问:你在破解过程中运用到的技术倒不是很多,能够给出一套安全的找回密码或更换手机的逻辑流程吗?另外,现在账号这么多,不知道你对单点登录怎么看,怎样对用户体验又好又安全?** **答:**并没有什么标准安全的流程,都是结合自己的业务需要来做的。现在大型的系统越来越多,单点登录对于用户来说确实是非常方便,不用再多次登录。不过效率通常和安全有着对立性,很多系统因为设计不当,会造成一些信息泄露,在做单点登录严格控制越权问题,越复杂的系统在安全上要花费的心思越多。 * * * **问:除了这种逻辑漏洞,其它可能造成用户账户不安全的有哪些?除了自我检查验证外有什么其它手段来验证自己接口的安全?** **答:**我通常把web漏洞分为两类,一类是常规漏洞,另外一类就是逻辑漏洞,常规漏洞常见的有 SQL注入、XSS、代码注入、CSRF跨站请求伪造、SSRF服务器请求伪造、文件上传等等,常规漏洞如果对安全业务不是太熟悉,可以用一些扫描器去扫描,比如比较出名的扫描器 burp suite 、sqlmap 等等这些。 * * * **问:遇到漏洞问题,请问这种情况下用户该怎么防范?我们平时设计的时候需要注意哪些点?** **答:**你提到的情况如果是指文章中的漏洞的话,对于用户来说真的很是无奈。我们在平时设计密码找回的时候除了要避免上面的5个坑外,另外还需要注意一些session覆盖,注册覆盖,本地验证等等问题,这些在乌云中也是都有相关的案例。具体可以根据名词百度搜索一下。 * * * **问:以前完整的做过用户的功能开发,比较市面上的一些大公司的做法极其复杂,比如不能用以前用过的密码,好友验证帮助找回等,这背后需要复杂的数据结构来支撑。大小项目应该怎么把握用户帐户安全在开发层面的复杂程度?** **答:**找回密码的复杂度,主要根据业务类型、账号重要性、网络关注度、业务规模等等几个方面来确定,比如金融类型会更加重视资金安全,用户大多数会绑定银行卡做实名制,可以根据银行卡预留的手机号码,来找回密码;再比如微信是做社交的,它可以让用户邀请好友辅助来做验证;再一个就是账号的价值了,价值越高通常黑客会越关注,这样的业务类型找回密码可以相对复杂一些。所以设置复杂度可以参考上面的几项。 * * * **问:找回密码这个功能要安全,有什么方法不被破解有代码分享或者文章也行?** **答:**安全都是相对的,没有什么是绝对不会被破解的。每个业务系统都不一样,所以代码也是不一样的,不过思路倒是都差不多,文章的话网上有非常相关介绍,可以自己百度下。 * * * **问:如果想让找回密码页面不存在任意密码找回这个逻辑漏洞,如果你去设计怎样设计才能保证最大的安全?** **答:**首先明确不存在绝对不会被破解,最大限度的设计才是我们的目标,那我们可以结合文章中的五个漏洞案例,短信验证码长度、凭证可预测、敏感信息返回、验证的有效性、重新绑定这几个地方做一些思考。当然最终是需要结合到你的系统当中去设计。 * * * **问:公众号对接的web APP怎么实现记住密码?下次免登陆吗?** **答:**公众号接触不是太多,所以这个问题不太好回答。 我说一下常规的APP保持登录,常规APP保持登录一般会自己实现一套雷士session和cookie的机制出来,在APP端保持一个token,每次请求会带上这个token去验证。不知道这个回答对你有没有帮助。 * * * 本文首发于GitChat,未经授权不得转载,转载需与GitChat联系。 * * * 在此感谢[异步社区](http://www.epubit.com.cn)为本次活动提供的赠书《TensorFlow技术解析与实战》。 [异步社区](http://www.epubit.com.cn)是人民邮电出版社旗下IT专业图书旗舰社区,也是国内领先的IT专业图书社区,致力于优质学习内容的出版和分享,实现了纸书电子书的同步上架。 ![enter image description here](http://images.gitbook.cn/5657a440-7c58-11e7-bdff-cd1780db9d6f)
内容互动
写评论
加载更多
评论文章
× 订阅 Java 精选频道
¥ 元/月
订阅即可免费阅读所有精选内容