mitmproxy入门一、python3.10下安装及代理请求修改

一、安装mitmproxy

实验环境:python3.10.11

直接pip install mitmproxy进行安装

安装后打开新的cmd窗口直接输入mitmproxy、mitmweb等命令发现提示不是内部或外部命令,需要添加环境变量。

二、添加系统环境变量

1、先找到mitmproxy安装位置,可以用everything搜索所在文件夹

2、在“此电脑”右键“属性”,然后在弹出的关于页面往下翻到打开“高级系统设置”进行系统变量添加,保存后重新打开cmd窗口执行命令即可

三、安装mitmproxy相关证书以便可以代理https请求

上面一步已经先行运行了web模式的代理,可以看到端口是8080,这时候可以先把系统代理设置为127.0.0.1:8080 然后访问http://mitm.it/进行证书下载(顺序不要反了)

下载证书后直接打开进行受信任的根证书颁发机构安装

安装后大部分浏览器经过mitmproxy代理访问https就不会提示证书问题了,但是火狐浏览器需要在火狐自己的设置里面去配置信任证书才行,可自行百度下。

四、python代理脚本跑起来

如果只是为了看代理抓包的数据倒也不至于用mitm了,fiddler、charles就不错了,用它的主要原因还是可以通过python脚本来自动化处理一些请求或数据操作。我习惯于用多个addons来进行处理,这样的话可以实现像流水线一样不同python文件处理不同的请求,以下示例仅作参考,代理并运行脚本后打开www.baidu.com看效果:

#main.py
import mitmproxy.http
from mitmproxy import ctx, http
import action1
class Counter:
    def __init__(self):
        self.num = 0

    def request(self, flow):
        self.num = self.num + 1
        ctx.log.error("这是第 %d 个请求" % self.num)

addons = [
    Counter(),
    action1.Action1()
]
#action1.py
import mitmproxy.http
from mitmproxy import ctx, http

class Action1:
    def request(self, flow: mitmproxy.http.HTTPFlow):
        # 忽略非百度搜索地址
        if flow.request.host == "www.baidu.com" :
            flow.request.url+="/s?wd=ip"
            ctx.log.error("发现baidu 修改url")
            return
        else:
            ctx.log.error("无需处理,"+flow.request.url)

运行脚本命令(-q是不显示本身的日志 -p手动指定端口):mitmdump -q -p 8080 -s main.py

五、mitmproxy的更多功能

上面的脚本只是个简单的示例,利用好响应的python脚本还可以实现更多强大的功能:

1、修改请求地址、修改请求url、修改请求头、请求体

2、修改响应结果、返回值

3、模拟接口/响应超时,模拟http响应码/错误码

4、对接口自动进行重新签名

5、封装一键切换正式环境/测试环境的功能,做APP测试的再也不用重新安装不同环境包了

6、根据接口文档可以实现高度定制的mock响应功能,不同入参响应不同结果

7、实现在手机上控制代理请求的处理(见之前文章:【概要篇】我是怎么实现全球任意地点控制局域网测试设备的http网络请求 – 染卷’blog (ranjuan.cn)

8、其他的一些自动化测试(太多的话就不建议用mitm了,可以用其他自动化框架来实现)

9、反向代理功能,利用host或url替换来实现请求的反向代理

10、接口信息存入数据库、网络爬虫、资源下载归档

11、构造网络响应,破解APP/客户端网络验证功能(比如绕过APP的强制更新弹窗)

基于互联网精神,在注明出处的前提下本站文章可自由转载!

本文链接:https://ranjuan.cn/mitmproxy-python-abc/

赞赏

微信赞赏支付宝赞赏

poeam20180812
app-design-general-utility-functions
sql查询多表结果作为新表并在新表中进行新的查询