某次众测的加解密对抗
字数 1593 2025-08-23 18:31:18
基于Sekiro和AutoDecoder的BurpSuite加解密对抗实战教学
1. 背景与问题描述
在某次众测过程中,遇到请求包和响应包全部采用密文传输的情况,这给渗透测试带来了很大挑战。通过分析发现:
- 前端对用户输入进行了加密处理
- 后端返回的数据也是加密形式
- 加密算法为AES,但key和iv并非硬编码
- 每次刷新页面,key和iv会发生变化
2. 技术栈与工具准备
实现BurpSuite中的加解密需要以下工具:
- Sekiro:用于RPC转发,建立浏览器JS环境与外部通信
- Flask:用于编写自定义加解密接口
- AutoDecoder:Burp插件,用于请求/响应加解密转发
- 浏览器开发者工具:用于调试前端加密逻辑
3. 加密逻辑分析
3.1 定位加密函数
- 通过Burp拦截搜索请求,发现请求和响应均为密文
- 在浏览器开发者工具中搜索
getData等关键函数 - 定位到加密函数为
Object(r["b"]),解密函数为Object(r["a"]) - 通过控制台打印并跟进函数定义
3.2 AES加解密分析
加密函数调用形式:
Object(r["b"])(e.data, b.dfg, b.cvb)
其中:
e.data:待加密数据b.dfg:AES密钥(key)b.cvb:初始化向量(iv)
4. RPC实现方案
4.1 Sekiro配置
- 创建Sekiro分组(避免使用匿名分组,提高性能)
- 注入浏览器JS代码(本地RPC需将wss协议改为ws):
var client = new SekiroClient("ws://localhost:端口号/business/register?group=分组名&clientId=" + Math.random());
4.2 注册加解密Action
// 加密Action
client.registerAction("aes_enc", function(request, resolve, reject){
resolve(enc(request["enc_par"], request["key"], request["iv"]));
});
// 解密Action
client.registerAction("aes_dec", function(request, resolve, reject){
resolve(dec(request["dec_par"], request["key"], request["iv"]));
});
4.3 解决key/iv随机问题
初始方案:通过debug获取key和iv后硬编码到Flask服务,但页面刷新后失效。
根本原因:
- key/iv存储在
sessionStorage中,页面刷新会重置 - 通过修改user-agent可使其存储在
localStorage中
解决方案:
- 分析存储函数:
function f(e,t){
e = "bqzt_" + e;
var a = "sessionStorage";
if(/mqqbrowser/i.test(window.navigator.userAgent) && (a = "localStorage"), window[a]){
var i = window[a][e] || "";
return t && i && (i = JSON.parse(i)), i
}
console.log("当前浏览器不支持sessionStorage")
}
- 修改user-agent为QQ浏览器,使数据存储在
localStorage - 更新Action注册代码:
client.registerAction("aes_enc", function(request, resolve, reject){
resolve(enc(request["enc_par"],
JSON.parse(localStorage.getItem("bqzt_randomRequest")).dfg,
JSON.parse(localStorage.getItem("bqzt_randomRequest")).cvb));
});
5. Flask接口实现
5.1 加密接口示例
@app.route('/aes_encode', methods=["POST"])
def encrypt():
param = request.form.get('dataBody') # 获取post参数
data = {
"group": "分组名",
"sekiro_token": "xxxxx", # 在sekiro的管理页面
"action": "aes_enc", # 注册的action名字
"enc_par": param,
"bind_client": "设备名", # 必须添加,避免多设备转发问题
"key": key,
"iv": iv
}
res = requests.post(url, data)
enc = json.loads(res.text)['data']
return enc
关键参数说明:
bind_client:指定设备ID,避免多设备转发混乱sekiro_token:从Sekiro管理页面获取的认证token
6. AutoDecoder配置
- 在BurpSuite中安装AutoDecoder插件
- 配置上游代理指向Flask服务
- 设置请求加密和响应解密规则
- 确保所有操作在同一浏览器环境中进行(保持
localStorage可用)
7. 完整工作流程
- 浏览器访问目标网站,注入Sekiro客户端JS代码
- 注册加解密Action,从
localStorage获取实时key/iv - Flask服务接收Burp通过AutoDecoder转发的请求
- Flask调用Sekiro RPC接口执行实际加解密
- 结果返回给BurpSuite,实现透明加解密
8. 注意事项
- 浏览器环境一致性:确保JS注入页面和测试页面在同一浏览器中,共享
localStorage - User-Agent设置:必须修改为QQ浏览器模式,使key/iv存储在
localStorage - Sekiro分组:避免使用匿名分组,提高性能
- 设备绑定:必须指定
bind_client参数,避免多设备问题 - 错误处理:在Flask接口中添加适当的错误处理和日志记录
9. 实际效果
通过此方案,可以在BurpSuite中实现:
- 拦截时自动解密请求和响应
- 重放时自动加密修改后的请求
- 扫描时自动处理加密数据
- 保持加解密key/iv的实时同步
10. 安全测试应用
此技术可应用于:
- 加密接口的SQL注入测试
- 加密传输的XSS漏洞挖掘
- 加密API的逻辑漏洞测试
- 其他需要处理加密数据的渗透测试场景
通过这种加解密对抗技术,作者在实际测试中成功挖掘出了高危漏洞,证明了该方案的有效性。