某次众测的加解密对抗
字数 1593 2025-08-23 18:31:18

基于Sekiro和AutoDecoder的BurpSuite加解密对抗实战教学

1. 背景与问题描述

在某次众测过程中,遇到请求包和响应包全部采用密文传输的情况,这给渗透测试带来了很大挑战。通过分析发现:

  1. 前端对用户输入进行了加密处理
  2. 后端返回的数据也是加密形式
  3. 加密算法为AES,但key和iv并非硬编码
  4. 每次刷新页面,key和iv会发生变化

2. 技术栈与工具准备

实现BurpSuite中的加解密需要以下工具:

  • Sekiro:用于RPC转发,建立浏览器JS环境与外部通信
  • Flask:用于编写自定义加解密接口
  • AutoDecoder:Burp插件,用于请求/响应加解密转发
  • 浏览器开发者工具:用于调试前端加密逻辑

3. 加密逻辑分析

3.1 定位加密函数

  1. 通过Burp拦截搜索请求,发现请求和响应均为密文
  2. 在浏览器开发者工具中搜索getData等关键函数
  3. 定位到加密函数为Object(r["b"]),解密函数为Object(r["a"])
  4. 通过控制台打印并跟进函数定义

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配置

  1. 创建Sekiro分组(避免使用匿名分组,提高性能)
  2. 注入浏览器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

解决方案

  1. 分析存储函数:
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")
}
  1. 修改user-agent为QQ浏览器,使数据存储在localStorage
  2. 更新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配置

  1. 在BurpSuite中安装AutoDecoder插件
  2. 配置上游代理指向Flask服务
  3. 设置请求加密和响应解密规则
  4. 确保所有操作在同一浏览器环境中进行(保持localStorage可用)

7. 完整工作流程

  1. 浏览器访问目标网站,注入Sekiro客户端JS代码
  2. 注册加解密Action,从localStorage获取实时key/iv
  3. Flask服务接收Burp通过AutoDecoder转发的请求
  4. Flask调用Sekiro RPC接口执行实际加解密
  5. 结果返回给BurpSuite,实现透明加解密

8. 注意事项

  1. 浏览器环境一致性:确保JS注入页面和测试页面在同一浏览器中,共享localStorage
  2. User-Agent设置:必须修改为QQ浏览器模式,使key/iv存储在localStorage
  3. Sekiro分组:避免使用匿名分组,提高性能
  4. 设备绑定:必须指定bind_client参数,避免多设备问题
  5. 错误处理:在Flask接口中添加适当的错误处理和日志记录

9. 实际效果

通过此方案,可以在BurpSuite中实现:

  • 拦截时自动解密请求和响应
  • 重放时自动加密修改后的请求
  • 扫描时自动处理加密数据
  • 保持加解密key/iv的实时同步

10. 安全测试应用

此技术可应用于:

  1. 加密接口的SQL注入测试
  2. 加密传输的XSS漏洞挖掘
  3. 加密API的逻辑漏洞测试
  4. 其他需要处理加密数据的渗透测试场景

通过这种加解密对抗技术,作者在实际测试中成功挖掘出了高危漏洞,证明了该方案的有效性。

基于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加解密分析 加密函数调用形式: 其中: e.data :待加密数据 b.dfg :AES密钥(key) b.cvb :初始化向量(iv) 4. RPC实现方案 4.1 Sekiro配置 创建Sekiro分组(避免使用匿名分组,提高性能) 注入浏览器JS代码(本地RPC需将wss协议改为ws): 4.2 注册加解密Action 4.3 解决key/iv随机问题 初始方案:通过debug获取key和iv后硬编码到Flask服务,但页面刷新后失效。 根本原因 : key/iv存储在 sessionStorage 中,页面刷新会重置 通过修改user-agent可使其存储在 localStorage 中 解决方案 : 分析存储函数: 修改user-agent为QQ浏览器,使数据存储在 localStorage 更新Action注册代码: 5. Flask接口实现 5.1 加密接口示例 关键参数说明 : 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的逻辑漏洞测试 其他需要处理加密数据的渗透测试场景 通过这种加解密对抗技术,作者在实际测试中成功挖掘出了高危漏洞,证明了该方案的有效性。