原创声明:转载本文请标注出处和作者,望尊重作者劳动成果!感谢!
前言:一篇简单入门级别的JS加解密hook文章。
浏览器:firefox
抓包工具:burpsuite
1、抓包访问登录页面的时候,站点加密情况如下:
2、火狐F12进入调试器,勾选“XHR断点”:
3、然后重新登录访问页面,浏览器会自动debug所有发送URL请求数据的位置,如下所示:
4、F8 到数据加密的位置:
5、接着主要查看右侧的“调用堆栈”的内容,其中loadData
这段代码记录了数据加密的过程:
//三段式加密
var ajaxObj = this;
seajs.use('js/security/encrypt', function (encrypt) {
var data =YT.JsonToStr(conf.params || conf.param || {});
var key = encrypt.getAesKey();
var aesdata = encrypt.encrypt(data, key);
conf.params = aesdata;
conf.dynKey = key;
window.encryptObj = encrypt;
ajaxObj.post(conf);
});
6、简单解析这段代码:首先利用seajs
向外部加载了encrypt.js
,引入加密方法encrypt
,因此encrypt是属于局部作用域的,接着用var声明aesdata
和window.encryptObj
。
加密方法:encrypt.encrypt(data, key) -> (return 加密后的数据)
解密方法:window.encryptObj -> (等于 encrypt)
7、因此,需要加密数据的hook位置就是encrypt.encrypt(data, key);
因为这个时候 data 的值还是明文。
8、而解密数据的hook位置就是window.encryptObj.aesDecrypt(data,conf.dynKey)
,后续代码也可以直接定位到。
9、因为 encrypt 是局部作用域,所以要借用源代码中seajs
的引入方法,js hook代码可以写成下面的样子:
(function () {
try{
seajs.use('js/security/encrypt', function (encrypt) {
var e = encrypt.encrypt;
encrypt.encrypt = function (data) {
let res = e.apply(this,arguments);
console.error("加密(request):", res);
console.error("明文(request):", data);
return res
};
var decrypt = window.encryptObj.aesDecrypt;
window.encryptObj.aesDecrypt = function (key, value) {
let res = decrypt.apply(this, arguments);
console.error("response:", res);
return res;
};
});
}catch(error){}
})();
10、在控制台注入js,成功打印明文数据。
11、数据请求替换:
(function () {
try{
seajs.use('js/security/encrypt', function (encrypt) {
var e = encrypt.encrypt;
encrypt.encrypt = function (data) {
console.error("原请求:", data);
// 原字符串内容
const str1 = '111';
// 替换字符串内容
const str2 = '222';
if(data.indexOf(str1) != -1){
data = data.replace(str1, str2);
console.error("篡改后的请求:", data);
}
let res = e.apply(this, arguments);
return res
};
var decrypt = window.encryptObj.aesDecrypt;
window.encryptObj.aesDecrypt = function (key, value) {
console.error("response:", res);
let res = decrypt.apply(this, arguments);
return res;
};
});
}catch(error){}
})();
12、当然你也可以使用JS自定义替换加密文件的方法来hook,更简单!该方法在后续的文章中也有提到:
https://www.yuque.com/jammny/ioh9u7/du9lt18l9d20fqeg?singleDoc# 《【JS Hook实战】基于Webpack的JS加解密分析》
原文始发于微信公众号(Fighter安全团队):【JS Hook 实战】某网上银行JS加密算法分析
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论