ARTICLE DETAIL

资讯详情

深耕网站SEO优化与搜索引擎排名提升的一线实战洞察。

BurpSuite Galaxy插件实战:破解Web应用自定义加密,提升安全测试效率

BurpSuite Galaxy插件实战:破解Web应用自定义加密,提升安全测试效率 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安全测试工具箱中不可或缺的神器。
返回列表