api-mitmproxy 描述: 交互式HTTPS代理,用于API安全测试,具备流量拦截、修改和重放功能。支持HTTP/1、HTTP/2、HTTP/3、WebSockets和TLS保护协议。包括Python脚本API用于自动化和多个界面(控制台、Web、CLI)。使用场景: (1) 拦截和分析API流量进行安全测试,(2) 修改HTTP/HTTPS请求和响应以测试API行为,(3) 记录和重放API流量进行测试,(4) 调试移动应用或厚客户端API通信,(5) 使用Python脚本自动化API安全测试,(6) 导出流量为HAR格式进行分析。 版本:0.1.0 维护者:SirAppSec 类别:应用安全 标签:[api测试, 代理, https, 拦截代理, 流量分析, mitmproxy, har导出, websockets] 框架:[OWASP] 依赖: python: “>=3.9” 工具:[mitmproxy, mitmweb, mitmdump] 参考:
mitmproxy API安全测试
概览
mitmproxy是一个交互式、支持TLS的拦截HTTP代理,用于渗透测试人员和开发者。它能够实时检查、修改和重放HTTP/HTTPS流量,包括API、移动应用和厚客户端。支持HTTP/1、HTTP/2、HTTP/3和WebSockets,mitmproxy为现代API安全测试提供全面覆盖。
界面
mitmproxy - 带有键盘导航的交互式控制台界面 mitmweb - 基于Web的GUI,用于视觉流量检查 mitmdump - 用于自动化流量捕获和脚本的命令行工具
快速开始
安装并运行mitmproxy:
# 通过pip安装
pip install mitmproxy
# 启动交互式控制台代理
mitmproxy
# 启动Web界面(默认:http://127.0.0.1:8081)
mitmweb
# 启动命令行代理并输出
mitmdump -w traffic.flow
配置客户端使用代理(默认:localhost:8080)
核心工作流程
工作流程1:交互式API流量检查
用于手动API安全测试和分析:
- 启动mitmproxy或mitmweb:
# 控制台界面 mitmproxy --mode regular --listen-host 0.0.0.0 --listen-port 8080 # 或Web界面 mitmweb --mode regular --listen-host 0.0.0.0 --listen-port 8080 - 配置目标应用程序使用代理(HTTP: localhost:8080)
- 在客户端设备上安装mitmproxy CA证书
- 从应用程序触发API请求
- 在mitmproxy中拦截和检查请求/响应
- 修改请求以测试:
- 认证绕过尝试
- 授权缺陷(IDOR, 权限提升)
- 输入验证(SQLi, XSS, 命令注入)
- 业务逻辑漏洞
- 保存流量以供文档记录和报告
工作流程2:移动应用API安全测试
进度: [ ] 1. 在移动设备上安装mitmproxy CA证书 [ ] 2. 配置设备WiFi使用mitmproxy作为代理 [ ] 3. 启动mitmweb进行视觉流量检查 [ ] 4. 启动移动应用并行使所有功能 [ ] 5. 审查API端点、认证机制、数据流 [ ] 6. 测试常见API漏洞(OWASP API Top 10) [ ] 7. 将流量导出为HAR以进行进一步分析 [ ] 8. 用请求/响应示例记录发现
系统地完成每个步骤。完成的项目打勾。
工作流程3:自动化API流量记录
用于大规模捕获和分析API流量:
- 启动mitmdump并捕获流量:
mitmdump -w api-traffic.flow --mode regular - 运行自动化测试或手动应用交互
- 停止mitmdump(Ctrl+C)以保存流量
- 重放捕获的流量:
# 重放到服务器 mitmdump -nc -r api-traffic.flow # 通过脚本重放并修改 mitmdump -s replay-script.py -r api-traffic.flow - 导出为HAR格式以进行分析:
# 使用Python API python3 -c "from mitmproxy.io import FlowReader; from mitmproxy.tools.dump import DumpMaster; import sys; [print(flow.request.url) for flow in FlowReader(open('api-traffic.flow', 'rb')).stream()]"
工作流程4:Python脚本用于API测试
用于自定义逻辑的自动化安全测试:
- 创建Python插件脚本(api-test.py):
from mitmproxy import http class APISecurityTester: def request(self, flow: http.HTTPFlow) -> None: # 修改请求 if "api.example.com" in flow.request.pretty_url: # 测试授权绕过 flow.request.headers["X-User-ID"] = "1" def response(self, flow: http.HTTPFlow) -> None: # 分析响应 if flow.response.status_code == 200: if "admin" in flow.response.text: print(f"[!] 潜在权限提升:{flow.request.url}") addons = [APISecurityTester()] - 使用脚本运行mitmproxy:
mitmproxy -s api-test.py # 或自动化 mitmdump -s api-test.py -w results.flow - 查看自动化发现和捕获的流量
- 导出结果以供报告
工作流程5:SSL/TLS证书固定绕过
用于测试具有证书固定的移动应用:
- 在设备上安装mitmproxy CA证书
- 使用证书解除固定工具或框架修改:
- Android:用于SSL解除固定的Frida脚本
- iOS:SSL Kill Switch或类似工具
- 通过mitmproxy配置应用流量
- 或者,使用反向代理模式:
mitmproxy --mode reverse:https://api.example.com --listen-host 0.0.0.0 --listen-port 443 - 修改/etc/hosts将API域重定向到mitmproxy
- 正常拦截和分析流量
操作模式
mitmproxy支持多种部署模式:
常规代理模式(默认):
mitmproxy --mode regular --listen-port 8080
客户端明确配置代理设置。
透明代理模式(对客户端不可见):
mitmproxy --mode transparent --listen-port 8080
需要iptables/pf规则重定向流量。
反向代理模式(位于服务器前面):
mitmproxy --mode reverse:https://api.example.com --listen-port 443
mitmproxy作为服务器端点。
上游代理模式(链式代理):
mitmproxy --mode upstream:http://corporate-proxy:8080
通过另一个代理路由流量。
证书安装
安装mitmproxy CA证书以进行HTTPS拦截:
浏览器/桌面:
- 启动mitmproxy并配置代理设置
- 访问http://mitm.it
- 下载您的平台的证书
- 安装在系统/浏览器证书存储中
Android:
- 将证书推送到设备:
adb push ~/.mitmproxy/mitmproxy-ca-cert.cer /sdcard/ - 设置 → 安全 → 从SD卡安装
- 选择mitmproxy证书
iOS:
- 通过电子邮件发送证书或在Web服务器上托管
- 在设备上安装配置文件
- 设置 → 常规 → 关于 → 证书信任设置
- 启用对mitmproxy证书的信任
常见模式
模式1:API认证测试
测试认证机制和令牌处理:
# auth-test.py
from mitmproxy import http
class AuthTester:
def __init__(self):
self.tokens = []
def request(self, flow: http.HTTPFlow):
# 捕获认证令牌
if "authorization" in flow.request.headers:
token = flow.request.headers["authorization"]
if token not in self.tokens:
self.tokens.append(token)
print(f"[+] 捕获令牌:{token[:20]}...")
# 测试缺少认证
if "api.example.com" in flow.request.url:
flow.request.headers.pop("authorization", None)
print(f"[*] 测试未认证:{flow.request.path}")
addons = [AuthTester()]
模式2:API参数模糊测试
模糊API参数以测试注入漏洞:
# fuzz-params.py
from mitmproxy import http
class ParamFuzzer:
def request(self, flow: http.HTTPFlow):
if flow.request.method == "POST" and "api.example.com" in flow.request.url:
# 克隆并修改请求
original_body = flow.request.text
payloads = ["' OR '1'='1", "<script>alert(1)</script>", "../../../etc/passwd"]
for payload in payloads:
# 修改参数并测试
# (实现取决于内容类型)
print(f"[*] 测试负载:{payload}")
addons = [ParamFuzzer()]
模式3:GraphQL API测试
检查和测试GraphQL API:
# graphql-test.py
from mitmproxy import http
import json
class GraphQLTester:
def request(self, flow: http.HTTPFlow):
if "/graphql" in flow.request.path:
try:
data = json.loads(flow.request.text)
query = data.get("query", "")
print(f"[+] GraphQL查询:
{query}")
# 测试内省
if "__schema" not in query:
introspection = {"query": "{__schema{types{name}}}"}
print(f"[*] 测试内省")
except:
pass
addons = [GraphQLTester()]
模式4:HAR导出分析
将流量导出为HTTP存档以进行分析:
# 将流量导出为HAR格式
mitmdump -s export-har.py -r captured-traffic.flow
# export-har.py
from mitmproxy import http, ctx
import json
class HARExporter:
def done(self):
har_entries = []
# 构建HAR结构
# (简化 - 使用mitmproxy的内置HAR插件)
ctx.log.info(f"导出{len(har_entries)}条目")
addons = [HARExporter()]
或使用内置插件:
mitmdump --set hardump=./traffic.har
安全考虑
- 敏感数据处理:捕获的流量可能包含凭证、令牌、PII。加密并保护存储的流量。永远不要将流量文件提交到版本控制
- 访问控制:限制对mitmproxy实例的访问。为mitmweb使用身份验证(–web-user/–web-password标志)
- 审计日志:记录所有拦截的流量和修改,以进行安全审计和合规
- 合规性:在拦截生产流量之前确保获得适当的授权。遵守GDPR、PCI-DSS等敏感数据的合规性
- 安全默认:使用隔离的测试环境。避免在没有明确授权的情况下拦截生产流量
集成点
渗透测试工作流程
- 侦察:通过mitmproxy识别API端点
- 认证测试:捕获和分析认证令牌
- 授权测试:修改用户ID、角色、权限
- 输入验证:注入负载以测试漏洞
- 业务逻辑:测试工作流程中的逻辑缺陷
- 将发现导出为HAR以进行报告
CI/CD集成
运行自动化API安全测试:
# 在CI中运行mitmdump与测试脚本
mitmdump -s api-security-tests.py --anticache -w test-results.flow &
PROXY_PID=$!
# 通过代理运行API测试
export HTTP_PROXY=http://localhost:8080
export HTTPS_PROXY=http://localhost:8080
pytest tests/api_tests.py
# 停止代理并分析结果
kill $PROXY_PID
python3 analyze-results.py test-results.flow
移动应用安全测试
iOS/Android应用的标准工作流程:
- 配置设备使用mitmproxy
- 安装CA证书
- 如果需要,绕过SSL固定
- 行使应用功能
- 分析API安全(OWASP移动Top 10)
- 记录API漏洞
高级功能
流量过滤
通过表达式过滤显示的流量:
# 仅显示API调用
mitmproxy --view-filter '~d api.example.com'
# 仅显示POST请求
mitmproxy --view-filter '~m POST'
# 显示具有特定状态的响应
mitmproxy --view-filter '~c 401'
# 组合过滤器
mitmproxy --view-filter '~d api.example.com & ~m POST'
请求/响应修改
使用内置映射器修改流量:
# 替换请求头
mitmproxy --modify-headers '/~u example/Authorization/Bearer fake-token'
# 替换响应主体
mitmproxy --modify-body '/~s & ~b "error"/success'
WebSocket拦截
拦截和修改WebSocket流量:
# websocket-test.py
from mitmproxy import websocket
class WebSocketTester:
def websocket_message(self, flow):
message = flow.messages[-1]
print(f"[+] WebSocket:{message.content[:100]}")
# 修改消息
if message.from_client:
message.content = message.content.replace(b"user", b"admin")
addons = [WebSocketTester()]
故障排除
问题:SSL证书错误
解决方案:确保mitmproxy CA证书正确安装和信任:
# 验证证书位置
ls ~/.mitmproxy/
# 如有需要,重新生成证书
rm -rf ~/.mitmproxy/
mitmproxy # 启动时重新生成
问题:移动应用不通过代理发送流量
解决方案:
- 验证WiFi代理配置
- 检查防火墙规则是否阻止代理端口
- 确保mitmproxy在正确的接口上监听(0.0.0.0)
- 首先用浏览器测试以验证代理是否工作
问题:证书固定阻止拦截
解决方案:使用SSL解除固定工具:
# Android使用Frida
frida -U -l universal-android-ssl-pinning-bypass.js -f com.example.app
# 或修改应用以禁用固定(开发构建)
问题:无法拦截HTTP/2或HTTP/3
解决方案:mitmproxy默认支持HTTP/2。对于HTTP/3:
# 启用HTTP/3支持(实验性)
mitmproxy --set http3=true
OWASP API安全Top 10测试
使用mitmproxy测试OWASP API安全Top 10漏洞:
- API1:破碎的对象级授权 - 修改请求中的对象ID
- API2:破碎的认证 - 测试令牌验证、会话管理
- API3:破碎的对象属性级授权 - 测试大规模分配
- API4:无限制的资源消耗 - 测试速率限制、分页
- API5:破碎的函数级授权 - 修改角色、提升权限
- API6:无限制访问敏感业务流程 - 测试业务逻辑
- API7:服务器端请求伪造 - 在参数中注入URL
- API8:安全配置错误 - 检查头、CORS、错误消息
- API9:不当的库存管理 - 枚举未记录的端点
- API10:不安全地消费API - 测试第三方API集成