api-mitmproxy api-mitmproxy

mitmproxy是一个用于API安全测试的交互式HTTPS代理工具,支持流量的拦截、修改和重放。它覆盖了HTTP/1、HTTP/2、HTTP/3和WebSockets等现代API安全测试所需的协议,提供了Python脚本API以实现自动化测试,并具备多种界面(控制台、Web、CLI)以适应不同的使用场景。

渗透测试 0 次安装 0 次浏览 更新于 3/1/2026

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安全测试和分析:

  1. 启动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
    
  2. 配置目标应用程序使用代理(HTTP: localhost:8080)
  3. 在客户端设备上安装mitmproxy CA证书
  4. 从应用程序触发API请求
  5. 在mitmproxy中拦截和检查请求/响应
  6. 修改请求以测试:
    • 认证绕过尝试
    • 授权缺陷(IDOR, 权限提升)
    • 输入验证(SQLi, XSS, 命令注入)
    • 业务逻辑漏洞
  7. 保存流量以供文档记录和报告

工作流程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流量:

  1. 启动mitmdump并捕获流量:
    mitmdump -w api-traffic.flow --mode regular
    
  2. 运行自动化测试或手动应用交互
  3. 停止mitmdump(Ctrl+C)以保存流量
  4. 重放捕获的流量:
    # 重放到服务器
    mitmdump -nc -r api-traffic.flow
    
    # 通过脚本重放并修改
    mitmdump -s replay-script.py -r api-traffic.flow
    
  5. 导出为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测试

用于自定义逻辑的自动化安全测试:

  1. 创建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()]
    
  2. 使用脚本运行mitmproxy:
    mitmproxy -s api-test.py
    # 或自动化
    mitmdump -s api-test.py -w results.flow
    
  3. 查看自动化发现和捕获的流量
  4. 导出结果以供报告

工作流程5:SSL/TLS证书固定绕过

用于测试具有证书固定的移动应用:

  1. 在设备上安装mitmproxy CA证书
  2. 使用证书解除固定工具或框架修改:
    • Android:用于SSL解除固定的Frida脚本
    • iOS:SSL Kill Switch或类似工具
  3. 通过mitmproxy配置应用流量
  4. 或者,使用反向代理模式:
    mitmproxy --mode reverse:https://api.example.com --listen-host 0.0.0.0 --listen-port 443
    
  5. 修改/etc/hosts将API域重定向到mitmproxy
  6. 正常拦截和分析流量

操作模式

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拦截:

浏览器/桌面:

  1. 启动mitmproxy并配置代理设置
  2. 访问http://mitm.it
  3. 下载您的平台的证书
  4. 安装在系统/浏览器证书存储中

Android:

  1. 将证书推送到设备:adb push ~/.mitmproxy/mitmproxy-ca-cert.cer /sdcard/
  2. 设置 → 安全 → 从SD卡安装
  3. 选择mitmproxy证书

iOS:

  1. 通过电子邮件发送证书或在Web服务器上托管
  2. 在设备上安装配置文件
  3. 设置 → 常规 → 关于 → 证书信任设置
  4. 启用对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等敏感数据的合规性
  • 安全默认:使用隔离的测试环境。避免在没有明确授权的情况下拦截生产流量

集成点

渗透测试工作流程

  1. 侦察:通过mitmproxy识别API端点
  2. 认证测试:捕获和分析认证令牌
  3. 授权测试:修改用户ID、角色、权限
  4. 输入验证:注入负载以测试漏洞
  5. 业务逻辑:测试工作流程中的逻辑缺陷
  6. 将发现导出为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应用的标准工作流程:

  1. 配置设备使用mitmproxy
  2. 安装CA证书
  3. 如果需要,绕过SSL固定
  4. 行使应用功能
  5. 分析API安全(OWASP移动Top 10)
  6. 记录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集成

参考