分析1
//案例:https://login.zhangin.com/
输入账号密码发现载荷中表单数据:param = 乱七八糟,猜测可能这里是加密的
全局搜索 param,发现它出现在某个 Js 文件,而且调用堆栈里也有很多这个 Js,猜测加密在这里面
进入这个 Js 代码,找到 param 的位置,发现代码:parameter: O;猜测 O 是加密值,在他后面设断点调试一下,发现真的是
找 O 是哪来的,往前看,发现代码段,O 通过 za 函数传入 c.value 和 S 返回的,S 又发现是账号密码的明文,那下一步也显而易见了
代码:
let S;//S: "123<><>123"
w && w != "" ? S = A + "<><>" + m + "<><>" + w : S = A + "<><>" + m;
const O = za(c.value, S);
找到 za 函数 和 c.value,选中 za 弹出提示跳转到另一个代码去,发现 za 函数源码
e 就是 c.value,n 就是 S;发现是 AES 加密,iv:偏移量;mode:模式;padding:填充;那密钥是什么,encrypt 串两个参数 n 和 t,n是明文,那 t 就是密钥了,t = e , r = e,拿下这些信息,我们直接找个工具验证,发现完全正确
代码:
za = (e, n) => {
const t = _0.enc.Latin1.parse(e)
, r = _0.enc.Latin1.parse(e);
return _0.AES.encrypt(n, t, {
iv: r,
mode: _0.mode.CBC,
padding: _0.pad.ZeroPadding
}).toString()
}
它在我面前如同没穿衣服
分析2
//案例:https://auth.xincheng.com/
F12 抓一下,发现密码被加密,hidetxtPassword,看调用堆栈,猜测在 login 和 匿名 中间
进入索引,发现打包数据的代码,成功找到 hidetxtPassword,往上找怎么来的
发现代码,实例化 JSEncrypt,调用 encrypt.encrypt( ) 函数加密得到数据
代码:
var encrypt = new JSEncrypt();
encrypt.setPublicKey($("#Public_key").val());
hidetxtPassword = encrypt.encrypt($("#txtPassword").val());
if (hidetxtPassword.endWith('==') == false) {
hidetxtPassword = encrypt.encrypt($("#txtPassword").val());
}
进入 JSEncrypt,看看是什么加密,不过代码中没什么明显的提示词,只是看到有个 PublicKey
转变思路,下载这个有 JSEncrypt 的 Js 代码,部署到本地,就可以复刻他的加密逻辑
现在需要找到 txtPassword,一搜索发现藏在上面,webstorm 开始部署
它在我面前如同只穿内裤
代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script src="jsencrypt.min.js"></script>
<script>
var encrypt = new JSEncrypt();
encrypt.setPublicKey("publicKey");
hidetxtPassword = encrypt.encrypt("cccc")
console.log(hidetxtPassword);
</script>
</body>
</html>
问题
这个方法还是有个小弊端的,如果下载的这个 Js 代码,就这么一个功能实现了,那没有任何问题
如果他是嵌套的,那很麻烦了,一运行报错说缺少某个文件,下载下来再部署,还缺另一个,下几个还行,要是好几十上百个,脑子要炸的
分析3
//案例:https://www.endata.com.cn/Video/index.html
发现 Js 代码乱乱的,可能被混淆,打包器打包过了
下载相关 Js,问 AI :已知 webDES.min.js 是 webpack 打包的代码,如何运行调用 webDES.min.js 里面的 webInstace.shell
终端 npm init -y-----npm install vm-----npm install fs,下载依赖
把需要解密的数据放到相应的函数中,运行即可
分析4(高端)
根据路径 currentitems,查询出相关 Js
发现解密部分 AES,O 是需要解密的字符串,mode是模式,r 是 key 且 r = a
let s = n.SHA1(n.enc.Utf8.parse("tSdGtmwh49BcR1irt18mxG41dGsBuGKS")),
a = n.enc.Hex.parse(s.toString(n.enc.Hex).substr(0, 32));
a 是 s 截取32位来的;s 是 SHA1来的,纯纯随机没法搞了
代码核心功能部分复制到本地部署,发现不成功啊,少这少那的,那就用 Crypto 库替代 SHA1,npm install crypto-js 下载Crypto库
把原 Js n.的部分改成Crypto. 即可