一、背景

当一个系统没有对登录次数进行限制时,我们就可以考虑进行Fuzzing。Fuzzing中验证码有的可以绕过,无法绕开也已经存在识别验证码的插件;token问题,使用burp Suite完全可以解决。加密传输目前解决方案比较少,分享使用Burp的jsEncrypter插件结合phantomJS对前端JS加密绕过。
项目地址:http://github.com/c0ny1/jsEncrypter

二、jsEncrypter原理

  • 0x01分析此插件的核心代码

插件实现对payload进行处理,所以一定要使用Burp Suite APIs的IIntruderPayloadProcessor接口的processPayload方法。

public byte[] processPayload(byte[] currentPayload, byte[] originalPayload, byte[] baseValue) {
    byte[] newpayload ="".getBytes();
    String payload = new String(currentPayload); //获取当前paylaod
    CloseableHttpClient client = HttpClients.createDefault(); //新建一个HttpClient
    HttpPost httpPost = new HttpPost(gui.getURL()); //新建一个post请求
    try {
        List nameValuePairs = new ArrayList(1);
        nameValuePairs.add(new BasicNameValuePair("payload",payload)); //添加payload参数
        httpPost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); //设置HttpPost实体
        CloseableHttpResponse response = client.execute(httpPost); //发送带有payload的请求
        //获取phantomJS处理好的结果
        String responseAsString = EntityUtils.toString(response.getEntity());
        newpayload = helpers.stringToBytes(responseAsString);
    } catch (Exception e) {
        stderr.println(e.getMessage());
        newpayload = "JsEncrypter cannot connect phantomJS!".getBytes();
    }
    return newpayload; //返回处理好的payload给Burp Suite
}
  • 0x02 phatomJS脚本模板代码

phantomJS是一个没有界面的浏览器,除了不能浏览,其他的和正常浏览器一样。使用它来执行我们编写好的脚本。
phantomJS下载地址:http://phantomjs.org/download.html
由于每个网站前端加密传输的算法一样,所以每次引入的js都不同,调用加密函数的代码也不仅相同。鉴于以上情况,为了每次不用重复写一些固定的代码,我们写一个模板代码。每次使用时,只要填写好引入js的文件名,以及实现好在js_encrypt()函数体调用加密算法对payload进行加密处理即可。

var webserver = require('webserver');
server = webserver.create();

var host = '127.0.0.1';
var port = '1664';

// 加载实现加密算法的js脚本
var wasSuccessful = phantom.injectJs('xxx.js');/引入实现加密的js文件/

// 处理函数
function js_encrypt(payload){

var newpayload;
/**********在这里编写调用加密函数进行加密的代码************/

/**********************************************************/
return newpayload;

}

if(wasSuccessful){

console.log("[*] load js successful");
console.log("[!] ^_^");
console.log("[*] jsEncrypterJS start!");
console.log("[+] address: http://"+host+":"+port);

}else{

console.log('[*] load js fail!');

}

var service = server.listen(host+':'+port,function(request, response){

if(request.method == 'POST'){
    var payload = request.post['payload'];
    var encrypt_payload = js_encrypt(payload); 
    console.log('[+] ' + payload + ':' + encrypt_payload); //显示原始payload和加密处理好的payload
    response.statusCode = 200;
      response.write(encrypt_payload.toString()); //返回处理好的payload
    response.close();
}else{
      response.statusCode = 200;
        response.write("^_^\n\rhello jsEncrypter!");
      response.close();
}

});

三、jsEncrypter测试

  • 0x01环境搭建

先将jsEncrypter加载到Burp Suite中,通过查看页面的js代码,
下载加密的RSA.js文件。编写phantomJS代码,在脚本中加载RSA.js文件,然后在js_encrypt函数中实现调用加密函数对传入的payload进行加密处理,命名为jsEncrypter_RSA.js。
核心代码:

// 加载实现加密算法的js脚本
var wasSuccessful = phantom.injectJs('RSA.js');/引入实现加密的js文件/

// 处理函数
function js_encrypt(payload){

var newpayload;
/**********在这里编写调用加密函数进行加密的代码************/
var encrypt = new JSEncrypt();
var key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0Llg1bVZhnyslfezwfeOkvnXWq59bDtmQyHvxkP/38Fw8QQXBfROCgzGc+Te6pOPl6Ye+vQ1rAnisBaP3rMk40i3OpallzVkuwRKydek3V9ufPpZEEH4eBgInMSDiMsggTWxcI/Lvag6eHjkSc67RTrj96oxj0ipVRqjxW4X6HQIDAQAB";
encrypt.setPublicKey(key);
newpayload = encrypt.encrypt(payload);
/**********************************************************/
return newpayload;

}

  • 0x02运行phantomJS脚本

测试加密效果 点击connect—>true亮起后点击Test

发现成功加密

Burp抓包爆破

Payload选取jsEncrypter插件

成功爆破。