案例地址:CCU登录
找加密参数
headers:

负载:

定位加密参数
启动器打上断点:

R中有加密参数:

R可能是上一个栈传过来的:

但我们到上一个栈并不是L函数:

所以我们打断点到L函数中:


然后跟上一个栈:

上一个栈d中有加密参数,但是这个栈没有什么加密逻辑,继续向前跟栈(看不出什么就继续向前跟栈):

L依旧是上个栈传入的,继续向前跟栈:

还是前面传入的,继续跟,这里找到了u的位置:


打断点看看怎么生成的,走下来发现压根没有生成:

但是后一个栈已经有密文了,那就一定是在return中某个函数生成的,那就一直点单步执行就一定能找到东西:

点一路单步执行后找到这个栈:

这里有密文,所以就是在这里生成的,我们一般都是倒着找R怎么生成的,但是这里并没有R赋值的位置,所以我们重新进来一步步跟一下,看右边啥时候出现的密文:

过了这一行出现data密文,那就是在这里进行加密,进去看到了这个:

那就看Y是不是真的是我们要的密文:

没毛,接着进:

进到这看到明文,然后接着进return中这个函数:

发现关键字,然后进函数中:

ok,AES加密,接着找另一个密文:

一定就是在这个里面,因为我们到这行开头时headers中还没有,但是一旦过了此行就有了,那我们直接进:

然后运行看右侧变量:

找到q位置,拿下来分析一下:

其实就是这个么个玩意儿,其中$是随机的,可以写死,然后进Z中看看:

进这个函数:

一样的格式:

md5加密:

复现代码
js代码:
var CryptoJS = require("crypto-js");
function encryptByAES(message, key) {
let CBCOptions = {
iv: CryptoJS.enc.Utf8.parse(key),
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
};
let aeskey = CryptoJS.enc.Utf8.parse(key);
let secretData = CryptoJS.enc.Utf8.parse(message);
let encrypted = CryptoJS.AES.encrypt(
secretData,
aeskey,
CBCOptions
);
return CryptoJS.enc.Base64.stringify(encrypted.ciphertext);
}
function unamePwd(uname, pwd) {
var username = encryptByAES(uname, "u2oh6Vu^HWe4_AES"),
password = encryptByAES(pwd, "u2oh6Vu^HWe4_AES")
return {
username: username,
password: password
}
}
console.log(unamePwd('szdjf', '123'));
console.log(CryptoJS.MD5(unamePwd('szdjf', '123') + "_" + 1773571201450 + "_" + "d28923b1-fde6-4571-bce6-aff72140be3b").toString());
res:

小结
本文比较简单,只是加密位置藏得比较深,如有问题请及时提出,加油加油



