1. 初识Burpsuite与Galaxy插件第一次接触Burpsuite加解密插件Galaxy时我完全被它的能力震撼到了。想象一下当你面对一个加密的HTTP请求时就像拿到一个上了锁的保险箱而Galaxy就是那把万能钥匙。作为Burpsuite的扩展插件Galaxy专门用于处理各种加密请求和响应的自动解密让安全测试工作变得轻松许多。Galaxy的核心价值在于它能自动处理加密流量。现在越来越多的网站会对请求和响应进行加密或签名传统的手动解密方式效率极低。我遇到过最复杂的情况是某个金融类APP同时使用了AES加密、RSA签名和自定义编码手动解密一个请求就要花半小时。而Galaxy可以配置好解密规则后自动处理所有流量实测下来效率提升至少20倍。这个插件特别适合以下几类人群安全测试工程师需要频繁测试加密接口的安全性渗透测试人员要对加密流量进行漏洞挖掘开发人员调试自己开发的加密接口技术爱好者想学习加解密技术的实现原理2. 环境搭建全攻略2.1 JDK版本选择与配置第一次安装Galaxy时我在JDK版本上栽了个大跟头。当时我电脑上装的是JDK8结果插件死活加载不上报了一堆莫名其妙的错误。后来才发现Galaxy要求使用OpenJDK17及以上版本这里分享几个关键点版本选择推荐使用Amazon Corretto 21这是经过亚马逊长期维护的OpenJDK发行版稳定性很好。我在三个不同项目上都用过从没出过兼容性问题。环境变量配置安装完JDK后需要确保系统使用的是正确的Java版本。可以通过以下命令检查java -version如果显示的还是旧版本需要手动修改环境变量PATH把新JDK的bin目录放在最前面。Burpsuite启动配置建议专门为Burpsuite创建一个启动脚本确保它使用正确的JDK。我的启动脚本是这样的echo off start burpsuite /B C:\Program Files\Amazon Corretto\jdk21.0.2_12\bin\javaw.exe -Xmx8G -Dfile.encodingutf-8 -jar %~dp0burpsuite_community.jar这个脚本做了三件事指定使用Corretto 21的javaw.exe分配8GB内存给Burpsuite强制使用UTF-8编码2.2 Python环境准备Galaxy支持使用Python编写自定义解密脚本所以Python环境也很重要。这里有几个注意事项Python版本推荐Python 3.8-3.10太新的版本可能会有兼容性问题。我最初用Python 3.11就遇到了Jython不兼容的情况。虚拟环境强烈建议使用virtualenv创建独立环境python -m venv galaxy_env source galaxy_env/bin/activate # Linux/Mac galaxy_env\Scripts\activate.bat # Windows依赖安装Galaxy常用的加解密库包括pip install pycryptodome requests cryptography如果使用集成了Python环境的Galaxy包Galaxy-x.x.x-all.jar这些准备工作可以跳过但自定义脚本的灵活性会受限。3. 插件安装与配置3.1 获取Galaxy插件Galaxy的官方发布在GitHub上下载时要注意几个细节版本选择目前最新是3.1.0版本下载时有两个主要选项Galaxy-3.1.0-all.jar包含内置Python环境开箱即用Galaxy-3.1.0-without-jython.jar需要自行配置Python环境对于新手我强烈推荐使用-all版本能避免90%的环境问题。我自己第一次用时选了without-jython版本结果花了两天才调通Python环境。下载方式如果直接从GitHub下载速度慢可以尝试wget https://github.com/outlaws-bai/Galaxy/releases/download/3.1.0/Galaxy-3.1.0-all.jar3.2 加载插件到Burpsuite加载插件时有几个关键步骤打开Burpsuite进入Extender - Extensions点击Add选择下载的Galaxy jar文件等待加载完成这时可能会遇到两个常见问题问题一提示Jython找不到 解决方法是在Burpsuite的Extender - Options中设置正确的Jython路径。如果使用-all版本这一步可以跳过。问题二控制台报编码错误 这种情况需要在启动Burpsuite时添加编码参数就像前面启动脚本中的-Dfile.encodingutf-8。加载成功后你会看到Burpsuite顶部多了一个Galaxy标签页。第一次打开时插件会自动初始化这个过程可能需要10-30秒耐心等待即可。4. 完成第一条解密请求4.1 配置解密规则Galaxy支持多种解密方式我们先从最简单的AES解密开始进入Galaxy标签页点击Add New Script选择Python作为脚本语言粘贴以下示例代码from Crypto.Cipher import AES from base64 import b64decode def decrypt(data): key b0123456789abcdef # 替换为实际密钥 iv b1234567890abcdef # 替换为实际IV cipher AES.new(key, AES.MODE_CBC, iv) decrypted cipher.decrypt(b64decode(data)) return decrypted.decode(utf-8).strip()这个脚本做了以下几件事导入必要的加密库定义解密函数使用AES CBC模式解密处理Base64编码和UTF-8解码4.2 测试解密功能配置好脚本后我们来测试解密流程在Burpsuite的Proxy - Intercept中开启拦截访问一个使用AES加密的网站比如某些API接口拦截到请求后右键选择Send to Galaxy在Galaxy界面选择刚才创建的脚本点击Execute查看解密结果我第一次测试时遇到了Padding错误发现是因为网站使用了PKCS7填充而脚本没有处理。修改后的解密函数应该像这样from Crypto.Util.Padding import unpad def decrypt(data): # ...前面的代码不变... decrypted unpad(cipher.decrypt(b64decode(data)), AES.block_size) return decrypted.decode(utf-8)4.3 自动化解密流程手动解密只是第一步Galaxy的强大之处在于自动化在Galaxy界面勾选Auto Process Requests和Auto Process Responses设置匹配规则如URL包含/api/的请求才解密保存配置后所有符合规则的请求/响应都会自动解密我在测试一个电商网站时配置了如下规则请求URL包含/mobile-api/请求Content-Type为application/json响应状态码为200这样设置后所有移动端API的加密流量都自动变成了明文可以直接在Burpsuite的Repeater中修改和重放大大提高了测试效率。5. 常见问题排查5.1 编码相关问题GBK/UTF-8编码问题是最常见的坑之一症状包括解密后中文变乱码插件加载时报编码错误解决方法有三个层面Burpsuite启动参数确保有-Dfile.encodingutf-8Python脚本内部明确指定编码比如json.loads(decrypted_data.decode(utf-8))系统环境Windows用户可能需要修改系统区域设置勾选Beta版使用Unicode UTF-8提供全球语言支持5.2 加解密算法不匹配当解密结果乱码或报错时通常是因为算法配置不匹配。我整理了一个检查清单加密模式CBC/ECB/GCM等是否一致填充方式PKCS7/ZeroPadding等是否正确密钥和IV的编码方式hex/utf-8/base64是否有额外的编码层比如先压缩再加密曾经遇到一个特别隐蔽的问题网站使用了AES-256-CBC但密钥实际是32字节的hex字符串需要先解码成16字节的二进制密钥。这种细节问题往往需要反复调试才能发现。5.3 性能优化技巧当处理大量加密请求时可能会遇到性能问题。以下几个优化方法很实用缓存解密实例避免每次请求都新建cipher对象_cipher None def get_cipher(): global _cipher if _cipher is None: _cipher AES.new(key, AES.MODE_CBC, iv) return _cipher选择性解密通过请求特征快速判断是否需要解密if not data.startswith(ENC:): return data # 非加密数据直接返回使用更快的算法比如用ChaCha20代替AES如果目标系统支持6. 高级应用场景6.1 处理复合加密算法有些系统会使用多层加密比如先RSA再AES。针对这种情况可以编写链式解密脚本def decrypt(data): # 第一层RSA解密AES密钥 aes_key rsa_decrypt(data[encrypted_key], private_key) # 第二层AES解密实际数据 return aes_decrypt(data[encrypted_data], aes_key)我在一个银行项目中遇到过三重加密客户端生成临时AES密钥用服务器的RSA公钥加密AES密钥用AES加密实际请求数据最后整体做Base64编码处理这种复杂场景时建议先单独测试每一层解密确保各环节都正确后再组合起来。6.2 与Burpsuite其他模块联动Galaxy解密后的请求可以直接传递给其他模块使用Repeater修改解密后的请求观察响应变化Intruder对明文参数进行模糊测试Scanner扫描解密后的接口漏洞sqlmap通过--proxy参数将解密后的流量传给sqlmap一个实用的技巧是在Repeater中保存解密前后的请求对比方便后续分析。我通常会这样命名Original_[timestamp]_encryptedModified_[timestamp]_decrypted6.3 自定义脚本开发当内置算法不够用时可以自己开发解密脚本。Galaxy提供了完善的APIfrom burp import IBurpExtender from galaxy import GalaxyScript class CustomScript(GalaxyScript): def process_request(self, request): # 在这里实现自定义解密逻辑 return modified_request开发时建议先在一个独立的Python环境中测试核心解密逻辑确保正确后再集成到Galaxy中。我在开发HMAC签名脚本时就曾因为一个时间戳的时区问题调试了半天。7. 安全测试实战案例去年我参与了一个金融APP的安全评估他们的API使用了动态密钥加密客户端先调用/getKey接口获取临时AES密钥密钥有效期为5分钟每个请求都要带上签名用Galaxy解决这个问题的步骤如下编写密钥获取脚本自动缓存最新密钥import requests import time _key_cache {key: None, expire: 0} def get_current_key(): if time.time() _key_cache[expire]: return _key_cache[key] resp requests.get(https://api.example.com/getKey) data resp.json() _key_cache.update({ key: data[key], expire: time.time() 300 }) return data[key]编写主解密脚本集成密钥获取和签名验证def decrypt_request(request): key get_current_key() # 解密数据 data aes_decrypt(request.body, key) # 验证签名 if not verify_signature(data, request.headers[X-Signature]): raise ValueError(Invalid signature) return data配置Galaxy自动处理所有/api/v1/开头的请求这个方案成功绕过了动态密钥的防护最终我们发现了三个高危漏洞。测试过程中Galaxy处理了超过5000个加密请求稳定性非常好。