某公共资源中心-sm2逆向
目标网站:
aHR0cHM6Ly9nZ3p5Lmpjcy5nb3YuY24vd2Vic2l0ZS90cmFuc2FjdGlvbi9pbmRleA==接口分析:
打开抓包面板,点击翻页发现数据包list;

检查详情发现请求携带参数加密和返回参数加密,headers和cookies都没检验;


加密分析:
分析完存在加密的地方就可以断点跟栈了,先看请求加密,请求加密在send函数前完成的。

继续向前跟栈,在下图所示地方发现加密前的参数原文,打上断点刷新往下跟栈,跟到图二位置return "04" + d.doEncrypt(t, Object(u.a)(A), 0),发现传入参数原文,返回参数密文,这里就是加密参数生成的地方。这里的Object(u.a)(A)不用管,是一个迷惑性的操作,主要是在前面对0427404e3ad3e58323e62f09baf1a65ff9ded099bb3672c0c2fa632b28b1c687d01b2d92aa3032c8eacf5d7cb71c0dfdbb2da6d63cd6c1be6ada4da81136dbc3cc这个密钥先进行的des加密然后又进行des解密,注意图三框选的地方首先定义引用了s.a.sm2,这表明这里可能是使用的sm2进行加密,第二个框选的可能就是密钥。



分析加密函数特征,需要传入三个参数,第一个参数t是请求参数的字符串,第二个参数是上面给出的字符串0427404e3ad3e58323e62f09baf1a65ff9ded099bb3672c0c2fa632b28b1c687d01b2d92aa3032c8eacf5d7cb71c0dfdbb2da6d63cd6c1be6ada4da81136dbc3cc,第三个参数0(这个是使用何种加密模式,默认为1),点进这个函数,发现是标准的sm2加密,可以直接使用三方库实现。

const r = require('sm-crypto')
let d = "0427404e3ad3e58323e62f09baf1a65ff9ded099bb3672c0c2fa632b28b1c687d01b2d92aa3032c8eacf5d7cb71c0dfdbb2da6d63cd6c1be6ada4da81136dbc3cc"function en_data(data) {return "04" + r["sm2"].doEncrypt(JSON.stringify(data || {}), d, 0)
}解密:
解密函数一般在send函数后,还是在send打上断点往后跟栈,在跟到d.doDecrypt(t, "17d7cf5e57b0ca0d5db32409d222888b3bc0a711ac05707d1e0ea1f31d2ab5b1", 0),这个地方时,发现传入返回密文,返回返回密文。这里也是传入三个参数:t=密文,"17d7cf5e57b0ca0d5db32409d222888b3bc0a711ac05707d1e0ea1f31d2ab5b1"=密钥,0=加密模式(这里必须加密对应,不然会出不了结果),点进去发现还是标准sm2解密,直接使用三方库实现。

function de_data(en_data) {let n = null === en_data || void 0 === en_data ? void 0 : en_data.substr(2);c = JSON.parse(r["sm2"].doDecrypt(n, s, 0))return c
}
结果:
请求和接管解密都能成功。

