gpt4 book ai didi

python使用mitmproxy抓取浏览器请求的方法

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 27 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python使用mitmproxy抓取浏览器请求的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

最近要写一款基于被动式的漏洞扫描器,因为被动式是将我们在浏览器浏览的时候所发出的请求进行捕获,然后交给扫描器进行处理,本来打算自己写这个代理的,但是因为考虑到需要抓取https,所以最后找到Mitmproxy这个程序.

安装方法:

pip install mitmproxy 。

接下来通过一个案例程序来了解它的使用,下面是目录结构 。

sproxy 。

|utils 。

|__init__.py 。

|parser.py 。

|sproxy.py 。

sproxy.py代码 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#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 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# 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抓取浏览器请求的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我.

原文链接:https://blog.csdn.net/q251500/article/details/79341562 。

最后此篇关于python使用mitmproxy抓取浏览器请求的方法的文章就讲到这里了,如果你想了解更多关于python使用mitmproxy抓取浏览器请求的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com