利用本地JS生成key值绕过所有验证重置任意账号密码
2019-09-27 15:56:01 Author: mp.weixin.qq.com(查看原文) 阅读量:259 收藏

1、 重置密码页面如下

首先,用自己注册手机号复现一遍重置密码重置过程,记录下每一步的请求包和返回包,在这一步中,发现几个重要的点:

第一、  只要浏览器页面判断已经成功发送手机验证码,就能调用本地js生成key值;

第二、Key值由手机号和短信验证码组合加密而来,但服务器解密后疑似只判断手机号是否正确,因此可输入任意短信验证码实现绕过;

第三、  最后一步重置密码的请求包实际上只包含key值和新密码,请求包如下(该请求包可直接重置密码,不过已经去掉所有网站信息)

POST /system/verifyRetrievePassword-0?redisCode=k值&password=&confirmPassword= HTTP/1.1
Host: xxxx
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0
Accept: application/json, text/plain, */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
tokenId:
Content-Type: application/json;charset=utf-8
Connection: close
Content-Length: 0

2、 输入要重置密码的他人手机号,以及正确的验证码(保证验证码能发送出去,当然,这一步其实也可以绕过)

3、短信验证码输入“000000”(任意验证码均可),点击下一步,可以看到request包中就有一个key值,该key值根据输入不同的短信验证码而有所不同,可以确定是在本地js中由手机号和验证码组合加密而来的,此时保存该key值:

4、 接下来服务器response包会返回“验证码错误”:

5、 由于在此前曾经分析过成功密码重置的每一步过程,可知要写入key值和状态码,于是修改为对应值(上面本地生成的key值):

6、 此时继续前进,就能进入设置新密码页面:

7、 设置新密码1qaz2wsX,可以看到这一步只有key值和新密码:

8、 继续前进,重置成功!

至此已经成功只用手机号,通过任意短信验证码在本地生成的key值,绕过短信验证码机制与服务器校验,实现密码重置。

9、 用新密码成功登陆,手机号与前面吻合:

结束分析与总结:

1、 漏洞成因:服务器不验证短信验证码,只验证手机号(分析key值可知)。

2、 绕过的地方:短信验证码、key值的生成、服务器验证。

3、 后续可以只用key值构造一个request包实现重置密码。

4、 最后的过程其实很简单,但条件是得独立分析一遍成功重置密码过程,否则无法得知一切关于密码重置的过程信息,从而无法伪造绕过。

只供技术学习交流、请勿用于非法行为、否则后果自负。喜欢就点波关注吧!


文章来源: https://mp.weixin.qq.com/s/UHgiCAo0f_1TCOsuMF8FuA
如有侵权请联系:admin#unsafe.sh