JS逆向之两个抽象混淆的网站剖析
js逆向
本次测试全部在本地或授权环境中进行,内容仅用于学习、技术参考与交流讨论。严禁将本文所述方法或技术用于任何非法用途。
文中提及的所有漏洞均已上报并完成修复。若读者进行类似测试,务必确保所有操作在合法、合规且获得授权的前提下进行。
如有读者因使用本文内容从事危害网络安全的行为,相关后果由其自行承担,原作者不承担任何责任。
本文为原创内容,未经授权,禁止任何形式的转载、复制或引用。如需使用,请联系作者获取授权。
1️⃣ 例
aHR0cHM6Ly93d3cuY2p3amx6eC5jb206ODQzMy8K
请求payload
发送请求发现password
的值被加密混淆了
发现CV16
是固定值,搜索下
让AI解释一下
s["default"].prototype.pwdUtil = {
encode: function(e) {
// 如果 e 有值,t 就是 [e] 数组,否则是空数组
var t = e ? [e] : [];
// n 是十六进制 0x12(十进制 18)
var n = parseInt("0x12");
var a = [];
// 遍历 t(虽然这里只有一个元素 e)
for (var i = 0; i < t.length; ++i) {
var c = t[i];
// 先 push 进 c.length ^ n (字符串长度异或 18)
a.push(c.length ^ n);
// 遍历字符串的每个字符
for (var s = 0; s < c.length; ++s) {
// 把每个字符的 Unicode 编码异或 18,然后放进数组 a
a.push(c[s].charCodeAt(0) ^ n);
}
}
// 再 push 一次 n(18)
a.push(n);
// 前面加 "CV16",然后用 % 号连接数组
var o = "CV16" + a.join("%");
return o;
}
}
运行例子:
如果 e = "abc"
- 长度
3
→3 ^ 18 = 17
- 'a' →
97 ^ 18 = 115
- 'b' →
98 ^ 18 = 112
- 'c' →
99 ^ 18 = 113
- 最后加
18
拼接结果是:
"CV16" + "17%115%112%113%18"
即
CV1617%115%112%113%18
2️⃣ 例
aHR0cHM6Ly94Y3p4LnZpZGVpb3QuY24vIy9sb2dpbj9yZWRpcmVjdD0v
请求payload
发送请求发现username
、verifyCode
两处被加密编码了
拿去Base64解码不对,搜索AES
没有、crypt
没有、搜索010001
也没有(010001
是 RSA 公钥中的指数)
再次发送请求发现username
、verifyCode
的值只有前5位有变化
把后面的拿去Base64解码。emmm,难评
随机5位0-9A-Za-z
字符拼接Base64编码后的值
data-mask-keys
请求头中的参数data-mask-keys
,直接搜索,打断点
跟进去看看,发现也是随机5位0-9A-Za-z
字符拼接Base64编码后的值
parameters-auth
请求头中的参数parameters-auth
,直接搜索,打断点
发现是r传进来的,直接在r的地方打断点,跟进看下
发现传进来了e,也就是上一栈的n,t也就是c,c为固定值
经过JSON.stringify(n) + t
后为
{"parameters":{"platform":"WEB","username":"DuDoQMTU1NTU1NTU1NTU=","verifyCode":"lGaLVMTIzNDU2"},"path":"/v3/pro/user/ecology/user/login/sms"}53f498c4bb19e3046963a74602e7e3aa
o()
看着像是md5,来验证一下
所以最后parameters-auth
为请求参数拼接固定值c
后,进行md5加密
这两个站除了最后的parameters-auth
其他的都挺抽象🤣