python使用mitmproxy抓取浏览器请求的方法


Posted in Python onJuly 02, 2019

最近要写一款基于被动式的漏洞扫描器,因为被动式是将我们在浏览器浏览的时候所发出的请求进行捕获,然后交给扫描器进行处理,本来打算自己写这个代理的,但是因为考虑到需要抓取https,所以最后找到Mitmproxy这个程序。

安装方法:

pip install mitmproxy

接下来通过一个案例程序来了解它的使用,下面是目录结构

sproxy

|utils

|__init__.py

|parser.py

|sproxy.py

sproxy.py代码

#coding=utf-8
 
from pprint import pprint
from mitmproxy import flow, proxy, controller, options
from mitmproxy.proxy.server import ProxyServer
from utils.parser import ResponseParser
 
# http static resource file extension
static_ext = ['js', 'css', 'ico', 'jpg', 'png', 'gif', 'jpeg', 'bmp']
# media resource files type
media_types = ['image', 'video', 'audio']
 
# url filter
url_filter = ['baidu','360','qq.com']
 
static_files = [
 'text/css',
 'image/jpeg',
 'image/gif',
 'image/png',
]
 
class WYProxy(flow.FlowMaster):
 
 
 def __init__(self, opts, server, state):
  super(WYProxy, self).__init__(opts, server, state)
 
 def run(self):
  try:
   pprint("proxy started successfully...")
   flow.FlowMaster.run(self)
  except KeyboardInterrupt:
   pprint("Ctrl C - stopping proxy")
   self.shutdown()
 
 def get_extension(self, flow):
  if not flow.request.path_components:
   return ''
  else:
   end_path = flow.request.path_components[-1:][0]
   split_ext = end_path.split('.')
   if not split_ext or len(split_ext) == 1:
    return ''
   else:
    return split_ext[-1:][0][:32]
 
 def capture_pass(self, flow):
 	# filter url
  url = flow.request.url
  for i in url_filter:		
			if i in url:
				return True
 
  """if content_type is media_types or static_files, then pass captrue"""
  extension = self.get_extension(flow)
  if extension in static_ext:
   return True
 
  # can't catch the content_type
  content_type = flow.response.headers.get('Content-Type', '').split(';')[:1][0]
  if not content_type:
   return False
 
  if content_type in static_files:
   return True
 
  http_mime_type = content_type.split('/')[:1]
  if http_mime_type:
   return True if http_mime_type[0] in media_types else False
  else:
   return False
 
 @controller.handler
 def request(self, f):
 	pass
 
 @controller.handler
 def response(self, f):
  try:
   if not self.capture_pass(f):
    parser = ResponseParser(f)
    result = parser.parser_data()
    if f.request.method == "GET":
     print result['url']
    elif f.request.method == "POST":
     print result['request_content'] # POST提交的参数
 
  except Exception as e:
   raise e
 
 @controller.handler
 def error(self, f):
 	pass
  # print("error", f)
 
 @controller.handler
 def log(self, l):
 	pass
  # print("log", l.msg)
 
def start_server(proxy_port, proxy_mode):
 port = int(proxy_port) if proxy_port else 8090
 mode = proxy_mode if proxy_mode else 'regular'
 
 if proxy_mode == 'http':
  mode = 'regular'
 
 opts = options.Options(
  listen_port=port,
  mode=mode,
  cadir="~/.mitmproxy/",
  )
 config = proxy.ProxyConfig(opts)
 state = flow.State()
 server = ProxyServer(config)
 m = WYProxy(opts, server, state)
 m.run()
 
 
if __name__ == '__main__':
	start_server("8090", "http")

parser.py

# from __future__ import absolute_import
 
