使用 mitmproxy 将 URL 更改为另一个 URL
Change URL to another URL using mitmproxy
我正在尝试使用 mitmproxy 和 Python 将一个页面重定向到另一个页面。我可以 运行 我的内联脚本和 mitmproxy 一起没有问题,但是在将 URL 更改为另一个 URL 时我被卡住了。就像我去 google.com 它会重定向到 whosebug.com
def response(context, flow):
print("DEBUG")
if flow.request.url.startswith("http://google.com/"):
print("It does contain it")
flow.request.url = "http://Whosebug/"
这在理论上应该可行。我在 mitmproxy 的 GUI 中看到 http://google.com/
(作为 GET)但是 print("It does contain it")
永远不会被触发。
当我尝试将 flow.request.url = "http://whosebug.com"
放在 print("DEBUG")
的正下方时,它也不起作用。
我做错了什么?我也试过 if "google.com" in flow.request.url
检查 URL 是否包含 google.com
但这也不起作用。
谢谢
设置 url
属性对您没有帮助,因为它只是根据基础数据构建的。 [编辑:我错了,请参阅 Maximilian 的回答。不过,我的其余答案应该仍然有效。]
根据您想要完成的具体目标,有两种选择。
(1) 您可以向客户端发送实际的 HTTP redirection response。假设客户端理解 HTTP 重定向,它将向您提供的 URL 提交一个 new 请求。
from mitmproxy.models import HTTPResponse
from netlib.http import Headers
def request(context, flow):
if flow.request.host == 'google.com':
flow.reply(HTTPResponse('HTTP/1.1', 302, 'Found',
Headers(Location='http://whosebug.com/',
Content_Length='0'),
b''))
(2) 您可以静默地将 相同的 请求路由到不同的主机。客户端不会看到这一点,它会假设它仍在与 google.com
.
通话
def request(context, flow):
if flow.request.url == 'http://google.com/accounts/':
flow.request.host = 'whosebug.com'
flow.request.path = '/users/'
这些片段改编自 an example found in mitmproxy’s own GitHub repo. There are many more examples 那里。
出于某种原因,当 与 TLS (https://
) 一起使用时,我似乎无法让这些片段适用于 Firefox,但也许你不需要那。
可以设置.url
属性,其中will update the underlying attributes。查看您的代码,您的问题是在请求完成后更改 response
挂钩中的 URL 。您需要更改 request
挂钩中的 URL,以便在从上游服务器请求资源之前应用更改。
以下mitmproxy
脚本将
- 将请求从
mydomain.com
重定向到 newsite.mydomain.com
- 更改请求方法路径(应该类似于
/getjson?
到一个新的 `/getxml
- 更改目标主机方案
- 更改目标服务器端口
覆盖请求头Host
伪装成原始
import mitmproxy
from mitmproxy.models import HTTPResponse
from netlib.http import Headers
def request(flow):
if flow.request.pretty_host.endswith("mydomain.com"):
mitmproxy.ctx.log( flow.request.path )
method = flow.request.path.split('/')[3].split('?')[0]
flow.request.host = "newsite.mydomain.com"
flow.request.port = 8181
flow.request.scheme = 'http'
if method == 'getjson':
flow.request.path=flow.request.path.replace(method,"getxml")
flow.request.headers["Host"] = "newsite.mydomain.com"
我正在尝试使用 mitmproxy 和 Python 将一个页面重定向到另一个页面。我可以 运行 我的内联脚本和 mitmproxy 一起没有问题,但是在将 URL 更改为另一个 URL 时我被卡住了。就像我去 google.com 它会重定向到 whosebug.com
def response(context, flow):
print("DEBUG")
if flow.request.url.startswith("http://google.com/"):
print("It does contain it")
flow.request.url = "http://Whosebug/"
这在理论上应该可行。我在 mitmproxy 的 GUI 中看到 http://google.com/
(作为 GET)但是 print("It does contain it")
永远不会被触发。
当我尝试将 flow.request.url = "http://whosebug.com"
放在 print("DEBUG")
的正下方时,它也不起作用。
我做错了什么?我也试过 if "google.com" in flow.request.url
检查 URL 是否包含 google.com
但这也不起作用。
谢谢
设置 url
属性对您没有帮助,因为它只是根据基础数据构建的。 [编辑:我错了,请参阅 Maximilian 的回答。不过,我的其余答案应该仍然有效。]
根据您想要完成的具体目标,有两种选择。
(1) 您可以向客户端发送实际的 HTTP redirection response。假设客户端理解 HTTP 重定向,它将向您提供的 URL 提交一个 new 请求。
from mitmproxy.models import HTTPResponse
from netlib.http import Headers
def request(context, flow):
if flow.request.host == 'google.com':
flow.reply(HTTPResponse('HTTP/1.1', 302, 'Found',
Headers(Location='http://whosebug.com/',
Content_Length='0'),
b''))
(2) 您可以静默地将 相同的 请求路由到不同的主机。客户端不会看到这一点,它会假设它仍在与 google.com
.
def request(context, flow):
if flow.request.url == 'http://google.com/accounts/':
flow.request.host = 'whosebug.com'
flow.request.path = '/users/'
这些片段改编自 an example found in mitmproxy’s own GitHub repo. There are many more examples 那里。
出于某种原因,当 与 TLS (https://
) 一起使用时,我似乎无法让这些片段适用于 Firefox,但也许你不需要那。
可以设置.url
属性,其中will update the underlying attributes。查看您的代码,您的问题是在请求完成后更改 response
挂钩中的 URL 。您需要更改 request
挂钩中的 URL,以便在从上游服务器请求资源之前应用更改。
以下mitmproxy
脚本将
- 将请求从
mydomain.com
重定向到newsite.mydomain.com
- 更改请求方法路径(应该类似于
/getjson?
到一个新的 `/getxml - 更改目标主机方案
- 更改目标服务器端口
覆盖请求头
Host
伪装成原始import mitmproxy from mitmproxy.models import HTTPResponse from netlib.http import Headers def request(flow): if flow.request.pretty_host.endswith("mydomain.com"): mitmproxy.ctx.log( flow.request.path ) method = flow.request.path.split('/')[3].split('?')[0] flow.request.host = "newsite.mydomain.com" flow.request.port = 8181 flow.request.scheme = 'http' if method == 'getjson': flow.request.path=flow.request.path.replace(method,"getxml") flow.request.headers["Host"] = "newsite.mydomain.com"