欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python使用mitmproxy抓取瀏覽器請求的方法

 更新時間:2019年07月02日 21:39:19   作者:太上-道  
今天小編就為大家分享一篇python使用mitmproxy抓取瀏覽器請求的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近要寫一款基于被動式的漏洞掃描器,因為被動式是將我們在瀏覽器瀏覽的時候所發(fā)出的請求進(jìn)行捕獲,然后交給掃描器進(jìn)行處理,本來打算自己寫這個代理的,但是因為考慮到需要抓取https,所以最后找到Mitmproxy這個程序。

安裝方法:

pip install mitmproxy

接下來通過一個案例程序來了解它的使用,下面是目錄結(jié)構(gòu)

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提交的參數(shù)
 
  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抓取瀏覽器請求的方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 基于python實現(xiàn)MQTT發(fā)布訂閱過程原理解析

    基于python實現(xiàn)MQTT發(fā)布訂閱過程原理解析

    這篇文章主要介紹了基于python實現(xiàn)MQTT發(fā)布訂閱過程原理解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-07-07
  • python實現(xiàn)搜索文本文件內(nèi)容腳本

    python實現(xiàn)搜索文本文件內(nèi)容腳本

    這篇文章主要為大家詳細(xì)介紹了python實現(xiàn)搜索文本文件內(nèi)容的腳本,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    使用Flask-Login模塊實現(xiàn)用戶身份驗證和安全性

    當(dāng)你想要在你的Flask應(yīng)用中實現(xiàn)用戶身份驗證和安全性時,F(xiàn)lask-Login這個擴展將會是你的最佳伙伴,它提供了一組簡單而強大的工具來處理,下面我們就來看看具體的操作方法吧
    2023-08-08
  • 精確查找PHP WEBSHELL木馬的方法(1)

    精確查找PHP WEBSHELL木馬的方法(1)

    今天,我想了下,現(xiàn)在把查找PHP WEBSHELL木馬思路發(fā)出來,需要的朋友可以參考下。
    2011-04-04
  • python爬蟲selenium和phantomJs使用方法解析

    python爬蟲selenium和phantomJs使用方法解析

    這篇文章主要介紹了python爬蟲selenium和phantomJs使用方法解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-08-08
  • python numpy.ndarray中如何將數(shù)據(jù)轉(zhuǎn)為int型

    python numpy.ndarray中如何將數(shù)據(jù)轉(zhuǎn)為int型

    這篇文章主要介紹了python numpy.ndarray中如何將數(shù)據(jù)轉(zhuǎn)為int型,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • postman和python mock測試過程圖解

    postman和python mock測試過程圖解

    這篇文章主要介紹了postman和python mock測試過程圖解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • Python3 Random模塊代碼詳解

    Python3 Random模塊代碼詳解

    這篇文章主要介紹了Python3 Random模塊代碼詳解,具有一定參考價值,需要的朋友可以了解下。
    2017-12-12
  • 關(guān)于ZeroMQ 三種模式python3實現(xiàn)方式

    關(guān)于ZeroMQ 三種模式python3實現(xiàn)方式

    今天小編就為大家分享一篇關(guān)于ZeroMQ 三種模式python3實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • python虛擬環(huán)境遷移方法

    python虛擬環(huán)境遷移方法

    今天小編就為大家分享一篇python虛擬環(huán)境遷移方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論