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使用sorted函数对列表进行排序的方法
Apr 04 Python
Ruby元编程基础学习笔记整理
Jul 02 Python
详解python的webrtc库实现语音端点检测
May 31 Python
用Python实现KNN分类算法
Dec 22 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
Django网络框架之创建虚拟开发环境操作示例
Jun 06 Python
python爬虫开发之selenium模块详细使用方法与实例全解
Mar 09 Python
selenium+python配置chrome浏览器的选项的实现
Mar 18 Python
解决Keras使用GPU资源耗尽的问题
Jun 22 Python
opencv 阈值分割的具体使用
Jul 08 Python
Python爬虫之Spider类用法简单介绍
Aug 04 Python
python迷宫问题深度优先遍历实例
Jun 20 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
用cookies来跟踪识别用户
2006/10/09 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
老生常谈ThinkPHP中的行为扩展和插件(推荐)
2017/05/05 PHP
php app支付宝回调(异步通知)详解
2018/07/25 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
phpmyadmin在宝塔面板里进不去的解决方案
2020/07/06 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
js或jquery实现页面打印可局部打印
2014/03/27 Javascript
浅析Javascript中“==”与“===”的区别
2014/12/23 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
原生JS实现的雪花飘落动画效果
2018/05/03 Javascript
简述vue状态管理模式之vuex
2018/08/29 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
js+for循环实现字符串自动转义的代码(把后面的字符替换前面的字符)
2020/12/24 Javascript
[44:40]Spirit vs Navi Supermajor小组赛 A组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python Socket使用实例
2017/12/18 Python
python tensorflow基于cnn实现手写数字识别
2018/01/01 Python
Python中判断输入是否为数字的实现代码
2018/05/26 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
增大python字体的方法步骤
2020/07/05 Python
Python中Selenium模块的使用详解
2020/10/09 Python
总结30个CSS3选择器
2017/04/13 HTML / CSS
浅析border-radius如何兼容IE
2016/04/19 HTML / CSS
VSCode 自定义html5模板的实现
2019/12/05 HTML / CSS
美国顶级户外凉鞋品牌:Chacos
2017/03/27 全球购物
维多利亚的秘密官方网站:Victoria’s Secret
2018/10/24 全球购物
澳大利亚婴儿喂养品牌:Cherub Baby
2018/11/01 全球购物
Java基础类库面试题
2013/09/04 面试题
2014年廉洁自律承诺书
2014/05/26 职场文书
预防传染病方案
2014/06/14 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
土建技术员岗位职责
2015/04/11 职场文书
暑期家教宣传单
2015/07/14 职场文书
Win11如何启用启动修复 ? Win11执行启动修复的三种方法
2022/04/08 数码科技