Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >测试协议代理神器mitmproxy

测试协议代理神器mitmproxy

作者头像
TestOps
发布于 2022-04-07 08:21:56
发布于 2022-04-07 08:21:56
1.7K0
举报
文章被收录于专栏:TestOps云层TestOps云层

mitmproxy 是什么

mitmproxy 是一个免费的开源交互式的 HTTPS 代理。mitmproxy 就是用于MITM 的proxy,MITM即中间人攻击(Man-in-the-middle attack),用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次会看看请求或者响应结果信息,记录其截获的数据或篡改数据,引发服务端或客户端特定的行为。

为什么选择mitmproxy

  • 相对于我们常用的 fiddle 代理工具,它是可以跨平台;
  • 相对于跨平台的 charles 代理工具,它是开源免费的;
  • 最重要的一点,也是为什么我们采用 mitmproxy 来进行做 Mock,它支持使用 Python 进行二次开发,这样就可以结合业务进行灵活拓展了。

mitmproxy 构成

  • mitmproxy:是一个控制台工具,允许交互式检查和修改 HTTP 流量
  • mitmweb:mitmproxy 是基于 Web 的用户界面,它允许交互式检查和修改 HTTP 流量
  • mitmdump:mitmproxy 的命令行版本。它提供了类似 tcpdump 的功能,可查看、记录和以编程方式转换 HTTP 流量(我们在接下来的场景中使用的就是这个)

环境安装

sudo apt-get install mitmproxy

pip3 install mitmproxy

核心 API介绍

mitmproxy 插件编写主要是基于事件可以在不同层面上分为 5 类:HTTP、TCP、WebSocket、Network、General。

其中最常用的就是 HTTP 事件,主要如下:(其中我们在我们接下来的使用场景主要会用到 request、response这两个事件函数)

1. 收到了来自客户端的HTTP CONNECT 请求

在 flow 上设置非 2xx 响应将返回该响应并断开连接。

CONNECT 不是常用的HTTP 请求方法,目的是与服务器建立代理连接,仅是 client 与proxy 的之间的交流,所以CONNECT 请求不会触发request、response等其他常规的 HTTP 事件。

def http_connect(self, flow:mitmproxy.http.HTTPFlow):

2. 来自客户端的HTTP 请求的头部被成功读取

此时 flow 中的 request 的body 是空的。

def requestheaders(self, flow:mitmproxy.http.HTTPFlow):

3. 来自客户端的HTTP 请求被成功完整读取

def request(self, flow:mitmproxy.http.HTTPFlow):

4. 来自服务端的HTTP 响应的头部被成功读取

此时 flow 中的 response 的body 是空的。

def responseheaders(self, flow:mitmproxy.http.HTTPFlow):

5. 来自服务端端的HTTP 响应被成功完整读取

def response(self, flow:mitmproxy.http.HTTPFlow):

发生了一个 HTTP 错误。比如无效的服务端响应、连接断开等。注意与“有效的HTTP 错误返回”不是一回事,后者是一个正确的服务端响应,只是 HTTP code 表示错误而已。

def error(self, flow:mitmproxy.http.HTTPFlow):

关键字段介绍(flow 对象)

flow.request.host 请求 host

flow.request.method 请求方法

flow.request.scheme 请求协议

flow.request.url 请求 URL 链接

flow.request.query 请求 URL 查询参数

flow.request.path 请求 URL 路径

flow.request.urlencoded_form 请求 POST 参数

flow.response.status_code HTTP 响应状态码

flow.response.headers HTTP 响应头信息

flow.response.get_text HTTP 响应内容

如何编写一个插件

插件的作用主要是用于拦截请求,根据自身业务需求,在不同的事件函数中,添加业务逻辑处理代码。

插件的编写格式相对比较简单,如果不熟悉如何编写,可参考官方样例:

https://github.com/mitmproxy/mitmproxy/blob/master/examples/addons

Mock 测试场景

场景介绍:测试“我关注的人”列表,超过一屏,是否能够正常显示。(为了便于快速测试,所以我们采用 Mock 的方式,构造数据)

拦截篡改 http 请求的工具类,包含的功能主要有:

  • 拦截请求并请求 header 信息
  • 拦截请求及修改 body 信息
  • 拦截请求方法及修改类型,e.g. get/post
  • 拦截请求及修改 query 参数
  • 拦截响应并修改响应状态码
  • 拦截响应并修改响应头信息
  • 拦截响应并修改响应正文信息
  • 拦截响应并构造响应信息,e.g. 状态码、响应头、响应体

classHTTPRecordModifier:

def__init__(self, flow: http.HTTPFlow):

self.flow = flow

//设置请求头信息

defset_request_header(self, headers):

for header_key, header_value in headers.items():

self.flow.request.headers[header_key]= header_value

//设置请求 body 参数

defset_request_body(self, body):

self.flow.request.content =bytes(body,"utf-8")

//设置请求方法

defset_request_method(self, method):

self.flow.request.method = method

//设置请求 query 参数

defset_request_query(self, key, value):

self.flow.request.query[key]= value

//设置响应状态码

