本文仅供学习参考,如有侵权可私信本人删除,请勿用于其他途径,违者后果自负! 如果觉得文章对你有所帮助,可以给博主点击关注和收藏哦!
网站
aHR0cHM6Ly9jcmVkaXQuaGQuZ292LmNuL3h5eHhncy8=
接口分析
打开网站选择【行政处罚】,通过Fetch/XHR
过滤即可发现数据包。
请求
响应
通过接口能够看出使用了 sign
加密类型为SM2
。那么signType
加密类型对应的可能是另一个参数或响应体。
简单的分析下来明确了接下来的方向,即请求和响应的双重加密。
参数分析
-
nonceStr -
queryContent -
sign
需要分析的有这三个参数,拿最长的参数进行全局搜索。
搜索只有一个,那么事情就简单了。
拆解三目运算符后代码简化如下:
i = ls.sm4.encrypt(i, e.encryptKey)
其中encryptKey为固定值,i是请求参数
这样就获得了
queryContent
。
继续下一个参数,向上找找可以发现请求参数包裹在一个对象中。
需要的nonceStr
也已经找到了。
既然知道请求参数都在对象n
中,搜索n.sign
应该是能够获得到结果的。
正好印证了上文的分析。
参数的加密分析到这里就结束了,需要扣取的代码简单整理一下:
var appSignPrivateKey = "xxx";var appSignPublicKey = "xxx";var n = { version: "1.0", appId: 'xxxx', signType: 'SM2', encryptType: 'SM4', nonceStr: H.uuid(), timestamp: H.timeStamp() };var i = `param=&page=${page}&size=10`;var page = 1n.queryContent = ls.sm4.encrypt(i, encryptKey)n.sign = Zi(o = ls.sm2.signature(a, appSignPrivateKey, appSignPublicKey, n.appId));
扣代码
请求
nonceStr
打上断点,重新触发该接口请求。
可以将H对象都拿下来,或者是只拿使用到的相关部分。
继续查看N
N
指向T
继续跳进去将函数B扣下来,将整个T的原型链函数也扣取下来,就可以获取到
nonceStr参数。
queryContent
这个参数使用了SM2
加密,扣的内容会比较多,但是难度也不高,将断点跳过来。
将ls
对象拿下来,从图中还需要将kr
拿下来,继续深入。
_r
函数如下:
将这些函数拿到本地不断运行,会不断报错,将报错缺少的内容补上再运行,循环往复就可以获取到结果了。
本地结果:
网站结果:
多次运行发现相同页码下加密结果相同,本地复现没问题。
sign
参数比较多,但是都有迹可循,不展开说了。ls
对象前面已经扣下来了,将剩余部分补完整问题不大。
Zi
函数:
还是上面的套路,缺什么就补什么,比较考验细心程度和耐心。
响应
使用XHR
断点同样hook该接口。因为是异步请求,如果一直F11跳断点会丢掉很多东西,建议使用F9跟栈,或者使用图上的小箭头。
不知跟了多久,发现一处可疑的地方。
响应拦截器,顾名思义就是对响应的内容做操作,可能会涉及到解密。 里面的控制流需要逐步分析。
还是熟悉的kr
对象,继续补完所需的代码即可。
可以看到本地的解密也是没有任何的问题。
总结
网站大量使用异步,跟栈时需要耐心,整体的加密也不算太难,获取的加密的key值也可以尝试使用python或其他语言还原。
原文始发于微信公众号(实战安全研究):js逆向-某网站国密分析
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论