记昨天一次分析某站的加签过程
本帖最后由 as614001 于 2022-11-30 11:00 编辑### 起因
由于工作需要懒症发作,需要做一些工作。
post途中发现一些需要前面
### 过程
1.一般情况下,就是搜url路径、签名字符串来进行。因为这类一定是在post发包前进行整合数据。如setHeader、setParm ==
本例中进行搜索了url路径,一般搜索会出现多个结果,那就是每个结果点进去看一下,觉得可能就下一个断点。
太多了试试签名字符串,sign,(这里有个技巧减小查找范围,一般这种可以搜索 sign: 因为这类赋值一般都是这样的)
很明显33125这行有个最接近的,点进去看看。
非常明显是这个,刚好是两个需要的签名数据。
如何判断确定是不是,可以在段首下段,断下来就可以。当然可以在堆栈或者直接跟出跟进再确认。
经确认是这里。
那么就是对如何加密进行确认了。
2.读代码。就去可以加密的了。一般情况只需要调试一遍。我们只管结果就可以了。不过大多数情况代码都被格式化压缩。变量名代替,所以需要确认。
通过读代码可以知道。
通过i = !r || !r.hasOwnProperty("useSignApi") || r.useSignApi;是否确认需要加密。
文中给出了公钥或固定公钥
~~~
n = e && e.publicKey || "-----BEGIN PU
~~~
此段意思就是 根据json的key值过滤非 数字 字符串的值,并以 “a=xxx ”形式并以 & 连接。
~~~
Object.keys(r).filter((function(t) {
return ["number", "string"].includes(sn(r))
}
)).sort().forEach((function(t, e) {
o += (0 === e ? "" : "&") + t + "=" + r
}
));
~~~
关键点加密算法来了。
~~~
var a = Je()(o)
, s = $e.a.stringify(a)
, u = new rn;
return u.setPublicKey(n),
{
key: u.encrypt("".concat(i)),
sign: s
}
~~~
a = Je()(o)
通过断点调试可以发现,这里可以打个断点在这里 然后在console中打印一下Je()看看是什么,熟手也不用。
熟悉的可以知道这个其实 Cryptojs 加密。不懂其实就要多百度,百度一下出来的就可以了。
知道了加密方式,cryptojs有很多种方式,这里只知道是cryptojs base64输出。
var a = Je()(o)
, s = $e.a.stringify(a)
所以我们可以把o字符串拿出来,做黑箱碰撞。其实就是瞎几把试。当然也可以跟进去一下就知道了。$e 是什么就可以快速知道了。
很幸运知道,该处用的是 SHA1 BASE64输出
看看另外一个
~~~
return u.setPublicKey(n),
{
key: u.encrypt("".concat(i)),
~~~
,经调试重复上述发现,其实这个是RSA加密,js用的一般叫 JScrypto 。一样不懂的重复上述就可以知道了。
只是这个 i 其实就是上文的一个 13位时间戳字符串。严重怀疑偷懒。
###用自己的语言还原。
这里用的python
### 结语
多试多搞多百度。
没事多百度。
田田爱崽崽 发表于 2022-11-30 11:18
请教一下后面这个CryptoJS类原型的测试工具叫啥名?
易语言那边的 WT-JS 知心 发表于 2022-11-30 11:19
请教一下:黑箱碰撞的时候用的是什么软件
易语言那边的 WT-JS 谢谢楼主分享 唉,就是看不懂JS
请教一下后面这个CryptoJS类原型的测试工具叫啥名? 请教一下:黑箱碰撞的时候用的是什么软件
谢谢楼主分享好方法 as614001 发表于 2022-11-30 11:43
易语言那边的 WT-JS
好的,非常感谢 谢谢楼主分享好方法