defset_response_status_code(self, code):

self.flow.response.status_code = code

//设置响应头信息

defset_response_header(self, headers):

for header_key, header_value in headers.items():

self.flow.response.headers[header_key]= header_value

//设置响应体内容

defset_response_body(self, body):

self.flow.response.content =bytes(body,"utf-8")

//构造响应报文

defcreate_mocked_response(self, code=200, header={}, body=""):

self.flow.response = http.HTTPResponse.make(code,bytes(body,"utf-8"), header)

启动 mitmproxy 插件脚本,如下:

mitmdump -s ./mockbusiness.py

Mitmproxy也有Java版本,帮助快速拆分服务构建代理。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 TestOps 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
App爬虫神器mitmproxy和mitmdump的使用
mitmproxy是一个支持HTTP和HTTPS的抓包程序,有类似Fiddler、Charles的功能,只不过它是一个控制台的形式操作。 mitmproxy还有两个关联组件。一个是mitmdump,它是mitmproxy的命令行接口,利用它我们可以对接Python脚本,用Python实现监听后的处理。另一个是mitmweb,它是一个Web程序,通过它我们可以清楚观察mitmproxy捕获的请求。 下面我们来了解它们的用法。 一、准备工作 请确保已经正确安装好了mitmproxy,并且手机和PC处于同一个
崔庆才
2018/06/25
10.7K0
python mitmproxy 文档
1、顾名思义,mitmproxy 就是用于 MITM 的 proxy,MITM 即[中间人攻击],用于中间人攻击的代理首先会向正常的代理一样转发请求,保障服务端与客户端的通信,其次,会适时的查、记录其截获的数据,或篡改数据,引发服务端或客户端特定的行为。 2、不同于 fiddler 或 wireshark 等抓包工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。举例来说,利用 fiddler 可以过滤出浏览器对某个特定 url 的请求,并查看、分析其数据,但实现不了高度定制化的需求,类似于:“截获对浏览器对该 url 的请求,将返回内容置空,并将真实的返回内容存到某个数据库,出现异常时发出邮件通知”。而对于 mitmproxy,这样的需求可以通过载入自定义 python 脚本轻松实现。 3、但 mitmproxy 并不会真的对无辜的人发起中间人攻击,由于 mitmproxy 工作在 HTTP 层,而当前 HTTPS 的普及让客户端拥有了检测并规避中间人攻击的能力,所以要让 mitmproxy 能够正常工作,必须要让客户端(APP 或浏览器)主动信任 mitmproxy 的 SSL 证书,或忽略证书异常,这也就意味着 APP 或浏览器是属于开发者本人的——显而易见,这不是在做黑产,而是在做开发或测试。 4、那这样的工具有什么实际意义呢?据我所知目前比较广泛的应用是做仿真爬虫,即利用手机模拟器、无头浏览器来爬取 APP 或网站的数据,mitmproxy 作为代理可以拦截、存储爬虫获取到的数据,或修改数据调整爬虫的行为。 事实上,以上说的仅是 mitmproxy 以正向代理模式工作的情况,通过调整配置,mitmproxy 还可以作为透明代理、反向代理、上游代理、SOCKS 代理等,但这些工作模式针对 mitmproxy 来说似乎不大常用,故本文仅讨论正向代理模式。 5、python脚本不要小于3.6 6、安装完后,mitmdump 是命令行工具,mitmweb是一个web界面。
用户5760343
2022/05/14
1.1K0
python mitmproxy 文档
mitmproxy抓包 | Python实时生成接口自动化用例(三)
前面已经给大家分享了mitmproxy的环境配置和基本使用,文章浏览量很高,相信对抓包工具感兴趣的朋友,已经熟练运用起来了。
王大力测试进阶之路
2022/03/14
3.7K0
mitmproxy抓包 | Python实时生成接口自动化用例(三)
[602]app抓包之mitmproxy的安装和使用
mitmproxy是一个支持HTTP和HTTPS的抓包程序,类似Fiddler、Charles的功能,只不过它通过控制台的形式操作。
周小董
2022/04/13
4.9K0
[602]app抓包之mitmproxy的安装和使用
APP爬虫-mitmproxy安装与简单使用
我们通常使用的抓包工具就是Fiddler和Charles这种图形化的,Charles的优点是跨平台,Windows和Mac都可以使用,Fiddler的优点是功能“极其”强大,不仅拥有抓包功能,还拥有中间人攻击的功能,但是使用成本太高了,我们做爬虫开发,使用到Fiddler的功能不过十之二三罢了。今天我们主要讲的是mitmproxy这款工具,这是一款专业的中间人攻击工具,mitmproxy 不仅可以截获请求帮助开发者查看、分析,最最重要的是支持Python进行定制化二次开发。例如:截获浏览器的请求内容,并将数据处理后存储到数据库,再将内容交给浏览器;如果出现异常时,发出邮件通知,并返回给浏览器一个空的页面。 mitmproxy有以下几个特点:
星星在线
2020/05/22
2.2K0
python抓包代理库mitmproxy
python中一个库mitmproxy,可以实现抓包;实现的就是代理的功能;相对于其他软件,优势在于可以编码;
JQ实验室
2022/11/04
1.1K0
Python好酷|抓包神器 mitmproxy
mitmproxy(Man-in-the-middle attack,中间人攻击代理)是一款提供交互能力的抓包工具,可以用来拦截、修改、保存 HTTP/HTTPS 请求,对于爬虫尤其是基于APP的爬虫来说,是必不可少的一款神器。mitmproxy 基于Python开发,可以通过Python代码对请求和响应进行自定义过滤和修改。
互联网金融打杂
2022/08/01
1.8K0
Python好酷|抓包神器 mitmproxy
python mitmproxy request,response属性信息
介绍 mitmdump无交互界面的命令,与python脚本对接,来源于mitmproxy支持inline script,这里的script指的是python脚本,inline script提供了http、Websocket、tcp等各个时间点事件(events)的hook函数,如http中的request、response等
用户5760343
2022/05/14
9250
Mitmproxy代理配置及接口加解密详细教程
mitmproxy 提供一个命令行界面(该命令不支持windows)。mitmdump 提供一个简单的终端输出。mitmweb 提供一个浏览器界面。
梦无矶小仔
2023/09/08
3.3K0
Mitmproxy代理配置及接口加解密详细教程
小巧实用的HTTP代理抓包工具:mitmproxy
这步比较简单,直接pip install mitmproxy,或者自行下载安装包。更多更详细的安装说明可以查看这篇文章:MitmProxy的安装
happyJared
2018/12/05
1.1K0
小巧实用的HTTP代理抓包工具:mitmproxy
云函数实现代理
博客貌似有很久很久没有更新了。但是其实并没有停止学习(笔记大部分写到了语雀上,有空闲时间同步到博客)。今天看了公众号里的一篇文章,自己实际操作了一下发现有一些坑,所以来做个记录
用户2700375
2022/06/09
1.9K0
云函数实现代理
使用mitmproxy进行埋点测试
mitmproxy不仅可以截获请求帮助开发者查看、分析,更可以通过自定义脚本进行二次开发。
zx钟
2021/10/11
9230
Mitmproxy 抓包工具安装使用
Mitmproxy是一个使用python编写的中间人代理工具,跟Fiddle、Charles等等的抓包工具是差不多的,同样可以用于拦截、修改、保存http/https请求。比起Fiddle、Charles,mitmproxy有一个最大的特点是支持python自定义脚本。
清风穆云
2021/10/18
1.4K0
Mitmproxy 抓包工具安装使用
移动端异常数据测试
比如后端接口数据返回某个字段为空、某个字段类型变了、数组为空等.此时如果客户端没有兼容这些异常行为,大多数情况会导致崩溃.
测试加
2022/03/24
1.1K0
移动端异常数据测试
python mitmproxy事件流程
class Events: # HTTP lifecycle def http_connect(self, flow: mitmproxy.http.HTTPFlow): """ An HTTP CONNECT request was received. Setting a non 2xx response on the flow will return the response to the client abort the connection. CONNECT requests and r
用户5760343
2022/05/13
5570
最佳网络数据抓包工具mitmproxy
日常测试客户端需求,经常会使用Fiddler、Charles工具,抓取网络请求内容。Fiddler、Charles也有使用上的不足,比如Fiddler仅支持winsows、Charles是收费的,另外Fiddler、Charles在扩展开发脚本上都比较薄弱。
测试加
2022/06/21
8400
最佳网络数据抓包工具mitmproxy
云函数各种使用方式
云函数代理蚁剑流量 1.创建云函数 #!/usr/bin/env # -*- coding:utf-8 -*- import requests import json from urllib.parse import urlsplit def geturl(urlstr): jurlstr = json.dumps(urlstr) dict_url = json.loads(jurlstr) return dict_url['url'] def main_handler(e
R0A1NG
2022/02/19
1.3K0
云函数各种使用方式
基于mitmproxy的录制回放接口测试工具
在微服务架构下,进行核心接口质量保障是非常重要的,当下比较流行的方式是契约测试,会使我们的测试效率变得更高。
测试加
2022/06/21
1.4K0
基于mitmproxy的录制回放接口测试工具
mitmproxy的使用
一.介绍 中间人代理可以理解成和中间件差不多 mitmproxy工程工具包,主要包含了3个组件 mitmproxy:拦截的http(s)记录控制台显示 【window不支持】 mitmdump:命令行接口,可以对接python脚本,通过脚本实现监听后的处理,可定制个人需求 mitmweb:web形式展示 二.安装 pip3 install mitmproxy 三.使用 手机要和电脑关联上 cmd运行IPconfig获取本机IPve地址 浏览器输入本就地址:8080也就是mitmproxy的地址 如果是pc
小小咸鱼YwY
2020/06/19
8390
有了mitmdump还不赶紧扔掉Charles
mitmproxy由三大功能模块组成,mitmproxy、mitmweb、mitmdump。
测试加
2022/06/21
1.3K0
有了mitmdump还不赶紧扔掉Charles
相关推荐
App爬虫神器mitmproxy和mitmdump的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文