论报文加密加签场景下如何高效的进行渗透测试
字数 1633 2025-08-24 16:48:15
基于Burp Montoya API的报文加密加签场景渗透测试指南
1. 背景与问题概述
在现代Web应用安全测试中,越来越多的系统采用HTTP报文加密/加签传输机制,这给渗透测试工作带来了新的挑战:
- 无法直接查看和修改明文报文
- 传统解决方案(如burpy插件、mitmproxy代理)存在使用不便的问题
- 不同语言实现的加密算法可能存在细微差异,调试耗时
2. 解决方案架构
2.1 整体思路
利用Burp的Montoya API,在请求/响应的四个关键处理节点插入自定义处理逻辑:
- 请求从客户端到达Burp时:解密请求
- 请求从Burp发送到服务器时:加密请求
- 响应从服务器到达Burp时:解密响应
- 响应从Burp返回客户端时:加密响应
2.2 技术实现框架
项目名称:Galaxy
GitHub地址:https://github.com/outlaws-bai/Galaxy
3. 核心功能实现
3.1 请求过滤机制
采用JavaScript表达式过滤需要处理的请求,默认表达式:
!request.isStaticExtension() && request.host == '192.168.1.4'
特点:
- 支持复杂逻辑判断
- 可自定义修改以适应不同场景
- 返回boolean值决定是否处理当前请求
3.2 四种实现方式
| 实现方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| Python | 语法简洁,易上手 | JVM中运行可能有兼容性问题 | 快速实现简单逻辑 |
| JavaScript | 前端开发者友好 | 同Python | 简单加解密场景 |
| Java | 直接使用Java加密库,无兼容问题 | 需要Java知识 | 复杂加密逻辑 |
| gRPC | 跨语言能力强 | 性能较低,学习成本高 | 特殊语言需求 |
3.3 关键处理节点
- hookRequestToBurp:客户端→Burp时解密
- hookRequestToServer:Burp→服务器时加密
- hookResponseToBurp:服务器→Burp时解密
- hookResponseToClient:Burp→客户端时加密
4. 动态密钥处理方案
4.1 典型场景
- 客户端首次请求获取密钥/IV
- 后续通信使用该密钥加密
- 密钥可能定期更换
4.2 实现示例
Java实现代码框架:
import org.m2sec.core.utils.*;
import org.m2sec.core.models.*;
import java.util.HashMap;
import java.util.Map;
import org.slf4j.Logger;
public class Test {
private Logger log;
private static final String ALGORITHM = "AES/CBC/PKCS5Padding";
private byte[] secret;
private byte[] iv;
private static final Map<String, Object> paramMap = new HashMap<>();
private static final String jsonKey = "data";
private final ThreadLocal<Boolean> flag = ThreadLocal.withInitial(() -> false);
// 各hook方法实现...
}
4.3 关键处理逻辑
- 密钥获取识别:
if (request.getPath().endsWith("/api/getSecret")) {
flag.set(true);
}
- 密钥更新处理:
Map<?,?> bodyMap = JsonUtil.jsonStrToMap(new String(response.getContent()));
String secret1 = ((String)bodyMap.get("key"));
String iv1 = ((String)bodyMap.get("iv"));
secret = secret1.getBytes();
iv = iv1.getBytes();
paramMap.put("iv", iv);
- 加解密处理:
public byte[] decrypt(byte[] content) {
return CryptoUtil.aesDecrypt(ALGORITHM, content, secret, paramMap);
}
public byte[] encrypt(byte[] content) {
return CryptoUtil.aesEncrypt(ALGORITHM, content, secret, paramMap);
}
5. 实际应用示例
5.1 测试环境搭建
- 服务端(Python):
# pip install fastapi pycryptodome
from Crypto.Cipher import AES
from Crypto.Util.Padding import pad, unpad
from fastapi import FastAPI
import uvicorn
app = FastAPI()
@app.get("/api/getSecret")
async def get_secret():
key = generate_string(32) # 生成随机密钥
iv = generate_string(16) # 生成随机IV
return {"key": key, "iv": iv}
@app.post("/api/login")
async def login(request: LoginRequest):
# 解密请求数据
login_data = decrypt(request.data, key, iv)
# 业务处理...
# 加密响应数据
encrypted_response = encrypt(response_data, key, iv)
return {"data": encrypted_response}
- 客户端(HTML/JavaScript):
<script src="https://cdn.jsdelivr.net/npm/crypto-js@4.1.1/crypto-js.js"></script>
<script>
let secretKey = '';
let iv = '';
async function getSecret() {
const response = await fetch('/api/getSecret');
const data = await response.json();
secretKey = data.key;
iv = data.iv;
}
function encrypt(data, key, iv) {
return CryptoJS.AES.encrypt(JSON.stringify(data),
CryptoJS.enc.Utf8.parse(key),
{iv: CryptoJS.enc.Utf8.parse(iv), mode: CryptoJS.mode.CBC}).toString();
}
async function login() {
const encryptedData = encrypt(formData, secretKey, iv);
const response = await fetch('/api/login', {
method: 'POST',
body: JSON.stringify({data: encryptedData})
});
// 处理加密响应...
}
</script>
5.2 Galaxy配置步骤
- 安装Galaxy插件
- 配置Java处理脚本(如4.2节示例)
- 启动Burp代理
- 访问测试页面,观察自动加解密效果
6. 支持的加密算法
目前已实现支持:
- AES-CBC
- AES-ECB
- AES-GCM
- RSA
- SM2
扩展建议:
- 在
CryptoUtil类中添加新算法实现 - 更新示例脚本提供使用参考
7. 最佳实践建议
-
表达式优化:
- 精确匹配目标系统
- 排除静态资源请求
- 示例:
request.host.endsWith('target.com') && request.path.startsWith('/api/')
-
异常处理:
- 记录加解密失败日志
- 提供fallback机制保证正常流量通过
-
性能考虑:
- 对于高并发场景优先选择Java实现
- gRPC实现需注意网络延迟
-
调试技巧:
- 使用
log.info()输出关键变量 - 在Repeater模块中单独测试加解密逻辑
- 使用
8. 总结
Galaxy插件的核心优势:
- 高效集成:无需额外代理服务,直接在Burp中完成加解密
- 灵活扩展:支持多种实现方式应对不同场景
- 动态支持:可处理动态密钥等复杂场景
- 易用性:提供丰富示例,常见算法开箱即用
未来发展方向:
- 增加更多算法实现
- 提供可视化配置界面
- 增强错误处理和日志记录
- 支持更多动态密钥获取方式