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删除过期文件的方法
May 29 Python
python实现矩阵乘法的方法
Jun 28 Python
实例讲解Python中global语句下全局变量的值的修改
Jun 16 Python
如何在sae中设置django,让sae的工作环境跟本地python环境一致
Nov 21 Python
使用python批量读取word文档并整理关键信息到excel表格的实例
Nov 07 Python
利用python在excel里面直接使用sql函数的方法
Feb 08 Python
用pycharm开发django项目示例代码
Jun 13 Python
python实现二分类的卡方分箱示例
Nov 22 Python
Python 过滤错误log并导出的实例
Dec 26 Python
基于Numba提高python运行效率过程解析
Mar 02 Python
在pycharm中debug 实时查看数据操作(交互式)
Jun 09 Python
flask开启多线程的具体方法
Aug 02 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的相似度计算函数:levenshtein的使用介绍
2013/04/15 PHP
PHP函数import_request_variables()用法分析
2016/04/02 PHP
PHP实现随机数字、字母的验证码功能
2018/08/01 PHP
php实现映射操作实例详解
2019/10/02 PHP
Jquery获取复选框被选中值的简单方法
2013/07/04 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
javascript arguments使用示例
2014/12/16 Javascript
使用JS轻松实现ionic调用键盘搜索功能(超实用)
2016/09/06 Javascript
从0开始学Vue
2016/10/27 Javascript
javascript基本数据类型及类型检测常用方法小结
2016/12/14 Javascript
AngularJS学习第二篇 AngularJS依赖注入
2017/02/13 Javascript
浅谈js闭包理解
2019/04/01 Javascript
原生js实现trigger方法示例代码
2019/05/22 Javascript
JavaScript实现图片轮播特效
2019/10/23 Javascript
vue 路由子组件created和mounted不起作用的解决方法
2019/11/05 Javascript
[43:32]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第一场
2014/05/26 DOTA
[01:01:35]Optic vs paiN 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python将html转成PDF的实现代码(包含中文)
2013/03/04 Python
Django生成PDF文档显示在网页上以及解决PDF中文显示乱码的问题
2019/07/04 Python
Python collections模块使用方法详解
2019/08/28 Python
详解Python3迁移接口变化采坑记
2019/10/11 Python
如何使用python代码操作git代码
2020/02/29 Python
python中编写函数并调用的知识点总结
2021/01/13 Python
iRobot官网:改变生活的家用机器人品牌
2016/09/20 全球购物
Parfume Klik丹麦:香水网上商店
2018/07/10 全球购物
牧马人澳大利亚官网:Wrangler澳大利亚
2019/10/08 全球购物
递归计算如下递归函数的值(斐波拉契)
2012/02/04 面试题
生物技术专业研究生自荐信
2013/09/22 职场文书
大专生毕业的自我评价
2014/02/06 职场文书
总经理岗位职责说明书
2014/07/30 职场文书
2014党的群众路线教育实践活动总结材料
2014/10/31 职场文书
3.15消费者权益日活动总结
2015/02/09 职场文书
中学教代会开幕词
2016/03/04 职场文书
感谢信
2019/04/11 职场文书
幽默导游词应该怎么写?
2019/08/26 职场文书
CocosCreator ScrollView优化系列之分帧加载
2021/04/14 Python