【问题标题】:Change URL to another URL using mitmproxy使用 mitmproxy 将 URL 更改为另一个 URL
【发布时间】:2016-05-09 15:17:56
【问题描述】:

我正在尝试使用 mitmproxy 和 Python 将一个页面重定向到另一个页面。我可以毫无问题地与 mitmproxy 一起运行我的内联脚本,但是在将 URL 更改为另一个 URL 时我被卡住了。就像我去 google.com 一样,它会重定向到 stackoverflow.com

def response(context, flow):
        print("DEBUG")
        if flow.request.url.startswith("http://google.com/"):
            print("It does contain it")
            flow.request.url = "http://stackoverflow/"

理论上这应该可行。我在 mitmproxy 的 GUI 中看到 http://google.com/(作为 GET),但 print("It does contain it") 永远不会被解雇。

当我尝试将flow.request.url = "http://stackoverflow.com" 放在print("DEBUG") 正下方时,它也不起作用。

我做错了什么?我也试过if "google.com" in flow.request.url来检查URL是否包含google.com,但这也不起作用。

谢谢

【问题讨论】:

  • (1) 你看到“DEBUG”输出了吗? (2) 你的请求到底是http://还是https://
  • @VasiliyFaronov 我看到“DEBUG”输出是的(我有一个单独的打印功能,它写入一个文件,然后我 tail -f 打开,因为 mitmproxy 的 GUI 填充了整个终端)。它是http://,我已经小心地从 mitmproxy GUI 复制粘贴了整个 URL,所以它匹配 100%。显然 google.com 和 stackoverflow.com 只是填充物。

标签: python mitmproxy


【解决方案1】:

以下mitmproxy 脚本将

  1. 将请求从mydomain.com 重定向到newsite.mydomain.com
  2. 更改请求方法路径(应该是/getjson?之类的东西为新的`/getxml
  3. 更改目标主机方案
  4. 更改目标服务器端口
  5. 覆盖请求头Host伪装成origi

    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"
    

【讨论】:

【解决方案2】:

您可以设置.url 属性,即will update the underlying attributes。查看您的代码,您的问题是您在请求完成后更改了 response 挂钩中的 URL。您需要更改 request 挂钩中的 URL,以便在从上游服务器请求资源之前应用更改。

【讨论】:

  • 我也尝试在请求挂钩中设置.url“属性”,但它似乎也没有真正起作用。
【解决方案3】:

设置url 属性对您没有帮助,因为它只是从基础数据构建的。 [编辑:我错了,看看马克西米利安的回答。不过,我的其余答案应该仍然有效。]

根据您想要完成的具体任务,有两种选择。

(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://stackoverflow.com/',
                                        Content_Length='0'),
                                b''))

(2) 您可以将 same 请求静默路由到不同的主机。客户端不会看到这个,它会假设它仍在与google.com 交谈。

def request(context, flow):
    if flow.request.url == 'http://google.com/accounts/':
        flow.request.host = 'stackoverflow.com'
        flow.request.path = '/users/'

这些 sn-ps 改编自 mitmproxy 自己的 GitHub 存储库中的 an example。那里有many more examples

由于某种原因,当使用 TLS (https://) 时,我似乎无法让这些 sn-ps 用于 Firefox,但也许你不需要。

【讨论】:

  • 感谢您的回复!我需要的只是让 X 的内容看起来像 Y 的内容。所以如果我在连接的设备上输入website.com,它应该显示another-website.com 的内容。按照其他示例中的说明更改主机将不起作用,因为我需要更改整个 URL。 google.com/account 有效,但 stackoverflow.com/account 无效。明白我的意思吗?我需要将整个 URL 替换为另一个 URL。
  • @Snorlax 方法 (2) 替换每个请求的 URL 中的主机。它对我有用。我正在使用 example.comstackoverflow.com,当我在 Firefox 中转到 http://example.com/users 时,我确实看到了 Stack Overflow 用户页面,其中(相对)链接指向其他 example.com 页面。也许你可以告诉你正在使用的实际网站?例如,如果您的 stackoverflow.com 依赖于 cookie,则方法 (2) 可能不起作用,因为浏览器不会将 stackoverflow.com cookie 发送到 google.com — 但我认为您对此无能为力。跨度>
  • 哦,你的意思是除了host还需要改路径吗?这很简单,只需将flow.request.path 设置为您想要的任何值。
  • 替换flow.request.host的问题是路径需要完全相同。我不想要那个。我想能够说if url == "example.com": url = "new-example.com。我知道这是可能的,我只是不知道怎么做。
  • 还是不够好。我需要将一个 EXACT URL 更改为另一个 EXACT URL。以anything-goes-here.com/anything-123.html -> google.com/account 为例。
猜你喜欢
  • 1970-01-01
  • 2014-06-25
  • 2020-08-25
  • 1970-01-01
  • 2017-06-16
  • 1970-01-01
  • 2011-09-15
  • 2021-10-21
  • 1970-01-01
相关资源
最近更新 更多