使用mitmproxy将URL更改为其他URL

时间:2016-05-09 15:17:56

标签: python mitmproxy

我正在尝试使用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检查网址是否包含google.com,但是也不会有效。

由于

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

设置url属性对您没有帮助,因为它只是从底层数据构建的。 [编辑:我错了,请参阅Maximilian的回答。不过,我的其余部分仍然有用。]

根据您想要完成的内容,有两种选择。

(1)您可以向客户端发送实际的HTTP redirection response。假设客户端了解HTTP重定向,它会向您提供的网址提交请求。

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)您可以静默地将相同的请求路由到其他主机。客户端不会看到这一点,它会假设它仍在与google.com通话。

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

这些片段改编自mitmproxy自己的GitHub回购中的an example。那里有many more examples

出于某种原因,当使用使用TLS https://)时,我似乎无法使这些代码段适用于Firefox,但是您可能不需要它。

答案 2 :(得分:2)

以下mitmproxy脚本

  1. 将请求从mydomain.com重定向到newsite.mydomain.com
  2. 将请求方法路径(应该是/getjson?更改为新的路径`/ getxml
  3. 更改目标主机方案
  4. 更改目标服务器端口
  5. 覆盖请求标头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"