在Mac上安装与使用mitmproxy
[本文出自天外归云的博客园]
介绍
Mitmproxy是一款支持HTTP(S)的中间人代理工具。不同于Fiddler2,burpsuite等类似功能工具,mitmproxy可在终端下运行,并且支持编写脚本来批量处理请求。Mitmproxy使用Python开发,是辅助web开发&测试,移动端调试,渗透测试的工具。你不要在Windows上安装它,因为用不了,Windows的命令行不支持mitmproxy的界面显示。
安装与启用
1. 在终端安装(安装后会提示安装路径用来启动mitmproxy),以下命令适合python2(注意brew和pip安装的mitmproxy版本要一致):
brew install mitmproxy
sudo pip install "mitmproxy==0.17.1"
2. 在终端启动(指定本机ip和运行端口号):
/usr/local/Cellar/mitmproxy/0.17./bin/mitmproxy -b 10.235.3.70 -p
抓https的包需要在移动端安装证书,在启动mitmproxy之后在手机浏览器输入并访问“mitm.it”进行安装证书,然后就可以抓手机端发送的https包了。
在主界面用鼠标点击具体的请求可以进入请求界面。
常用命令
1. 清屏:“shift+c”
2. 切换“Request/Response”栏:“tab”
3. 返回上一级(包括退出):“q”
4. 在具体请求的“Response”栏界面以不同格式查看返回结果:“m+高亮的字母”进行选择要编辑的部分
5. 在主界面删除指定请求:用小黄箭头指定要删除的请求然后按“d”
6. 拦截请求:在主界面按“i+要拦截的字符串,例如:api.win”进行拦截包含指定字符串的请求
7. 在请求界面编辑请求或响应:e+“高亮的字母”进行选择要编辑的部分
8. 在主界面发送指定的请求:用小黄箭头指定要发送的请求然后按两下“a”
脚本编写
脚本编写如下,将返回结果批量改成“666”:
#coding=utf-8 def request(context,flow):
#print "This is a request."
pass def response(context,flow):
#print dir(flow.response)
if "" in flow.response.content:
try:
flow.response.content = ""
except Exception as e:
pass
运行脚本方式(在终端里脚本所在路径下运行如下命令,这里的脚本叫“test_mit.py”):
mitmproxy -s test_mit.py -p
运行以后在终端里可以看到mitmproxy的主界面,按“e”可以查看脚本的输出信息以及脚本报错的信息。
例如我随便访问一款手机上的app,这里拿“一元乐购”为例。在mitmproxy的主界面可以看到抓包信息,随便点进去一个,查看它的“Response”栏,可以看到返回结果变成了“666”。而对应的在手机上我也无法打开这款app了,杀掉进程后重新进入app就会发生闪退。这种修改接口返回值然后查看客户端是否能够正确处理的测试就是app专项测试中的接口容错测试。
我们可以用mitmproxy的filter请求拦截器或者通过编写脚本的方式来进行接口的容错测试。
实战
以“一元乐购”这个app为例,测试不同用户到新的商品详情页后检查各自可用的红包列表,我们需要模拟不同的用户来访问这个页面,如果来回退出登录app访问这个页面的话过程是非常繁琐的。通过mitmproxy可以完美的进行请求数据篡改,在不切换登录用户的前提下模拟不同用户访问商品详情页面。脚本代码如下:
#coding=utf-8
import json
import requests accountId = ""
pwd = "" def getSessionId(session,accountId,pwd):
url = "https://hygtest.ms.netease.com/winyyg/scripts"
data = {
"username":accountId,
"password":pwd,
"tag":"winyylg_login"
}
r = json.loads(session.post(url,data).text)
return r[0][1] def request(context,flow):
if "new_product_detail" in flow.request.url:
form_urlencoded = flow.request.get_form_urlencoded()
form_urlencoded["accountId"] = [accountId]
s = requests.Session()
sessionId = getSessionId(s,accountId,pwd)
form_urlencoded["sessionId"] = [sessionId]
flow.request.set_form_urlencoded(form_urlencoded)
编写脚本的过程中,对于不知道是什么类型的变量:
print type(xxx)
对于不知道包含什么方法和成员的变量:
print dir(xxx)
对于不知道怎么用的方法,google之。
以上代码中accountId和pwd变量为待模拟用户的用户名和密码,我们在通过这个脚本启动了mitmproxy之后,在无需重启mitmproxy的情况下修改脚本中的内容就可以实现对请求数据的篡改,从而达到我们模拟不同用户登录访问商品详情页的目的!保存好修改的脚本之后要做的就是手动刷新app内的商品详情页面了,从可用红包列表处可以看到访问商品详情页的用户已经成功变为了脚本中指定的用户。2017.3.13的晚上,又错过了晚饭。我和大师兄朱勃在网易大厦的六楼一起研究,终于搞定了通过编写mitmproxy脚本的方式来模拟不同用户访问app内页面。
在Mac上安装与使用mitmproxy的更多相关文章
- 在Mac上安装IntelliJ IDEA
这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA,至于IntelliJ IDEA的介绍和使用方法,大家另行查阅,本篇的文章不再详细阐述. 简短解说,IntelliJ IDEA是可以用来 ...
- Mac上安装brew
用过ubuntu系统的都知道,上面有一个命令apt-get 很方便可以快速的安装很多软件 特别lamp环境 都是一键安装. 在mac上也有类似的命令 brew brew用法可以访问官网地址 http ...
- mac 上安装服务,查看服务,重启和关闭
首先了解下的Mac的 homebrew ,官网:https://brew.sh/index_zh-cn.html 简单的说: Homebrew 能干什么? 答:使用 Homebrew 安装 Apple ...
- Mac上安装brew 包管理工具
Mac 上的包管理工具对于开发者来说是一件非常方便的工具,能够有效的对包进行管理. 所以这篇博客就来简单的讲一下brew 的安装和一些基础命令. brew 全称叫做Homebrew . 1. 首先来说 ...
- Mac上安装Charles进行抓包全流程设置
安装 -- 官网下载最新版的Charles版本,按照提示安装即可 破解 -- https://blog.csdn.net/qq_25821067/article/details/79848589. M ...
- 【mac上安装&配置&使用git】
转自:https://www.jianshu.com/p/7edb6b838a2e 目录 安装git 创建ssh key.配置git 提交本地项目到GitHub 一.安装Git MAC 上安装Git主 ...
- Mac上安装PHP、Apache、MySQL
Mac自带php5.6版本,要升级到php7.3 步骤如下 1,brew 安装php ,如果没有安装,访问https://brew.sh/index_zh-cn安装在终端输入以下内容,不用指定安装ph ...
- Mac上安装第三方应用显示包资源破坏解决办法
Mac上安装第三方应用显示包资源破坏解决办法 步骤1:Spotlight搜索(快捷键:command+空格或右上角搜索的符号):搜索 “终端”步骤2:直接复制粘贴 sudo spctl --maste ...
- 002-docker安装-mac上安装docker,17.06在CentOS7 64位机器上安装
一.mac上安装docker 1.下载 通过这个链接下载:https://download.docker.com/mac/stable/Docker.dmg 2.安装 将 Moby 的鲸鱼图标拖拽到 ...
随机推荐
- Python验证码识别处理实例 深度学习大作业
转载自:http://python.jobbole.com/83945/ http://www.pyimagesearch.com/2014/09/22/getting-started-deep-le ...
- Redis学习之路(005)- redis内存数据库C客户端hiredis API 中文说明
A)编译安装 make make install (/usr/local) make install PREFIX=$HOME/progs(可以自由指定安装路径) B)同步的API接口 redisCo ...
- 【Struts2】Struts2获取session的三种方式
1.Map<String,Object> map = ActionContext.getContext().getSession(); 2.HttpSession session = S ...
- 【Oracle】Oracle基本数据类型总结
ORACLE基本数据类型(亦叫内置数据类型 built-in datatypes)可以按类型分为:字符串类型.数字类型.日期类型.LOB类型.LONG RAW& RAW类型.ROWID &am ...
- Android Studio 2.3 正式版新功能,你不来看看?!
2017.3.3 Google老大发布了Android Studio 2.3正式版. 在许多2.3beta版本的基础上修复了bug然后推出了正式版.提供了一些新特性,和对部分已有功能的修改完善. Bu ...
- 【C语言】练习2-9
题目来源:<The C programming language>中的习题P38 练习2-9: 在求对二的补码时,表达式x &= (x-1)可以删除x中最右边值为1的一个二进 ...
- 绿色版mysql注册卸载服务
如果直接用绿色版的mysql,则下载后解压,只需对目录下的my.ini文件的basedir(mysql的基本目录)和datadir(mysql数据目录)指定就可以,如下所示. #Path to ins ...
- 转 MySQL问题排查工具介绍
原文链接: http://mrchenatu.com/2017/03/24/mysql-tool/ 本总结来自美团内部分享,屏蔽了内部数据与工具 知识准备 索引 索引是存储引擎用于快速找到记录的一种数 ...
- 硬盘 SMART 检测参数详解[转]
一.SMART概述 硬盘的故障一般分为两种:可预测的(predictable)和不可预测的(unpredictable).后者偶而会发生,也没有办法去预防它,例如芯片突然失效,机械撞击等.但像电机轴承 ...
- postman发送post数据到node.js中
使用get请求我们很容易的来利用postman来发送数据,但是今天的express在使用postman进行post请求的时候,竟然解析的body是空对象.在网上找了一下果然有解决方法,如下: 因为是P ...