一次耗时的安全测试
字数 1135 2025-08-22 18:37:14

安全测试中处理加密数据包的完整指南

1. 背景与挑战

在安全测试过程中,经常会遇到使用加密控件处理数据包的网站系统。这类系统通常具有以下特点:

  • 访问网站前需要安装专用控件
  • 所有请求和响应数据都经过加密处理
  • 传统抓包工具只能获取密文,无法直接分析业务逻辑

2. 加密机制分析

2.1 发现加密接口

  1. 浏览器开发者工具分析

    • 使用关键字"encrypt"、"decrypt"进行全局搜索
    • 重点关注127.0.0.1的本地流量(浏览器与控件的通信)
  2. 代理配置调整

    • 在浏览器代理插件的不代理地址中添加"<-loopback>"以捕获本地流量
    • 确保Burp Suite能够捕获127.0.0.1的通信

2.2 加密接口分析

发现两个关键接口:

  1. 加密接口(encrypt)

    • 请求体:明文数据(JSON格式)
    • 响应体:对应的密文字符串及hash值
  2. 解密接口(decrypt)

    • 请求体:密文字符串
    • 响应体:对应的明文字符串

3. 插件开发方案

3.1 Burp Suite插件开发

核心功能

  1. 对请求体/响应体的密文进行解密
  2. 对Repeater模块的明文请求自动加密

代码实现要点

from burp import IBurpExtender, IMessageEditorTabFactory, IMessageEditorTab
from java.io import PrintWriter
from javax.swing import JPanel, JScrollPane, JTextArea
from java.awt import BorderLayout
import json
import traceback

class BurpExtender(IBurpExtender, IMessageEditorTabFactory):
    def registerExtenderCallbacks(self, callbacks):
        self.callbacks = callbacks
        self.helpers = callbacks.getHelpers()
        self.stdout = PrintWriter(callbacks.getStdout(), True)
        callbacks.setExtensionName("Encrypt And Decryption")
        callbacks.registerMessageEditorTabFactory(self)
        callbacks.registerProxyListener(self)

class CustomTab(IMessageEditorTab):
    def __init__(self, extender, controller, editable):
        self.extender = extender
        self.controller = controller
        self.editable = editable
        self.tabPanel = JPanel(BorderLayout())
        self.textArea = JTextArea()
        self.textArea.setLineWrap(True)
        self.textArea.setWrapStyleWord(True)
        self.textArea.setEditable(editable)
        scrollPane = JScrollPane(self.textArea)
        self.tabPanel.add(scrollPane, BorderLayout.CENTER)
        self.currentMessage = None
        self.isRequest = False
        self.originalText = ""

    # 关键方法实现...
    def setMessage(self, content, isRequest):
        # 处理请求/响应解密逻辑
        try:
            if isRequest:
                info = self.extender.helpers.analyzeRequest(content)
                body = content[info.getBodyOffset():]
                body_string = body.tostring().decode('utf-8', errors='replace')
                jsonBody = json.loads(body_string)
                enStr = jsonBody["enStr"]
                dencryptData = self.decrypt(enStr)
                jsonBody["enStr"] = dencryptData
                formattedBody = json.dumps(jsonBody, indent=4)
                self.textArea.setText(formattedBody.encode("utf-8").decode("utf-8"))
            else:
                # 类似处理响应体...
        except Exception as e:
            self.extender.stdout.println(f"Error occurred: {str(e)} at line {traceback.format_exc()}")
            self.textArea.setText(body_string)

3.2 替代方案:mitmproxy脚本

当Burp插件开发遇到困难时,可使用mitmproxy作为上游代理:

from mitmproxy import http
import json

def request(flow: http.HTTPFlow) -> None:
    if (flow.request.host == "targetHost" 
        and not checkSuffix(flow.request.path) 
        and "targetPath" in flow.request.path 
        and flow.request.method == "POST"):
        
        if "application/json" in flow.request.headers.get("content-type"):
            try:
                bodyJson = flow.request.json()
                if ":" in bodyJson["enStr"]:  # 判断是否为明文
                    bodyJson["enStr"] = encrypt(bodyJson["enStr"])
                flow.request.set_text(json.dumps(bodyJson))
            except Exception as e:
                print("error", str(e))

def checkSuffix(url):
    extension = url.split('.')[-1].lower()
    return extension in ['js', 'png', 'jpg', 'jpeg']

def encrypt(plan_txt):
    # 实现加密逻辑
    pass

