
1. 項目概述為什么我們需要Galaxy這樣的加解密插件在Web應用安全測試的日常工作中我們經常會遇到一個讓人頭疼的“攔路虎”應用層加密。想象一下你正興致勃勃地準備對一個登錄接口進行密碼爆破或者想修改一個訂單的金額卻發現Burpsuite攔截到的請求體是一串毫無規律的、類似aBcDeFg123這樣的密文。你無法直接修改其中的username或amount參數因為任何微小的改動都會破壞整個加密結構導致服務器返回一個冷冰冰的“解密失敗”。這就是應用層自定義加密帶來的挑戰它像一層堅固的鎧甲保護著核心業務邏輯也讓安全測試人員無從下手。Galaxy插件就是為了擊穿這層鎧甲而生的利器。它不是Burpsuite自帶的某個隱藏功能而是一款由社區開發者貢獻的、功能強大的擴展插件。它的核心價值在于“透明化”處理加解密過程。簡單來說Galaxy允許你定義JavaScript腳本在Burpsuite的代理層對進出瀏覽器的HTTP/HTTPS流量進行自動化的加密和解密。對于你測試者而言你在Burpsuite的Proxy - Intercept標簽頁里看到的將是已經解密后的、清晰明了的明文參數你可以像操作普通請求一樣隨意修改它們。當你點擊“Forward”發送時Galaxy又會悄無聲息地按照你定義的規則將修改后的明文重新加密再發送給服務器。整個過程對測試者是透明的極大地提升了測試效率。我最初接觸Galaxy是因為測試一個金融類App其所有敏感請求都使用了非標準的AES加密。手動解密、修改、再加密一個測試用例就要耗費十幾分鐘且極易出錯。在配置好Galaxy后整個測試流程變得行云流水Intruder爆破、Repeater重放等高級功能得以充分發揮威力。因此無論你是面對簡單的Base64變形還是復雜的RSAAES混合加密掌握Galaxy都能讓你在安全測試中擁有“透視”和“變形”的能力。2. 環境搭建避開OpenJDK的“坑”構建穩定Burpsuite運行環境工欲善其事必先利其器。Galaxy插件的運行依賴于Burpsuite的Extender API而Burpsuite本身對Java運行環境JRE有特定的版本要求。很多新手在第一步就折戟沉沙問題大多出在Java環境上。2.1 Java環境選擇與安裝Burpsuite尤其是專業版目前與最新的OpenJDK 21或17存在一些已知的兼容性問題可能導致啟動崩潰或插件加載失敗。經過多次實測最穩定的選擇是Oracle JDK 8或OpenJDK 11LTS版本。注意強烈建議不要使用系統自帶的或通過某些包管理器安裝的最新版Java。為Burpsuite單獨配置一個專用的JRE環境是避免后續各種詭異問題的最佳實踐。操作步驟卸載沖突版本如果你電腦上已有其他Java版本可以先通過java -version查看。如果版本高于11建議為Burpsuite單獨指定JRE路徑而不是替換系統默認版本。下載JDK 11前往Adoptium原AdoptOpenJDK官網下載適用于你操作系統Windows/macOS/Linux的OpenJDK 11 LTS版本例如Temurin-11選擇JRE或JDK均可JRE更輕量。安裝與配置在Windows上建議將JDK解壓或安裝到一個沒有中文和空格的路徑例如D:\DevTools\Java\jdk-11。然后你需要將Burpsuite的啟動腳本指向這個JRE。Windows使用批處理文件啟動創建一個start_burp.bat文件內容如下echo off SET JAVA_HOMED:\DevTools\Java\jdk-11 SET PATH%JAVA_HOME%\bin;%PATH% start javaw -jar -Xmx2048m D:\BurpSuite\burpsuite_pro_v2024.1.jar這里-Xmx2048m表示分配2GB最大堆內存對于大型項目測試很有幫助。雙擊此bat文件即可用指定JDK 11啟動Burpsuite。macOS/Linux在終端中使用類似命令啟動/path/to/your/jdk-11/bin/java -jar -Xmx2048m /path/to/burpsuite_pro.jar。實操心得我曾經因為圖省事直接用系統已存在的JDK 17啟動Burpsuite結果在加載某些復雜插件時頻繁出現內存錯誤或界面卡死。切換到JDK 11后一切運行如絲般順滑。這個“坑”值得所有初學者優先避開。2.2 Burpsuite的安裝與基礎配置確保你從官方渠道下載了Burpsuite。社區版功能有限對于Galaxy插件的完整使用特別是與Intruder模塊的聯動專業版是更好的選擇。首次啟動與代理配置啟動后首先在Proxy - Options中確保Proxy Listeners正在運行默認127.0.0.1:8080。這是Burpsuite接收流量的入口。瀏覽器代理設置將你的瀏覽器推薦使用Chrome或Firefox并安裝SwitchyOmega等代理管理插件的HTTP/HTTPS代理設置為127.0.0.1:8080。安裝CA證書這是攔截HTTPS流量的關鍵。在瀏覽器中訪問http://burpsuite點擊“CA Certificate”下載證書文件。然后你需要將證書導入到系統的受信任根證書頒發機構存儲中具體步驟因操作系統而異。只有完成這一步Burpsuite才能解密HTTPS流量Galaxy也才能在此基礎上進行應用層的加解密。2.3 Galaxy插件的獲取與安裝Galaxy是一個開源項目你可以在GitHub上搜索“Burpsuite Galaxy Plugin”找到它的源碼和發布頁面。通常你需要下載其編譯好的Jar文件例如galaxy-1.0.x.jar。安裝步驟非常簡單在Burpsuite中切換到Extender標簽頁。選擇Extensions子標簽點擊Add按鈕。在彈窗中Extension type選擇Java。點擊Select file...找到你下載的galaxy.jar文件然后點擊Next。如果一切順利你會看到輸出窗口顯示“Galaxy extension loaded successfully”并且在Extensions列表中出現“Galaxy”其狀態為“Enabled”。提示如果加載失敗請首先檢查Burpsuite的Java版本是否符合要求JDK 8或11。其次檢查Jar文件是否完整。有時網絡下載的文件可能損壞可以嘗試重新下載。至此你的“武器庫”已經準備就緒。Burpsuite作為攔截平臺Galaxy作為加解密處理器Java環境作為穩定基石。接下來我們將深入Galaxy的核心——腳本編寫。3. 核心原理與腳本編寫理解Galaxy的工作流與JavaScript引擎Galaxy插件本身并不包含任何具體的加解密算法。它扮演的是一個“腳本執行器”和“流量處理器”的角色。它的強大之處在于將加解密的邏輯定義完全交給了用戶編寫的JavaScript代碼。這意味著無論目標應用使用多么冷門或自定義的加密方式只要你能用JavaScript實現其算法Galaxy就能幫你自動化處理。3.1 Galaxy的工作流程理解以下流程對編寫和調試腳本至關重要請求階段Client to Server瀏覽器發出一個明文請求但可能已被前端JS加密。該請求被Burpsuite代理攔截。Galaxy介入Galaxy調用你編寫的processRequestMessage函數傳入攔截到的請求此時可能是前端加密后的密文。你在這個函數里編寫解密邏輯將密文請求體解密為明文。Burpsuite界面如Proxy history, Repeater顯示的是解密后的明文。你可以修改它。當你發送修改后的請求時Galaxy再次調用processRequestMessage或相關的加密函數將你修改過的明文重新加密成服務器可接受的格式然后發出。響應階段Server to Client服務器返回一個加密的響應。Burpsuite攔截到該響應。Galaxy介入Galaxy調用你編寫的processResponseMessage函數傳入加密的響應。你在這個函數里編寫解密邏輯將密文響應體解密為明文。Burpsuite界面如Response標簽頁顯示的是解密后的明文內容。整個過程中Burpsuite的Logger、Intruder、Scanner等所有工具看到的都是解密后的明文但實際網絡上傳輸的始終是密文。這實現了測試的“透明化”。3.2 腳本結構與關鍵函數一個完整的Galaxy腳本通常包含以下幾個部分// 1. 元數據聲明 (非必需但建議) var metadata { name: My Target App Crypto, author: Your Name, description: Handles AES encryption for XXX app }; // 2. 全局變量或輔助函數 var CryptoJS require(crypto-js); // 假設我們使用CryptoJS庫 var secretKey my-secret-key-123; function customDecrypt(cipherText) { // 你的解密邏輯 // 例如使用CryptoJS.AES.decrypt var bytes CryptoJS.AES.decrypt(cipherText, secretKey); return bytes.toString(CryptoJS.enc.Utf8); } function customEncrypt(plainText) { // 你的加密邏輯 return CryptoJS.AES.encrypt(plainText, secretKey).toString(); } // 3. 核心處理函數 - 必須實現 function processRequestMessage(utils, message) { // utils: 提供工具方法如獲取請求體、設置請求體等 // message: 當前HTTP請求消息對象 var requestInfo utils.getRequestInfo(message); // 獲取請求詳情 var body requestInfo.getBody(); // 獲取請求體字節數組 if (body ! null body.length 0) { var bodyStr String.fromCharCode.apply(null, body); // 字節數組轉字符串 // 判斷是否需要處理例如根據URL或Content-Type if (requestInfo.getUrl().contains(/api/login)) { try { var decryptedStr customDecrypt(bodyStr); // 調用解密函數 utils.setRequestBody(message, decryptedStr); // 將解密后的明文設回請求體 utils.addComment(message, Galaxy: Request Decrypted); // 添加注釋便于追蹤 } catch (e) { utils.addComment(message, Galaxy: Decrypt Failed - e.message); } } } return message; // 返回處理后的消息 } function processResponseMessage(utils, message) { // 處理響應邏輯類似 var responseInfo utils.getResponseInfo(message); var body responseInfo.getBody(); if (body ! null body.length 0) { var bodyStr String.fromCharCode.apply(null, body); // 判斷是否需要解密響應 if (message.getUrl().contains(/api/data)) { try { var decryptedStr customDecrypt(bodyStr); utils.setResponseBody(message, decryptedStr); utils.addComment(message, Galaxy: Response Decrypted); } catch (e) { // 處理錯誤 } } } return message; }關鍵點解析utils.getRequestInfo(message)/utils.getResponseInfo(message)這是你與HTTP消息交互的入口可以獲取URL、Headers、Body等信息。utils.setRequestBody/utils.setResponseBody這是修改消息體的關鍵方法。Galaxy正是通過調用這些方法將解密后的明文“替換”回去供Burpsuite界面顯示和編輯。utils.addComment這是一個非常實用的調試功能。它會在Burpsuite的Proxy歷史記錄或Logger中為該條記錄添加一個注釋讓你一眼就能看出哪些請求被Galaxy處理過是成功還是失敗。3.3 引入外部加密庫如CryptoJSJavaScript內置的加密能力有限。對于常見的AES、DES、RSA等算法我們通常需要引入CryptoJS這個強大的庫。Galaxy的JavaScript引擎支持require語法。如何引入CryptoJS你需要下載CryptoJS的完整源碼一個單獨的crypto-js.js文件而不是使用其通過npm分發的模塊化版本。在Galaxy腳本的開頭使用var CryptoJS require(/full/path/to/crypto-js.js);來加載。注意這里的路徑必須是文件系統的絕對路徑。加載成功后你就可以使用CryptoJS.AES、CryptoJS.MD5等對象了。實操心得路徑問題是新手常遇到的坑。在Windows上路徑可能是C:\\Users\\Name\\tools\\crypto-js.js注意雙反斜杠或單正斜杠。一個更穩健的做法是將CryptoJS.js文件放在Burpsuite的安裝目錄或你的腳本目錄下使用相對路徑但需要確認Galaxy的當前工作目錄。最省事的方法是直接將CryptoJS的源碼復制粘貼到你的Galaxy腳本文件中作為一個巨大的字符串變量或直接內聯編寫這樣就完全避免了路徑依賴問題。雖然這會讓腳本文件變大但對于需要分發的腳本來說一體性更強。4. 實戰入門編寫你的第一條解密腳本理論說得再多不如動手一試。我們以一個最常見的場景為例目標網站使用AES-CBC模式對JSON請求體進行整體加密加密后的數據以Base64字符串形式放在POST body中。假設目標URL:https://target.com/api/submit請求體加密后U2FsdGVkX1o5x...很長一串Base64加密方式AES-256-CBCPKCS7填充密鑰mySuperSecretKey1234567890123456IV向量為1234567890123456。4.1 步驟一分析并還原加密邏輯首先你需要通過前端代碼分析或逆向工程確定準確的加密參數。這里我們假設已獲知上述信息。我們選擇使用CryptoJS庫。4.2 步驟二編寫完整的Galaxy腳本我們將內聯CryptoJS的核心代碼簡化版并編寫處理函數。// Galaxy Script for AES-256-CBC Decryption/Encryption var metadata { name: AES-256-CBC Demo, author: Security Tester, description: Handles AES-256-CBC encryption for /api/submit }; // --- 內聯的CryptoJS核心部分 (極度簡化版僅用于演示) --- // 在實際使用中你應該引入完整的crypto-js.js文件 var CryptoJS (function() { // 這里本應是龐大的CryptoJS庫代碼 // 為了示例我們假設它已正確加載并提供了AES.decrypt/encrypt方法 // 實際腳本中請使用 require(/path/to/crypto-js.js) return window.CryptoJS || {}; // 假設在Galaxy環境中可用 })(); // 配置密鑰和IV (應與前端一致) var SECRET_KEY CryptoJS.enc.Utf8.parse(mySuperSecretKey1234567890123456); // 32字節 var IV CryptoJS.enc.Utf8.parse(1234567890123456); // 16字節 /** * 解密函數 * param {string} ciphertextBase64 - Base64編碼的密文 * return {string} 解密后的明文 */ function decrypt(ciphertextBase64) { try { // CryptoJS 期望的密文格式可能是特殊的OpenSSL格式這里假設是直接的AES-CBC密文 // 實際中需要根據前端具體實現調整 var encryptedData CryptoJS.enc.Base64.parse(ciphertextBase64); var decrypted CryptoJS.AES.decrypt( { ciphertext: encryptedData }, // 或直接傳Base64字符串取決于庫版本 SECRET_KEY, { iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); return decrypted.toString(CryptoJS.enc.Utf8); } catch (e) { return Decryption Error: e.message; } } /** * 加密函數 * param {string} plaintext - 明文 * return {string} Base64編碼的密文 */ function encrypt(plaintext) { try { var encrypted CryptoJS.AES.encrypt( plaintext, SECRET_KEY, { iv: IV, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 } ); // 獲取密文的Base64字符串表示 return encrypted.ciphertext.toString(CryptoJS.enc.Base64); } catch (e) { return Encryption Error: e.message; } } // --- Galaxy 核心處理函數 --- function processRequestMessage(utils, message) { var requestInfo utils.getRequestInfo(message); var url requestInfo.getUrl().toString(); // 只處理特定接口 if (url.indexOf(/api/submit) ! -1) { var bodyBytes requestInfo.getBody(); if (bodyBytes ! null bodyBytes.length 0) { var rawBody String.fromCharCode.apply(null, bodyBytes); // 假設請求體就是直接的Base64字符串沒有額外的JSON包裝 var decryptedBody decrypt(rawBody.trim()); // 解密 if (!decryptedBody.startsWith(Decryption Error)) { // 成功解密將明文設置回請求體 utils.setRequestBody(message, decryptedBody); utils.addComment(message, [Galaxy] Request Decrypted to JSON); // 你可以在這里打印解密內容到Burpsuite的Extender輸出窗口用于調試 // utils.printOutput(Decrypted: decryptedBody.substring(0, 100) ...); } else { utils.addComment(message, [Galaxy] Decrypt FAILED); } } } // 注意我們不在這個函數里重新加密。Galaxy通常有獨立的流程處理出站加密。 // 但Galaxy插件通常通過“雙向處理”自動完成。有些配置下需要在另一個鉤子或同一函數判斷方向。 // 更常見的做法是解密入站請求供查看/修改加密出站請求供發送。 // 這里為簡化假設Galaxy配置了雙向處理且encrypt函數會被自動調用。 return message; } // 一個用于出站請求加密的處理器如果Galaxy支持 function processOutgoingRequest(utils, message) { var requestInfo utils.getRequestInfo(message); var url requestInfo.getUrl().toString(); if (url.indexOf(/api/submit) ! -1) { var bodyBytes requestInfo.getBody(); if (bodyBytes ! null bodyBytes.length 0) { var plainBody String.fromCharCode.apply(null, bodyBytes); // 檢查是否是JSON即我們修改過的明文如果是則加密 try { JSON.parse(plainBody); // 簡單驗證是否為JSON var encryptedBody encrypt(plainBody); if (!encryptedBody.startsWith(Encryption Error)) { utils.setRequestBody(message, encryptedBody); utils.addComment(message, [Galaxy] Request Encrypted for sending); } } catch (e) { // 不是JSON可能是其他狀態不處理 } } } return message; } // 響應解密 function processResponseMessage(utils, message) { var responseInfo utils.getResponseInfo(message); var url message.getUrl().toString(); if (url.indexOf(/api/submit) ! -1 responseInfo.getStatusCode() 200) { var bodyBytes responseInfo.getBody(); if (bodyBytes ! null bodyBytes.length 0) { var rawBody String.fromCharCode.apply(null, bodyBytes); var decryptedBody decrypt(rawBody.trim()); if (!decryptedBody.startsWith(Decryption Error)) { utils.setResponseBody(message, decryptedBody); utils.addComment(message, [Galaxy] Response Decrypted); } } } return message; }4.3 步驟三在Galaxy插件中配置腳本在Burpsuite的Extender - Extensions中找到已加載的Galaxy插件點擊其下方的Galaxy標簽或類似名稱具體取決于插件版本。你應該能看到一個界面允許你添加、編輯、啟用/禁用腳本。點擊Add或New Script將上面的代碼粘貼進去。為腳本起一個名字例如AES-256-CBC Demo。確保腳本狀態為Enabled。4.4 步驟四測試你的第一條解密請求確保瀏覽器代理設置正確指向Burpsuite。訪問目標網站進行觸發/api/submit請求的操作例如點擊提交按鈕。切換到Burpsuite的Proxy - HTTP history。找到指向/api/submit的請求。如果配置成功你應該能看到請求體Raw視圖從一串Base64密文變成了可讀的JSON明文例如{user:admin,action:login}。注釋欄可能顯示有[Galaxy] Request Decrypted to JSON。你可以在Repeater中右鍵發送該請求到Repeater然后修改JSON中的參數如將user改為test點擊發送。Galaxy會自動將你修改后的明文重新加密然后發送給服務器。在Response中你看到的也應該是解密后的明文。恭喜至此你已經完成了從環境搭建到編寫、配置并成功運行第一條解密腳本的全過程。你成功地在Burpsuite和加密的Web應用之間架起了一座透明的橋梁。5. 高級技巧與深度調試讓Galaxy成為你的得力助手掌握了基礎用法后下面這些技巧能讓你更高效地利用Galaxy應對復雜場景。5.1 處理多種加密模式或動態密鑰現實中的加密往往更復雜。密鑰可能不是硬編碼的而是通過某個接口動態獲取如登錄后返回一個sessionKey。或者不同的接口使用不同的加密算法。解決方案狀態管理Galaxy腳本的變量在同一個請求-響應會話中通常是保持的。你可以定義一個全局對象來存儲狀態例如var cryptoState { currentKey: null, keyExpiry: 0, algorithm: AES-128 }; // 在processResponseMessage中監聽登錄響應從中提取密鑰并存入cryptoStateURL路由在processRequestMessage和processResponseMessage函數中使用if-else或switch語句根據utils.getRequestInfo(message).getUrl()的不同路徑調用不同的加解密函數。外部配置對于需要頻繁修改的密鑰或參數可以將它們寫在腳本開頭的配置變量中甚至通過Burpsuite的Extension Settings界面來動態配置這需要插件支持更高級的API。5.2 利用Burpsuite工具鏈進行聯動測試Galaxy解密的真正威力在于解放了Burpsuite的其他工具。Intruder入侵者這是最經典的用例。當你需要對一個加密的參數進行爆破時如密碼、驗證碼無需再手動加密每個Payload。在Intruder中直接針對解密后的明文參數如password設置Payload位置。Galaxy會在每次請求發送前自動將你設置的明文Payload加密。你可以輕松進行字典攻擊、模糊測試等。Repeater重放器方便地修改單個請求觀察響應變化。解密后你可以直觀地修改JSON或表單數據無需關心底層加密。Scanner掃描器Burpsuite的主動掃描器也能受益。雖然Scanner本身有處理簡單編碼的能力但對于自定義加密無能為力。配置好Galaxy后Scanner發送的測試Payload會被自動加密從而能夠對加密接口進行漏洞掃描。Logger日志記錄器所有經過Galaxy處理的請求和響應都會留下注釋。你可以在Logger中過濾出這些記錄方便回溯和分析測試流程。5.3 調試腳本當解密失敗時怎么辦腳本不工作是最常見的情況。別慌按以下步驟排查檢查Extender輸出首先查看Burpsuite的Extender - Output標簽頁。Galaxy插件和你的腳本運行時拋出的任何JavaScript錯誤都會在這里打印。這是最重要的調試信息源。使用utils.printOutput()在你的腳本中關鍵位置插入utils.printOutput(Debug: someVariable)。這會將信息打印到上述Output窗口幫助你跟蹤變量狀態和執行流程。驗證加解密函數本身在腳本之外先用一個簡單的Node.js或瀏覽器環境用相同的密鑰和IV測試你的encrypt和decrypt函數確保它們能正確互逆。確保你使用的CryptoJS版本和模式CBC/ECB、填充Pkcs7/ZeroPadding等與前端完全一致。一個常見的坑是IV的處理前端可能將IV拼接在密文前或者使用固定的IV你的解密函數需要以同樣的方式提取或使用IV。檢查請求/響應判斷條件確保你的if (url.indexOf(/api/submit) ! -1)條件能正確匹配到目標請求。有時URL包含查詢參數需要更精確的匹配。可以使用utils.getRequestInfo(message).getUrl().getPath()來獲取純路徑部分。查看原始流量在Burpsuite的Proxy歷史中右鍵請求選擇Send to Comparer然后選擇Compare with original。這能幫你確認Galaxy是否真的修改了請求體。如果比較結果顯示無變化說明你的腳本沒有被執行或者執行路徑沒有匹配上。注意編碼問題HTTP請求體是字節數組。在將字節數組轉為字符串String.fromCharCode.apply(null, bodyBytes)時假設了它是UTF-8編碼。如果實際是其他編碼如GBK會導致亂碼和解密失敗。同樣設置回去時也要確保編碼一致。5.4 性能與穩定性考量腳本復雜度過于復雜的JavaScript腳本可能會影響Burpsuite處理請求的速度尤其是在高并發如Intruder攻擊時。盡量保持加解密函數高效避免在腳本中進行耗時的網絡請求或復雜計算。錯誤處理務必用try-catch包裹你的加解密邏輯并在出錯時通過utils.addComment添加明確的錯誤信息。一個未捕獲的異常可能導致整個請求處理鏈中斷。作用域隔離Galaxy的每個腳本可能運行在獨立的JavaScript引擎中但要注意全局變量污染。盡量使用函數封裝你的邏輯減少全局變量的使用。6. 常見問題與排查技巧實錄在這一部分我匯總了在過去幾年使用Galaxy插件過程中自己和同事們踩過的坑以及對應的解決方案。希望這份“避坑指南”能幫你節省大量調試時間。問題現象可能原因排查步驟與解決方案Galaxy插件加載失敗1. Burpsuite Java版本不兼容如JDK 17。2. Jar文件損壞或版本不對。3. 與其他插件沖突。1. 降級到JDK 8或11啟動Burpsuite。2. 重新下載插件檢查文件完整性。3. 禁用其他插件逐一排查。腳本已啟用但請求/響應無變化1. URL匹配條件錯誤。2. 腳本邏輯錯誤未進入加解密分支。3. 加解密函數本身拋出異常被靜默處理。4. 腳本未正確保存或啟用。1. 使用utils.printOutput打印URL確認匹配邏輯。2. 在processRequestMessage開始處添加打印確認函數被調用。3. 檢查Extender Output窗口有無JavaScript錯誤。4. 在Galaxy管理界面確認腳本狀態為“Enabled”。解密后是亂碼或錯誤信息1. 密鑰或IV錯誤。2. 加密模式或填充方式不匹配。3. 密文格式問題如包含非Base64字符、有JSON包裝。4. 字符串與字節數組轉換編碼問題。1. 核對前端加密代碼確保所有參數一致。2. 使用獨立的CryptoJS環境驗證加解密函數。3. 打印原始請求體確認其確切格式。可能需要先進行JSON.parse提取密文字段。4. 嘗試使用CryptoJS.enc.Hex或CryptoJS.enc.Latin1進行解析。修改明文后發送服務器返回解密失敗1. 加密函數錯誤生成的密文格式不對。2. 修改明文時破壞了結構如JSON格式錯誤。3. 請求頭如Content-Length未更新。1. 用加密函數加密一個已知明文與前端生成的密文對比。2. 使用JSON.stringify()確保修改后的JSON格式正確。3.關鍵點Galaxy通常會自動更新Content-Length但某些自定義頭可能需要手動處理。檢查請求頭。僅部分請求被處理1. 腳本中的URL匹配規則不全面。2. 請求方法GET/POST或Content-Type被忽略。1. 使用更寬泛的匹配如url.indexOf(/api/) -1或正則表達式。2. 在條件中增加對requestInfo.getMethod()和requestInfo.getHeader(Content-Type)的判斷。使用Intruder時速度極慢1. 腳本中加解密邏輯過于復雜或效率低下。2. 在腳本中進行了同步的、耗時的操作。1. 優化JavaScript代碼避免在循環中重復初始化大型對象。2. 確保加解密是純內存計算無I/O操作。對于RSA等慢速算法考慮性能影響。無法引入外部JS庫如CryptoJS1.require路徑錯誤。2. Galaxy的JS引擎不支持該庫的某些特性。1. 使用絕對路徑或直接將庫源碼內聯到腳本中推薦。2. 嘗試尋找更輕量級或兼容性更好的加密庫實現或手動實現核心算法對于簡單算法如XOR、Base64變種可行。獨家避坑技巧“先分離后集成”永遠不要在Galaxy腳本里直接編寫和調試復雜的加密算法。先在瀏覽器控制臺或Node.js腳本中用JavaScript完美復現目標的前端加密和解密過程。確保這個獨立的腳本能正常工作后再把代碼移植到Galaxy腳本中。這能隔離90%的算法相關問題。善用注釋和日志在腳本的每個關鍵決策點如進入某個URL判斷、調用解密前、解密后都加上utils.addComment。這樣在Burpsuite的歷史記錄里你能像看流程圖一樣看到腳本的執行路徑快速定位問題發生在哪一步。從簡單到復雜不要一開始就試圖處理整個應用的所有加密接口。先針對一個最簡單的、你最確定的加密請求比如一個登錄請求編寫腳本。成功解密/加密這一個請求后再逐步擴展腳本的功能處理更多接口和更復雜的邏輯。這種漸進式的方法能幫你建立信心并更容易定位新增功能引入的問題。Galaxy插件的學習曲線初期可能有些陡峭尤其是需要與JavaScript加密代碼打交道時。但一旦你成功配置好第一個腳本并看到加密流量在Burpsuite中變得清晰可見那種成就感是無與倫比的。它不僅僅是解放了雙手更是打開了深入測試加密Web應用的大門。記住核心在于精確還原前端的加密邏輯而Galaxy提供了一個強大且靈活的舞臺來部署你的還原成果。多練習多調試你很快就能將它運用自如成為你Web安全測試工具箱中不可或缺的神器。