最近在渗透过程中,多次碰到请求数据加密或者加签名的情况,说实话碰到这种就有点怯战,为了彻底解决这个问题,学习了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:
先把g5函数拿下来,放到sign.js中
然后使用python中的execjs库调用g5函数
运行python脚本直接报错:
可以明显看到g5函数中是靠IQ()函数来产生签名的,因此还要找IQ()函数,于是直接在g5函数所在的js文件中搜索 IQ( 和 IQ = (这是两种定义函数可能的方法),成功找到了定义IQ函数的地方:
把这段代码接着补充到sign.js文件中,运行python代码又报错了,这回是没有TQ函数:
同样的搜索 TQ = 和 TQ( ,成功找到:
接着把这段代码添加到sign.js中,运行python代码,成功生成sign值
拿着生成的sign去进行验证,发现确实有效,注意请求包中的ver、mt的值要和python脚本中的一致:
至此,sign签名的生成已成功逆向。
如果你是一个长期主义者,欢迎加入我的知识星球,我们一起往前走,每日都会更新,精细化运营,微信识别二维码付费即可加入,如不满意,72 小时内可在 App 内无条件自助退款
前面有同学问我有没优惠券,这里发放100张100元的优惠券,用完今年不再发放
回复jspy获取相关代码
原文:https://xz.aliyun.com/t/14290
如有侵权请联系号主删文