一次耗时的安全测试
字数 1135 2025-08-22 18:37:14
安全测试中处理加密数据包的完整指南
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模块的明文请求自动加密
代码实现要点
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. 测试流程
- 安装控件:确保测试环境已安装网站要求的加密控件
- 配置代理:
- 设置浏览器代理指向Burp Suite
- 调整代理设置以捕获本地流量
- 捕获流量:
- 浏览网站功能,捕获加密/解密接口调用
- 分析加密机制:
- 确定加密算法和密钥管理方式
- 记录加密/解密接口的调用方式
- 开发插件/脚本:
- 根据分析结果实现加解密功能
- 执行测试:
- 通过插件直接修改明文参数
- 观察系统行为,发现安全漏洞
5. 常见问题解决
-
无法捕获本地流量:
- 确认代理设置中包含<-loopback>
- 检查防火墙是否阻止了本地通信
-
加密插件不工作:
- 检查Burp API版本兼容性
- 验证JSON解析逻辑是否正确
- 确保解密函数正确实现
-
性能问题:
- 对于大量请求,考虑缓存加密结果
- 优化JSON解析和数据处理逻辑
6. 安全测试发现
通过此方法,可以有效地发现以下类型漏洞:
- 越权访问:通过修改明文参数测试权限控制
- 业务逻辑漏洞:直接分析业务数据处理流程
- 敏感信息泄露:检查解密后的响应数据
- 输入验证缺陷:测试各种边界情况和异常输入
7. 总结
处理加密数据包的安全测试需要:
- 深入分析加密机制和接口调用方式
- 开发适合的工具链(Burp插件或mitmproxy脚本)
- 建立明文测试的工作流程
- 系统性地测试各种安全边界条件
这种方法不仅适用于当前案例,也可推广到其他使用类似加密机制的系统测试中。