在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 的鲸鱼图标拖拽到 ...
随机推荐
- 信号之sigsetjmp和siglongjmp函数(转)
在信号处理程序中经常调用longjmp函数以返回到程序的主循环中,而不是从该处理程序返回. 但是,调用longjmp有一个问题.当捕捉到一个信号时,进入信号捕捉函数,此时当前信号被自动地加到进程的信号 ...
- Docker(一):Docker入门教程
如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如 ...
- dubbo 学习(5) dubbo多协议和多注册中心
转载 http://blog.csdn.net/songjinbin/article/details/49498431 一.配置dubbo多协议模式 1.默认协议 Dubbo缺省协议采用单一长连接和N ...
- C# 用timer做成服务后 timer_Tick () 为什么不执行?
不能使用 窗体的 Timer,他只能在窗体中使用,服务中无法使用请使用 System.Timers.Timer类 protected override void OnStart(string[] ar ...
- sqlserver学习笔记(三)—— 为数据库添加新的用户
首先,用windows或sa身份登录sqlserver, 打开安全性——登录名——右键新建登录名:在选择页——常规中,新建命为user_b的登录名,选择sqlserver身份验证方式,设置密码确认密码 ...
- golang学习笔记 --- goroutine
package main import ( "fmt" "io" "io/ioutil" "net/http" &quo ...
- springboot 利用configureMessageConverters add FastJsonHttpMessageConverter 实现返回JSON值 null to ""
/** * 文件名:@WebConfiguration.java <br/> * @author tomas <br/> import com.alibaba.fastjson ...
- VB将MSHFlexGrid数据导出到Excel文件通用功能
1.通用导出Excel功能. 2.将 MSHFlexGrid数据导出到Excel文件通用功能. 3.具体代码如下: '将下列代码保存到一模块文件中,调用方法:Export fgrid1,cd1 Pub ...
- SpringMVC之RequestContextHolder分析
最近遇到的问题是在service获取request和response,正常来说在service层是没有request的,然而直接从controlller传过来的话解决方法太粗暴,后来发现了Spring ...
- WPF使用System.Windows.SystemParameters类获得屏幕分辨率
转自 http://hi.baidu.com/shirley_cst/item/a55c290c8aa2ee2ca0312da3 示例代码如下所示. double x = SystemParamete ...