对一个网站进行测试的时候,会经常碰到可能没有设置验证码,但是对登录的数据包进行了加密,导致我们无法对登录处进行暴力破解,c0ny1师傅编写了一个插件jsEncrypter,如果定位不到加密的地方,这个插件也无法使用,看了网上一些文章加自己亲手测试,总结几个比较好用的方法。
0x01 全局搜索
以某网站登录处为例子,点击登录后抓包看到数据包被加密了
可以看到参数为endata,利用Google浏览器全局搜索这个参数(ctrl+shift+f)
在某个js中发现了有关加密函数的影子
鼠标左击即可进入这个js文件
在这个js中,我们发现了这个加密的函数,继续跟踪,全局搜索decryptRequest关键字
打开这个js,成功定位到了加密函数
使用AES加密,Pkcs7,key也可以利用全局搜索得到
对刚刚加密后的数据包进行解密
可以看到成功解密
在后面渗透的过程中,发现全局搜索encrypt参数有时候也能定位到加密参数
比如某网站登录处进行了加密
搜索encrypt参数
查看搜到的几个js文件,在app.js中成功发现加密函数
在线网站解密
0x02: Event Listeners定位法
谷歌浏览器,F12打开开发者工具,然后使用选择箭头选择目标标签,打开开发者工具Event Listeners面板。就能显示该标签对应的事件
当然通常关注的是click事件,这里看到显示的login界面42行,回到页面在源码中查看
成功定位到加密方式
0x03 请求堆栈定位
打开京东的登录界面
点击登录后,在network中寻找登录的数据包,在数据包中看到如下js
在js中找到加密函数
设置断点,回到登录界面点击登录
点击登录后进入了调试模式
0x04:jsEncrypter
以第一个网站为例子,使用c0ny1师傅的jsEncrypter(https://github.com/c0ny1/jsEncrypter)
下载后在bp中安装
然后下载phantomjs(https://phantomjs.org/download.html)
编写加密脚本,由第一个网站的加密函数
自己编写加密脚本
/**
* author: Str1am
* date: 2020-12-4
*/
var fs = require('fs');
var webserver = require('webserver');
server = webserver.create();
var logfile = 'jsEncrypter.log';
var host = '127.0.0.1';
var port = '1664';
/* 1.在这引入实现加密所有js文件,注意引入顺序和网页一致 */
loadScript("http.js");
loadScript("tools.js");
loadScript("crypto-js.min.js");
/**********************************************/
function loadScript(scriptName) {
var isSuccess = phantom.injectJs(scriptName);
if(isSuccess){
console.log("[*] load " + scriptName + " successful")
}else{
console.log("[!] load " + scriptName + " fail")
console.log("[*] phantomjs server exit");
phantom.exit();
}
}
function jsEncrypt(word){
/* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */
var aeskey = '46cc793c53dc451b';
var key = CryptoJS.enc.Utf8.parse(aeskey);
var srcs = CryptoJS.enc.Utf8.parse(word);
var newpayload = CryptoJS.AES.encrypt(srcs, key, {
mode: CryptoJS.mode.ECB,
padding: CryptoJS.pad.Pkcs7
});
return newpayload.toString();
// return burp_payload;
}
console.log("[*] Phantomjs server for jsEncrypter started successfully!");
console.log("[*] address: http://"+host+":"+port);
console.log("[!] ^_^");
var service = server.listen(host+':'+port,function(request, response){
try{
if(request.method == 'POST'){
var payload = request.post['payload'];
var encrypt_payload = jsEncrypt(payload);
var log = payload + ':' + encrypt_payload;
console.log('[+] ' + log);
fs.write(logfile,log + 'n', 'w+');
response.statusCode = 200;
response.setEncoding('UTF-8');
response.write(encrypt_payload.toString());
response.close();
}else{
response.statusCode = 200;
response.setEncoding('UTF-8');
response.write("^_^nrhello jsEncrypter!");
response.close();
}
}catch(e){
//console.log('[Error]'+e.message+' happen '+e.line+'line');
console.log('n-----------------Error Info--------------------');
var fullMessage = "Message: "+e.toString() + ':'+ e.line;
for (var p in e) {
fullMessage += "n" + p.toUpperCase() + ": " + e[p];
}
console.log(fullMessage);
console.log('---------------------------------------------');
response.statusCode = 200;
response.setEncoding('UTF-8');
response.write(fullMessage);
response.close();
console.log('[*] phantomJS exit!');
phantom.exit();
}
});
运行
报错了 但是不用管,到插件中点击connect
连接成功后点击test,加密成功
这样就又能愉快的对登录口进行爆破了
Reference:
https://gv7.me/articles/2018/fast-locate-the-front-end-encryption-method/