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实现的去除win下文本文件头部BOM的代码
Feb 10 Python
python中getattr函数使用方法 getattr实现工厂模式
Jan 20 Python
Python argv用法详解
Jan 08 Python
Python实现朴素贝叶斯分类器的方法详解
Jul 04 Python
Python构建图像分类识别器的方法
Jan 12 Python
python执行精确的小数计算方法
Jan 21 Python
python保存字典和读取字典的实例代码
Jul 07 Python
用Python配平化学方程式的方法
Jul 20 Python
PyCharm刷新项目(文件)目录的实现
Feb 14 Python
tensorflow模型转ncnn的操作方式
May 25 Python
python中数字是否为可变类型
Jul 08 Python
python实现简单的三子棋游戏
Apr 28 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
最小化数据传输――在客户端存储数据
2006/10/09 PHP
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP中构造函数和析构函数解析
2014/10/10 PHP
详解php反序列化
2020/06/10 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
详解new function(){}和function(){}() 区别分析
2008/03/22 Javascript
js类的静态属性和实例属性的理解
2009/10/01 Javascript
jQuery获取样式中的背景颜色属性值/颜色值
2012/12/17 Javascript
禁止选中文字兼容IE、Chrome、FF等
2013/09/04 Javascript
jQuery中append()方法用法实例
2015/01/08 Javascript
jQuery scrollFix滚动定位插件
2015/04/01 Javascript
AngularJS中的API(接口)简单实现
2016/07/28 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
2017/01/22 Javascript
easyui简介_动力节点Java学院整理
2017/07/14 Javascript
JavaScript内存泄漏的处理方式
2017/11/20 Javascript
微信小程序仿朋友圈发布动态功能
2018/07/15 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
JS对象属性的检测与获取操作实例分析
2020/03/17 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
Python走楼梯问题解决方法示例
2018/07/25 Python
Python初学者需要注意的事项小结(python2与python3)
2018/09/26 Python
pycharm使用matplotlib.pyplot不显示图形的解决方法
2018/10/28 Python
详解python-图像处理(映射变换)
2019/03/22 Python
python如何获取列表中每个元素的下标位置
2019/07/01 Python
Python时间差中seconds和total_seconds的区别详解
2019/12/26 Python
python如何实现DES加密
2020/09/21 Python
用 python 进行微信好友信息分析
2020/11/28 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
如何查找网页漏洞
2016/06/22 面试题
培训专员岗位职责
2014/02/26 职场文书
员工生日活动方案
2014/08/24 职场文书
2016计算机专业毕业生自荐信
2016/01/28 职场文书
python保存大型 .mat 数据文件报错超出 IO 限制的操作
2021/05/10 Python
AngularJS实现多级下拉框
2022/03/25 Javascript
Nginx限流和黑名单配置
2022/05/20 Servers