burpsuite配合mitmproxy实现加解密数据
字数 1195 2025-08-20 18:18:23
Burpsuite配合mitmproxy实现数据加解密教学文档
1. 实现原理概述
Burpsuite通过上游代理(Upstream Proxy)将请求转发给mitmproxy代理,mitmproxy通过加载自定义的加解密脚本实现对请求和响应数据的加解密处理,然后将处理后的请求转发给目标服务器。
2. 环境准备
2.1 安装mitmproxy
pip install mitmproxy
安装完成后,mitmproxy提供三个可执行命令:
mitmproxy:命令行界面版本mitmweb:Web界面版本mitmdump:无界面版本
2.2 Burpsuite配置
- 打开Burpsuite
- 进入"User options"选项卡
- 找到"Upstream Proxy Servers"设置
- 添加mitmproxy作为上游代理:
- 目标主机:通常设置为
*(所有请求) - 代理主机:
127.0.0.1 - 代理端口:mitmproxy监听的端口(如8888)
- 目标主机:通常设置为
3. mitmproxy启动方式
3.1 命令行启动
mitmproxy.exe -p 8888 -s md5.py
3.2 Web界面启动
mitmweb.exe -p 8888 -s md5.py
参数说明:
-p:指定监听端口-s:指定加载的脚本文件(加解密脚本)
4. 加解密脚本开发
4.1 基本结构
一个完整的mitmproxy加解密脚本包含以下部分:
from mitmproxy import http, ctx
class AddonName:
def request(self, flow: http.HTTPFlow) -> None:
# 请求处理逻辑
pass
def response(self, flow: http.HTTPFlow) -> None:
# 响应处理逻辑
pass
addons = [AddonName()]
4.2 MD5加密示例
以下是一个完整的MD5加密处理脚本:
# -*- coding: utf-8 -*-
from mitmproxy import http, ctx
import hashlib
def md5_encryption(pwd):
"""
MD5加密函数
:param pwd: 明文字符串
:return: MD5加密后的字符串
"""
md5 = hashlib.md5()
md5.update(pwd.encode('utf-8'))
md5_pass = md5.hexdigest()
return md5_pass
class MD5:
def request(self, flow: http.HTTPFlow) -> None:
# 获取请求POST数据,如m=1&username=admin&password=admin
data = flow.request.text
# 将数据以'='分切成数组,如['m', '1&username', 'admin&password', 'admin']
d = data.split('=')
# 通过md5_encryption加密方法对明文密码加密
md5_pass = md5_encryption(d[3])
# 将加密后的密文重新赋值给数组
d[3] = md5_pass
# 将数组元素重新变成post字符串格式
data = '='.join(d)
# 将加密后data数据赋值给flow.request.text
flow.request.text = data
# 调试信息输出(可选)
# info = ctx.log.info
# info(data)
def response(self, flow: http.HTTPFlow):
# 获取响应对象
response = flow.response
# 实例化输出类
info = ctx.log.info
# 打印响应码
info(str(response.status_code))
# 打印所有头部
info(str(response.headers))
# 打印cookie头部
info(str(response.cookies))
# 打印响应报文内容
info(str(response.text))
addons = [MD5()]
4.3 脚本功能说明
-
请求处理(request方法):
- 获取请求的原始数据
- 对特定字段进行MD5加密
- 修改请求数据并发送
-
响应处理(response方法):
- 获取服务器响应
- 输出响应状态码、头部、Cookie和内容
- 可用于响应数据的解密处理
5. 实际应用场景
5.1 请求数据加密
适用于:
- 登录密码自动加密
- API请求参数加密
- 敏感数据保护
5.2 响应数据解密
适用于:
- 解密服务器返回的加密数据
- 处理加密的API响应
- 调试加密通信过程
6. 调试技巧
- 使用
ctx.log.info()输出调试信息 - 在Burpsuite中查看原始请求和修改后的请求对比
- 使用mitmweb界面实时观察请求/响应处理
7. 扩展应用
7.1 支持多种加密算法
可以扩展脚本以支持:
- AES加密/解密
- RSA加密/解密
- Base64编码/解码
- 自定义加密算法
7.2 条件处理
可以根据请求特征决定是否进行加解密:
if "login" in flow.request.path:
# 只处理登录请求
pass
7.3 多字段处理
处理包含多个需要加密字段的请求:
params = dict(pair.split('=') for pair in data.split('&'))
params['password'] = md5_encryption(params['password'])
params['token'] = md5_encryption(params['token'])
flow.request.text = '&'.join([f"{k}={v}" for k, v in params.items()])
8. 注意事项
- 确保Burpsuite和mitmproxy的代理设置正确,避免循环代理
- 加解密脚本需要与目标应用的加密逻辑完全一致
- 处理HTTPS请求时需要安装mitmproxy的CA证书
- 复杂的加密逻辑可能需要结合JavaScript引擎(如PyExecJS)来实现
通过以上方法,可以灵活地实现Burpsuite与mitmproxy的配合使用,完成各种复杂的加解密需求,提高安全测试的效率。