定位前端加密的几种方法

对一个网站进行测试的时候,会经常碰到可能没有设置验证码,但是对登录的数据包进行了加密,导致我们无法对登录处进行暴力破解,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/

发表评论

电子邮件地址不会被公开。 必填项已用*标注