SRC挖掘
文集大纲加载中……
小迪安全知识库
-
+
首页
JS逆向签名链到任意登录
JS逆向签名链到任意登录
初探接口:被 Sign 挡住的重放之路 测试登录接口时,首先尝试对「获取验证码」接口进行重放测试。使用 BurpSuite 抓取请求包后,直接重放发现服务端返回错误,无法再次获取验证码。 仔细观察请求头,发现每个请求都携带了一个 `sign` 字段:  直接开始逆向,先看下长度,32位,首先想到MD5加密  尝试关键词搜索sign,sign:,sign= 结果关联文件太多,不适合使用这种方式找;  换个方式,使用启动器分析 Promise.then() 可以看到是异步回调  :为了测试方便,验证码刷新接口有时间限制,换一个接口测试/page  进入末尾,打断点,刷新页面,发现已经生成了sign的值;  进入第一个异步栈v.request,发现这时的head为空,这里可以看出信息是在v里面的函数生成  打开数组v里边存在很多方法,打开第二个方法,发现onrequest,这里可以看出t为请求参数,e()函数加载了t  进入e()方法,找到e.headers.sign生成的方式,现在只要找到这段代码中的未知函数,这就可以生成sign的值; ``` sign=(time = headers['time'], t = md(data), ``` 最终函数的逻辑为:   接着继续找未知函数md(),pd() 先追md()函数   md()函数中包含未知函数gd()和\_d()函数,继续向下,拿到gd()  回到md()函数,继续追\_d()函数  接着找pd()函数,该函数中涉及未知fd()函数  找到fd()函数  进入fd()函数,发现该函数疑似MD5加密;推测是对n=t+e+time的MD5加密‘。  使用在线MD5加密平台验证,控制台获取n=t+e+time的值。 加密结果相同,均为:'02d932d40fabc5db9345f3309fb7d15a   到这里,我们就可以写pd()函数了 ``` function md5(str) { ``` 综上 所有的未知函数都已找到,可以说sign的值已经出来了。 ## 脚本测试 使用js脚本生成时间戳timestamp值和sign值  使用py脚本调用js,修改验证码请求包,两个手机号码同时收到验证码;  测试结果显示:**攻击者手机与受害者手机几乎同时收到了相同的验证码短信**。 这意味着服务端存在严重的逻辑缺陷: * `sign` 校验仅验证了请求合法性(防篡改、防重放),**但并未将验证码与目标手机号在服务端建立强绑定**。 * 或者,验证码在某一时间窗口内对所有手机号生效(全局验证码池)。  到这里就造成了任意用户登录漏洞! 任意用户登录的闭环 攻击者拿到受害者手机收到的验证码后(若配合社工、SIM 交换、或运营商短信劫持等场景),直接在登录接口输入: ``` 手机号:13900139000(受害者) ``` 由于验证码本身合法且在有效期内,服务端校验通过,攻击者成功登录受害者账户,完成**账户接管(Account Takeover)**。
xiaodi
2026年6月1日 16:58
286
0 条评论
转发
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
分享
链接
类型
密码
更新密码
有效期
Markdown文件
Word文件
PDF文档
PDF文档(打印)