class ResponseParser(object):
 """docstring for ResponseParser"""
 
 def __init__(self, f):
  super(ResponseParser, self).__init__()
  self.flow = f
 
 def parser_data(self):
  result = dict()
  result['url'] = self.flow.request.url
  result['path'] = '/{}'.format('/'.join(self.flow.request.path_components))
  result['host'] = self.flow.request.host
  result['port'] = self.flow.request.port
  result['scheme'] = self.flow.request.scheme
  result['method'] = self.flow.request.method
  result['status_code'] = self.flow.response.status_code
  result['content_length'] = int(self.flow.response.headers.get('Content-Length', 0))
  result['request_header'] = self.parser_header(self.flow.request.headers)
  result['request_content'] = self.flow.request.content
  return result
 
 @staticmethod
 def parser_multipart(content):
  if isinstance(content, str):
   res = re.findall(r'name=\"(\w+)\"\r\n\r\n(\w+)', content)
   if res:
    return "&".join([k + '=' + v for k, v in res])
   else:
    return ""
  else:
   return ""
 
 @staticmethod
 def parser_header(header):
  headers = {}
  for key, value in header.items():
   headers[key] = value
  return headers
 
 @staticmethod
 def decode_response_text(content):
  for _ in ['UTF-8', 'GB2312', 'GBK', 'iso-8859-1', 'big5']:
   try:
    return content.decode(_)
   except:
    continue
  return content

参考链接:

https://github.com/ring04h/wyproxy

以上这篇python使用mitmproxy抓取浏览器请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
推荐下python/ironpython:从入门到精通
Oct 02 Python
python之DataFrame实现excel合并单元格
Feb 22 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
Nov 29 Python
详解python中TCP协议中的粘包问题
Mar 22 Python
Python数据类型之Number数字操作实例详解
May 08 Python
Python的pygame安装教程详解
Feb 10 Python
tensorflow 实现数据类型转换
Feb 17 Python
Python新手学习装饰器
Jun 04 Python
python支持多继承吗
Jun 19 Python
python对 MySQL 数据库进行增删改查的脚本
Oct 22 Python
python 高阶函数简单介绍
Feb 19 Python
使用Python开发冰球小游戏
Apr 30 Python
Python使用线程来接收串口数据的示例
Jul 02 #Python
使用Python在Windows下获取USB PID&VID的方法
Jul 02 #Python
在windows下使用python进行串口通讯的方法
Jul 02 #Python
浅析Python 中几种字符串格式化方法及其比较
Jul 02 #Python
Python实用工具FuckIt.py介绍
Jul 02 #Python
Python如何实现转换URL详解
Jul 02 #Python
Pandas的read_csv函数参数分析详解
Jul 02 #Python
You might like
php 记录进行累加并显示总时长为秒的结果
2011/11/04 PHP
php解析json数据实例
2014/08/19 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
jQuery和AngularJS的区别浅析
2015/01/29 Javascript
js计算文本框输入的字符数
2015/10/23 Javascript
javascript实现获取浏览器版本、浏览器类型
2015/12/02 Javascript
js数组与字符串常用方法总结
2017/01/13 Javascript
Bootstrap轮播图学习使用
2017/02/10 Javascript
Vue自定义toast组件的实例代码
2018/08/15 Javascript
在node中使用jwt签发与验证token的方法
2019/04/03 Javascript
详解JQuery基础动画操作
2019/04/12 jQuery
webpack自动打包和热更新的实现方法
2019/06/24 Javascript
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
在Python中操作字典之setdefault()方法的使用
2015/05/21 Python
Python深入06——python的内存管理详解
2016/12/07 Python
python使用sqlite3时游标使用方法
2018/03/13 Python
python中的协程深入理解
2019/06/10 Python
TFRecord格式存储数据与队列读取实例
2020/01/21 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
python利用tkinter实现图片格式转换的示例
2020/09/28 Python
CSS3教程(2):网页边框半径和网页圆角
2009/04/02 HTML / CSS
巴西电子产品购物网站:Saldão da Informática
2018/01/09 全球购物
关爱女孩行动实施方案
2014/03/13 职场文书
月度优秀员工获奖感言
2014/08/16 职场文书
中国梦演讲稿开场白
2014/08/28 职场文书
预备党员2014年第四季度思想汇报范文
2014/10/25 职场文书
2014年小学工作总结
2014/11/26 职场文书
诚信高考倡议书
2019/06/24 职场文书
怎样做好公众演讲能力?
2019/08/28 职场文书
创业计划书之韩国烧烤店
2019/09/19 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
十个Python自动化常用操作,即拿即用
2021/05/10 Python
Win11查看设备管理器
2022/04/19 数码科技
Windows Server 2016服务器用户管理及远程授权图文教程
2022/08/14 Servers
Python中tqdm的使用和例子
2022/09/23 Python