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 获取当前所在目录的方法详解
Aug 02 Python
详解python3中tkinter知识点
Jun 21 Python
Python 的字典(Dict)是如何存储的
Jul 05 Python
Django Form 实时从数据库中获取数据的操作方法
Jul 25 Python
python numpy中cumsum的用法详解
Oct 17 Python
python中列表的含义及用法
May 26 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
Python Django路径配置实现过程解析
Nov 05 Python
Python爬虫中Selenium实现文件上传
Dec 04 Python
python字典与json转换的方法总结
Dec 28 Python
pycharm 快速解决python代码冲突的问题
Jan 15 Python
7个关于Python的经典基础案例
Nov 07 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
Terran历史背景
2020/03/14 星际争霸
PHP编译configure时常见错误的总结
2017/08/17 PHP
Laravel框架查询构造器 CURD操作示例
2019/09/04 PHP
基于Jquery的简单&简陋Tabs插件代码
2010/02/09 Javascript
Javascript/Jquery——简单定时器的多种实现方法
2013/07/03 Javascript
按Enter键触发事件的jquery方法实现代码
2014/02/17 Javascript
javascript的创建多行字符串的7种方法
2014/04/29 Javascript
百度判断手机终端并自动跳转js代码及使用实例
2014/06/11 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
浅谈javascript实现八大排序
2015/04/27 Javascript
JQuery Mobile实现导航栏和页脚
2016/03/09 Javascript
jQuery实现按钮点击遮罩加载及处理完后恢复的效果
2016/06/07 Javascript
jQuery的$.extend 浅拷贝与深拷贝
2017/03/08 Javascript
JavaScript中立即执行函数实例详解
2017/11/04 Javascript
浅谈从React渲染流程分析Diff算法
2018/09/08 Javascript
深入解析koa之异步回调处理
2019/06/17 Javascript
Node.js学习教程之Module模块
2019/09/03 Javascript
javascript设计模式 ? 代理模式原理与用法实例分析
2020/04/16 Javascript
vue项目实现设置根据路由高亮对应的菜单项操作
2020/08/06 Javascript
SpringBoot+Vue 前后端合并部署的配置方法
2020/12/30 Vue.js
详解Python3.1版本带来的核心变化
2015/04/07 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
Python3网络爬虫开发实战之极验滑动验证码的识别
2019/08/02 Python
Windows平台Python编程必会模块之pywin32介绍
2019/10/01 Python
pytorch实现onehot编码转为普通label标签
2020/01/02 Python
python 将Excel转Word的示例
2021/03/02 Python
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
Champion澳大利亚官网:美国冠军运动服装
2018/05/07 全球购物
初中生学习生活的自我评价
2013/11/20 职场文书
婚前协议书范本
2014/04/15 职场文书
调解协议书
2014/04/16 职场文书
优秀会计求职信
2014/07/04 职场文书
教师个人工作总结范文2015
2015/10/14 职场文书
Win11查看设备管理器
2022/04/19 数码科技
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
利用Apache Common将java对象池化的问题
2022/06/16 Servers