js逆向实战练习一:sign签名破解
simplehe 发表于 湖北 渗透测试 4007浏览 · 2024-04-13 12:35

简介

最近在渗透过程中,多次碰到请求数据加密或者加签名的情况,说实话碰到这种就有点怯战,为了彻底解决这个问题,学习了js逆向相关的知识,找了个有签名的网站进行实战。
是一个这样的功能点:根据输入的用户名获取手机号,请求包如下:


可以看到总共有4个参数:ver、mt、username和sign,当我改变ver、mt、username三个中的任意一个值时,服务器都会返回签名错误,初步判断sign是由这三个值共同生成的。

寻找生成签名代码

可以看到api接口是/api/member/getMobile,首先尝试添加XHR断点:

点击获取手机号,成功截断,但是发现这时候sign值已经生成了,行不通:

只能换一种方法,找到请求的数据包,查看这个请求调用的堆栈,发现了一个比较可疑地:LoginForm,登录表单的意思

于是点击查看对应的js,找到了类似签名的地方:

直接在sign: M({ 处添加断点,点击获取手机号,果然在这里截断,使用“单步调试”跟进,跳转到function g5(e)处,并且传过来e的值就是我们输入的用户名

使用“跳过下一个函数调用”跟进,很快便发现经过IQ(o)函数后,产生了一个类似sign的值,基本上确认产生签名的代码就在这里,于是在o = IQ(o).toString()处添加一个断点,但是并没有看到mt和ver参数。

于是继续调试,发现跳转到了一开始的地方:

继续使用“跳过下一个函数调用”跟进,发现又跳转到了function g5(e)处,并且e的值包括用户名、mt以及ver,这样一来就确认了产生签名的函数。

进一步调试验证,发现这里生成的sign就是最后请求使用的sign:

扣JS代码

先把g5函数拿下来,放到sign.js中

然后使用python中的execjs库调用g5函数

运行python脚本直接报错:

可以明显看到g5函数中是靠IQ()函数来产生签名的,因此还要找IQ()函数,于是直接在g5函数所在的js文件中搜索 IQ( 和 IQ = (这是两种定义函数可能的方法),成功找到了定义IQ函数的地方:

把这段代码接着补充到sign.js文件中,运行python代码又报错了,这回是没有TQ函数:

同样的搜索 TQ = 和 TQ( ,成功找到:

成功破解sign签名

接着把这段代码添加到sign.js中,运行python代码,成功生成sign值

拿着生成的sign去进行验证,发现确实有效,注意请求包中的ver、mt的值要和python脚本中的一致:

至此,sign签名的生成已成功逆向。

小结

总结一点就是找签名函数,多耐心调试,扣js代码,少了什么补什么。

附件:
  • js代码以及python代码.zip 下载
1 条评论
某人
表情
可输入 255