最近學習挖洞以來,碰到數據作了加密基本上也就放棄了。可是發現愈來愈多的網站都開始作前端加密了,不管是金融行業仍是其餘。因此趁此機會來搗鼓一下。html
從上圖能夠看到,網站在前端對個人帳號密碼作了加密處理。前端加密的好處在於防止數據被劫持後直接泄露用戶信息,增長攻擊者成本。雖然有https,可是也有被破解的風險。再者國內不少網站都沒有設置https,因此前端加密會進一步提升用戶數據的安全性前端
但對於我這樣一個菜雞,就算是洞放在我面前我也不必定能找到,更況且是加了密。太難了。git
phantomJS:https://phantomjs.org/download.html
,使用方法: phantomJS.exe decrypt.jsgithub
jsEncrypter :https://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.js
web
通常流程:
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
/* 1.在這引入實現加密全部 js 文件,注意引入順序和網頁一致 */ loadScript("script-1.js"); loadScript("script-2.js"); loadScript("script-n.js"); /**********************************************/
一般來講,若是一個網站的 js 文件沒有作混淆,並能輕鬆找到加密函數,且加密算法比較簡單的話,實際上是不須要導入 js 文件的
能夠直接將加密函數複製或者本身編寫便可,可是每每加密算法的實現比較複雜,須要引入許多依賴,因此仍是導入較好,後續編寫加密算法再調用其中的依賴api
此時可能有人就會問了,我要是知道實現加密算法的 js 文件是那個,我還看個 JB 文章呢!
確實,說的不錯。如下提供兩個解決辦法瀏覽器
ctrl+shift+f
全局搜索 encrypt、aes、des、md五、key、iv、rsa
等關鍵字過濾一波再導入Tips:在這一步,可能會碰到找不到加密函數的問題,如下有幾個解決辦法
瀏覽器的事件監聽
firefox:
chrome:
搜索關鍵詞 encrypt crypt aes rsa des key iv 等等跟加密相關的
結合各類參數、提示字符定位加密函數
參數:source、key
提示字符:
而後就找到了加密函數
進一步跟進查看實現算法
能夠看到經過了 aes 和 rsa 加密,所以後續也須要找到 aes 的 key、iv 以及 rsa 的 public_key
aes 的 key 生成函數:
iv:
rsa 的 public_key:
通常來講,該函數是須要本身從新編寫的
最終結果:
/** * 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"); /**********************************************/
而後再定義各類加密函數的實現,再調用就好了