4. 测试流程

  1. 安装控件:确保测试环境已安装网站要求的加密控件
  2. 配置代理
    • 设置浏览器代理指向Burp Suite
    • 调整代理设置以捕获本地流量
  3. 捕获流量
    • 浏览网站功能,捕获加密/解密接口调用
  4. 分析加密机制
    • 确定加密算法和密钥管理方式
    • 记录加密/解密接口的调用方式
  5. 开发插件/脚本
    • 根据分析结果实现加解密功能
  6. 执行测试
    • 通过插件直接修改明文参数
    • 观察系统行为,发现安全漏洞

5. 常见问题解决

  1. 无法捕获本地流量

    • 确认代理设置中包含<-loopback>
    • 检查防火墙是否阻止了本地通信
  2. 加密插件不工作

    • 检查Burp API版本兼容性
    • 验证JSON解析逻辑是否正确
    • 确保解密函数正确实现
  3. 性能问题

    • 对于大量请求,考虑缓存加密结果
    • 优化JSON解析和数据处理逻辑

6. 安全测试发现

通过此方法,可以有效地发现以下类型漏洞:

  1. 越权访问:通过修改明文参数测试权限控制
  2. 业务逻辑漏洞:直接分析业务数据处理流程
  3. 敏感信息泄露:检查解密后的响应数据
  4. 输入验证缺陷:测试各种边界情况和异常输入

7. 总结

处理加密数据包的安全测试需要:

  1. 深入分析加密机制和接口调用方式
  2. 开发适合的工具链(Burp插件或mitmproxy脚本)
  3. 建立明文测试的工作流程
  4. 系统性地测试各种安全边界条件

这种方法不仅适用于当前案例,也可推广到其他使用类似加密机制的系统测试中。

安全测试中处理加密数据包的完整指南 1. 背景与挑战 在安全测试过程中,经常会遇到使用加密控件处理数据包的网站系统。这类系统通常具有以下特点: 访问网站前需要安装专用控件 所有请求和响应数据都经过加密处理 传统抓包工具只能获取密文,无法直接分析业务逻辑 2. 加密机制分析 2.1 发现加密接口 浏览器开发者工具分析 : 使用关键字"encrypt"、"decrypt"进行全局搜索 重点关注127.0.0.1的本地流量(浏览器与控件的通信) 代理配置调整 : 在浏览器代理插件的不代理地址中添加" <-loopback>"以捕获本地流量 确保Burp Suite能够捕获127.0.0.1的通信 2.2 加密接口分析 发现两个关键接口: 加密接口(encrypt) : 请求体:明文数据(JSON格式) 响应体:对应的密文字符串及hash值 解密接口(decrypt) : 请求体:密文字符串 响应体:对应的明文字符串 3. 插件开发方案 3.1 Burp Suite插件开发 核心功能 对请求体/响应体的密文进行解密 对Repeater模块的明文请求自动加密 代码实现要点 3.2 替代方案:mitmproxy脚本 当Burp插件开发遇到困难时,可使用mitmproxy作为上游代理: 4. 测试流程 安装控件 :确保测试环境已安装网站要求的加密控件 配置代理 : 设置浏览器代理指向Burp Suite 调整代理设置以捕获本地流量 捕获流量 : 浏览网站功能,捕获加密/解密接口调用 分析加密机制 : 确定加密算法和密钥管理方式 记录加密/解密接口的调用方式 开发插件/脚本 : 根据分析结果实现加解密功能 执行测试 : 通过插件直接修改明文参数 观察系统行为,发现安全漏洞 5. 常见问题解决 无法捕获本地流量 : 确认代理设置中包含 <-loopback> 检查防火墙是否阻止了本地通信 加密插件不工作 : 检查Burp API版本兼容性 验证JSON解析逻辑是否正确 确保解密函数正确实现 性能问题 : 对于大量请求,考虑缓存加密结果 优化JSON解析和数据处理逻辑 6. 安全测试发现 通过此方法,可以有效地发现以下类型漏洞: 越权访问 :通过修改明文参数测试权限控制 业务逻辑漏洞 :直接分析业务数据处理流程 敏感信息泄露 :检查解密后的响应数据 输入验证缺陷 :测试各种边界情况和异常输入 7. 总结 处理加密数据包的安全测试需要: 深入分析加密机制和接口调用方式 开发适合的工具链(Burp插件或mitmproxy脚本) 建立明文测试的工作流程 系统性地测试各种安全边界条件 这种方法不仅适用于当前案例,也可推广到其他使用类似加密机制的系统测试中。