网页抓取 加密html(参考文章快速定位前端加密方法渗透测试-前端测试)
优采云 发布时间: 2022-01-31 22:25网页抓取 加密html(参考文章快速定位前端加密方法渗透测试-前端测试)
参考文章
快速定位前端加密方式
渗透测试 - 前端加密测试
前言
由于最近学会了挖坑,遇到数据加密基本放弃了。但是我发*敏*感*词*融行业还是其他行业。所以借此机会摆弄它。
从上图可以看出,网站在前端加密了我的账号密码。前端加密的好处是防止数据被劫持后直接泄露用户信息,增加了攻击者的成本。虽然有https,但也有被破解的风险。另外,国内很多网站没有https,所以前端加密会进一步提高用户数据的安全性
但对于我这样的菜鸟,就算把洞摆在我面前,也未必能找到,更别说加密了。太难了。
工具
phantomJS:, 如何使用:phantomJS.exe decrypt.js
js加密器:
简单的方法:
1)下载打包的jar文件:链接:提取码:go8h
2)添加到 BURP 扩展
3)在jsEncrypter下载地址下载模板文件,即phantomjs_server.js中
一般流程:
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中操作
步骤演示1.在phantomjs_server.js文件中导入网页中实现加密算法的js文件(几乎是一个依赖文件),方便直接调用加密函数
/* 1.在这引入实现加密所有 js 文件,注意引入顺序和网页一致 */
loadScript("script-1.js");
loadScript("script-2.js");
loadScript("script-n.js");
/**********************************************/
一般来说,如果一个网站的js文件没有经过混淆处理,很容易找到加密函数,而且加密算法也比较简单,不需要导入js文件。
可以直接复制加密函数,也可以自己写,但是加密算法的实现往往比较复杂,需要引入很多依赖,所以最好先导入,然后编写加密算法,然后调用依赖。
这时可能有人会问,如果我知道实现加密算法的js文件,我会看一个JB文章!
确实,说的好。下面提供两种解决方案
2.在浏览器控制台中寻找实现相应数据加密的加密函数
提示:在这一步可能会遇到找不到加密功能的问题。下面有几种解决方案。
提示字符:
然后找到加密函数
进一步跟进看实现算法
可以看到aes和rsa加密都通过了,所以后面还需要找到aes key,iv和rsa public_key
aes密钥生成功能:
四:
rsa的public_key:
3.调用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");
/**********************************************/
然后定义各种加密函数的实现,然后调用。