JS逆向之两个抽象混淆的网站剖析

js逆向

本次测试全部在本地或授权环境中进行,内容仅用于学习、技术参考与交流讨论。严禁将本文所述方法或技术用于任何非法用途。

文中提及的所有漏洞均已上报并完成修复。若读者进行类似测试,务必确保所有操作在合法、合规且获得授权的前提下进行。

如有读者因使用本文内容从事危害网络安全的行为,相关后果由其自行承担,原作者不承担任何责任。

本文为原创内容,未经授权,禁止任何形式的转载、复制或引用。如需使用,请联系作者获取授权。

1️⃣ 例

aHR0cHM6Ly93d3cuY2p3amx6eC5jb206ODQzMy8K

请求payload

发送请求发现password的值被加密混淆了

Snipaste_2025-08-11_22-05-13

发现CV16是固定值,搜索下

Snipaste_2025-08-11_22-06-40

让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"

  • 长度 33 ^ 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

发送请求发现usernameverifyCode两处被加密编码了

Snipaste_2025-08-11_22-14-35

拿去Base64解码不对,搜索AES没有、crypt没有、搜索010001也没有(010001RSA 公钥中的指数)

再次发送请求发现usernameverifyCode的值只有前5位有变化

Snipaste_2025-08-11_22-22-01

把后面的拿去Base64解码。emmm,难评

Snipaste_2025-08-11_22-22-32

随机5位0-9A-Za-z字符拼接Base64编码后的值

data-mask-keys

请求头中的参数data-mask-keys,直接搜索,打断点

Snipaste_2025-08-11_22-27-22

跟进去看看,发现也是随机5位0-9A-Za-z字符拼接Base64编码后的值

Snipaste_2025-08-11_22-30-08

Snipaste_2025-08-11_22-29-27

parameters-auth

请求头中的参数parameters-auth,直接搜索,打断点

Snipaste_2025-08-11_22-32-05

发现是r传进来的,直接在r的地方打断点,跟进看下

Snipaste_2025-08-11_22-34-40

发现传进来了e,也就是上一栈的n,t也就是c,c为固定值

Snipaste_2025-08-11_22-36-46

经过JSON.stringify(n) + t后为

{"parameters":{"platform":"WEB","username":"DuDoQMTU1NTU1NTU1NTU=","verifyCode":"lGaLVMTIzNDU2"},"path":"/v3/pro/user/ecology/user/login/sms"}53f498c4bb19e3046963a74602e7e3aa

o()看着像是md5,来验证一下

Snipaste_2025-08-11_22-38-59

Snipaste_2025-08-11_22-39-23

所以最后parameters-auth为请求参数拼接固定值c后,进行md5加密

这两个站除了最后的parameters-auth其他的都挺抽象🤣