抓包工具mitmproxy
1、作用
做app、小程序相关项目的时候,经常需要抓包工具获取接口以及返回值。
2、charles
一般常用的抓包工具是charles
3、mitmproxy
charles很好用,但是不可以扩展,作为程序员,还是喜欢用程序进行自定义的扩展。
4、安装(基于python)
pip3 install mitmproxy
5、配置
代理设置:
PC端 chrome-设置-高级-系统-打开您计算机的代理设置
手机端(小米10) 设置-WLAN-选择与电脑相同的网络
代理选择手动 主机名写电脑的局域网ip(在pc端电脑使用ifconfig |gre inet)
192.168.0.83就是主机的地址
端口写你要监听的端口(PC端mitmproxy启动时设置的端口)
证书安装:
手机端-访问mitm.it-选择相应系统的证书进行安装
PC端可以直接访问根目录.mitmproxy
双击mitmproxy-ca-cert.pem(mac电脑)
6、使用(以电脑端chrom请求为例)
命令行方式 mitmproxy -p 8898
ui页面(一般用这个) mitmweb -p 8898 (自动打开127.0.0.1:8081)
可以过滤,修改参数再次请求、下载等功能,还是可以的
自定义扩展-程序 mitmdump
import json
from mitmproxy import http
from mitmproxy import proxy, options
from mitmproxy.script import concurrent
from mitmproxy.tools.dump import DumpMaster
file = open("mitmproxy.sql", "w+")
host_list = ['baidu.com']
class SaveRequestData:
@concurrent
def request(self, flow):
pass
@concurrent
def response(self, flow: http.HTTPFlow) -> None:
host = flow.request.host
if host in host_list:
item = {}
item['url'] = str(flow.request.url)
item['host'] = str(flow.request.host)
item['method'] = str(flow.request.method)
item['param_text'] = str(flow.request.content, encoding='utf-8').replace('\'', '\'\'')
item['response_text'] = str(flow.response.text).replace('\'', '\'\'')
headers = flow.request.headers.items()
header_obj = {}
for header in headers:
key = str(header[0])
value = str(header[1])
header_obj[key] = value
item['headers_text'] = json.dumps(header_obj)
insert_data(item)
# flow.response.text = '注入中'+page_buf
def start():
myaddon = SaveRequestData()
opts = options.Options(listen_host='127.0.0.1', listen_port=8898)
# opts.add_option("body_size_limit", int, 0, "")
# opts.add_option("keep_host_header", bool, True, "")
# opts.add_option("mode", str, "upstream:http://127.0.0.1:8118", "")
# opts.add_option("ssl_insecure", bool, True, "")
pconf = proxy.config.ProxyConfig(opts)
m = DumpMaster(opts)
m.server = proxy.server.ProxyServer(pconf)
m.addons.add(myaddon)
try:
m.run()
except KeyboardInterrupt:
m.shutdown()
def insert_data(data):
try:
sql = "insert into request2(host_name,url,method,param_text,response_text,headers_text) values('%s','%s','%s','%s','%s','%s');"
sql = sql % (
data['host'], data['url'], data['method'], data['param_text'], data['response_text'], data['headers_text'])
print(sql)
file.write(sql)
file.write("\r\n")
except Exception as e:
print(e)
if __name__ == '__main__':
start()
拦截设定域名的请求 并将请求头、请求参数、返回集等数据拼装成sql语句入库