前言
實習的時候有幸看了一次內部分享,有大師傅分享了下前端加密下如何爆破構造=>通過一個bp的插件實現。當時我碰到幾個后台也有這種情況,有幾個是md5加密或者base64加密的,我直接將字典中的密碼全部md5一遍做成新的字典再放到bp中跑,但是碰到RSA,AES,DES的話就不能這樣了(其實也能這樣),但是我們要是去測試登錄框是否有sql注入的時候,就不能這樣通過死的字典去一個一個看,有沒有更簡單的方式去加密我們的payload呢
測試方法
第一種:
利用c0ny師傅寫的jsEncrypter插件本地起一個服務,將payload發送通過服務器加密一遍再返回給bp來,相當於本地還原加密過程
第二種:
自己寫JS腳本去遍歷字典,將payload字典都加密一遍,然后作為新的字典去跑
其實第一第二鍾差不多,但是第一種就是本地起個中間加密服務,bp直接字典跑指定jsEncrypter插件處理后發送即可。
第二種其實也可行,完全可以的,根本不需要寫腳本,一會兒演示下。
第一種方法
下載安裝
首先下載jsEncrypter插件
https://github.com/c0ny1/jsEncrypter
通過mvn package打包編譯或者直接下release的最新版本
然后下載phantomJS(無頭瀏覽器)
http://phantomjs.org/download.html
下載后加入環境變量
安裝完成
本地demo測試
將/test/webapp放到phpstudy里測試demo,然后模擬下真實情況下使用該插件,做兩個示例,一個最簡單的base64,一個稍微實戰復雜一點點的RSA
base64
抓包發現密碼被加密成base64格式
右鍵查看源代碼,去找加密的函數和js
CryptoJS對象屬於crypto-js.js,然后將crypto-js.js下載下來,放到script目錄
將phantomjs_server.js修改如下
然后運行
測試成功
爆破密碼賬號密碼admin/admin,爆破出密碼admin
RSA
抓包
看JS找加密函數,找js文件
找到隱藏的表單輸入項public_key(公鑰)
下載jsencrypt.js到本地,修改phantomjs_server.js
啟動然后測試
爆破
實戰測試
由於沒有記錄當時實習遇到的前端加密的登陸頁面,只能現找,找了半天,勉強算找到一個AES加密的,但是有驗證碼,這里就test一下就行了,不爆破了
登陸抓包如下:
iv,key一起跟着傳的-0-
查看登陸按鈕對應的事件,function,找到對應的onclick函數
可以通過打斷點去測試加密函數在哪里
找到encrypt函數
發現在aes.js中,下載到本地script,修改phantomjs_server.js文件
test一下測試下
OK,與加密的一樣,成功,這里有兩個需要加密的地方,如果是交叉爆破完全可以調成兩個負載位置,然后兩個負載位置的攻擊模塊進行同樣的操作,通過擴展處理即可
第二種方法
不管是將字典加密還是靈活的將一句一句payload加密,這個方法都可以實現,比較取巧
用法就是直接通過瀏覽器的Console直接調用加密函數加密我們的list,但問題是字典比較多,要一個一個填入比較麻煩,通過python腳本處理一下即可。比如用Demo中的RSA加密來測試
JS代碼
function crypto(str) { var encrypt = new JSEncrypt(); encrypt.setPublicKey($("input[name=public_key]").val()); en_password = encrypt.encrypt(str); return en_password; } var list=["admin","root","guest","fuck"]; var newlist=[]; for(var i=0;i<list.length;i++) { newlist+=crypto(list[i])+"\n"; } console.log(newlist);
如果要用這種方式的話,字典過大的話,需要用python處理成js數組的樣子
該方式比較討巧,相當於用加載好的js環境對我們需要的payload進行加密即可
第三種方法
首發於90sec
參考鏈接: