再解决不了前端加密我就吃shi

参考文章

快速定位前端加密方法
渗透测试-前端加密测试css

前言

最近学习挖洞以来,碰到数据作了加密基本上也就放弃了。可是发现愈来愈多的网站都开始作前端加密了,不管是金融行业仍是其余。因此趁此机会来捣鼓一下。html

从上图能够看到,网站在前端对个人帐号密码作了加密处理。前端加密的好处在于防止数据被劫持后直接泄露用户信息,增长攻击者成本。虽然有https,可是也有被破解的风险。再者国内不少网站都没有设置https,因此前端加密会进一步提升用户数据的安全性前端

但对于我这样一个菜鸡,就算是洞放在我面前我也不必定能找到,更况且是加了密。太难了。git

工具

phantomJS:https://phantomjs.org/download.html,使用方法: phantomJS.exe decrypt.jsgithub

jsEncrypterhttps://github.com/c0ny1/jsEncrypter
简便方法:
1)下载打包好的 jar 文件:连接:https://pan.baidu.com/s/1gDqmTVdYRD6nH5CfoqxavA 提取码:go8h
2)添加到 BURP 扩展
3)在 jsEncrypter 下载地址里下载模板文件,即https://github.com/c0ny1/jsEncrypter/tree/master/script 里的 phantomjs_server.jsweb

通常流程:
1)寻找加密函数
2) 编写 phantomJS 运行脚本,只须要将实现加密算法的 js 文件引入模板脚本,并在模板脚本的 js_encrypt 函数体中完成对加密函数的调用。固然也能够不引入实现加密算法的 js 文件,直接在 js_encrypt 函数体中实现加密算法,并调用
以下是 phantomjs_server.js 里的部份内容:算法

/* 1.在这引入实现加密全部 js 文件,注意引入顺序和网页一致 */
loadScript("script-1.js");
loadScript("script-2.js");
loadScript("script-n.js");
/**********************************************/

...

function jsEncrypt(burp_payload){
	var new_payload;
	/* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */

	/*********************************************************/
	return new_payload;
}

3)在终端中输入 phantomJS.exe phantomjs_server.js ,而后在 burp 里操做就好了chrome

步骤演示

在 phantomjs_server.js 文件中导入网页中实现加密算法的 js 文件(差很少就是依赖文件),方便以后直接调用加密函数

/* 1.在这引入实现加密全部 js 文件,注意引入顺序和网页一致 */
loadScript("script-1.js");
loadScript("script-2.js");
loadScript("script-n.js");
/**********************************************/

一般来讲,若是一个网站的 js 文件没有作混淆,并能轻松找到加密函数,且加密算法比较简单的话,实际上是不须要导入 js 文件的
能够直接将加密函数复制或者本身编写便可,可是每每加密算法的实现比较复杂,须要引入许多依赖,因此仍是导入较好,后续编写加密算法再调用其中的依赖api

此时可能有人就会问了,我要是知道实现加密算法的 js 文件是那个,我还看个 JB 文章呢!
确实,说的不错。如下提供两个解决办法浏览器

  • 导入全部 js 文件
    嗯,是个好办法。

    很少哈,也就亿个。
  • 经过关键字寻找 js 文件
    经过 ctrl+shift+f 全局搜索 encrypt、aes、des、md五、key、iv、rsa 等关键字过滤一波再导入

    不错不错,少了 3 个😭

在浏览器控制台里寻找实现对应数据加密的加密函数

Tips:在这一步,可能会碰到找不到加密函数的问题,如下有几个解决办法

  • 浏览器的事件监听
    firefox:

    chrome:

  • 搜索关键词 encrypt crypt aes rsa des key iv 等等跟加密相关的

  • 结合各类参数、提示字符定位加密函数
    参数:source、key

提示字符:

  • 根据 url 来定位
    网站登录经常是向某一个 api 接口发送帐号密码信息,所以点击提交时,用 js 发起请求就须要提供 api 地址

    以下是全局搜索获得的结果:

而后就找到了加密函数

进一步跟进查看实现算法

能够看到经过了 aes 和 rsa 加密,所以后续也须要找到 aes 的 key、iv 以及 rsa 的 public_key
aes 的 key 生成函数:

iv:

rsa 的 public_key:

在 phantomjs_server.js 中的 jsEncrypt 函数内调用找到的或本身编写的加密函数

通常来讲,该函数是须要本身从新编写的
最终结果:

/**
 * author: c0ny1
 * date: 2017-12-16
 * last update: 2020-03-03
 */
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("aes.js");
loadScript("zero.js");
loadScript("rsa.js");
// loadScript("script-n.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();
    }
}
// 定义 des 加密函数
function encryptByDES(message, key){
    var keyHex = CryptoJS.enc.Utf8.parse(key);
    var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7
    });
    return encrypted.ciphertext.toString();
}
//定义 aes 加密函数
function encryptByAES(data, key, iv){
    var key  = CryptoJS.enc.Latin1.parse(key);
    var iv   = CryptoJS.enc.Latin1.parse(iv);
    var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
    return encrypted.ciphertext.toString();
}
// 定义 rsa 加密函数
function encryptByRSA(data, pub_key){
    var encrypt = new JSEncrypt();
    encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + pub_key + '-----END PUBLIC KEY-----');
    var encrypted = encrypt.encrypt(data);
    return encrypted;
}

// 定义 aeskey 生成函数
function createAesKey() {
    var expect = 16;
    var key = Math.random().toString(36).substr(2);

    while (key.length < expect) {
      key += Math.random().toString(36).substr(2);
    }

    key = key.substr(0, 16);
    this.aesKey = key;
    return key;
  };
var PUBLIC_KEY = "-----BEGIN PUBLIC KEY-----\nMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIivtXleN3uU5AnqidOAsD/96s\nADl1RU8g8eeRfBvovhpFvTxqdjP4/aicrSLE/tP4+nctocHclxK2tCqS6758g2bk\nDrlyxcfVdFV8l9wLxciNf2eBrraKoNf85RBh8bcOT96TTpYF0dSgmJVPwMR5u8am\n+trZ5y3jtTGQ/Ht4lQIDAQAB\n-----END PUBLIC KEY-----";

function jsEncrypt(burp_payload){
	/* 2.在这里编写调用加密函数进行加密的代码,并把结果赋值给new_payload */
	var aeskey = createAesKey();
	var key = CryptoJS.enc.Utf8.parse(aesKey)
	//console.log(this.aesKey);
	/*********************************************************/
	result = {
	source: encryptByAES(burp_payload,aeskey,key),
	key: encryptByRSA(aeskey,PUBLIC_KEY)
	};
	return [result.source,aeskey,key];
	// 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("^_^\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('---------------------------------------------');
        response.statusCode = 200;
        response.setEncoding('UTF-8');
        response.write(fullMessage);
        response.close();
		console.log('[*] phantomJS exit!');
		phantom.exit();
    }	
});

通常网站都是 aes des ras 等方式进行加密,其依赖文件都是开源的,因此能够直接引入,所以能够省略第一步,直接本身编写函数。须要用到依赖文件以下:

对加密函数的实现不懂的话,能够看我前一篇文章
由于加密方式都差很少,因此引入文件能够统一写成:

/* 1.在这引入实现加密全部 js 文件,注意引入顺序和网页一致 */
loadScript("des.js");
loadScript("aes.js");
loadScript("aes填充方式.js");
loadScript("rsa.js");
/**********************************************/

而后再定义各类加密函数的实现,再调用就好了

相关文章
相关标签/搜索