使用 mitmproxy 将表单键/值转换为正文帖子



我正在尝试使用 mitmproxy 来调整来自客户端(监控代理(的请求,但我无法更改。

客户端无法将数据(例如 JSON 或 SOAP XML 数据(发布到请求中。它只能发布表单名称/值对(或标题名称/值(。

我正在尝试通过以下方式解决此限制:

  • 让客户端发布表单对:"phony_key=">
  • 使用mitmproxy删除密钥并仅发布数据

使用替换表达式运行代理以去除"phony_key="最初看起来不错

mitmproxy --replace /~bq/phony_param=/ 

。当我调用 curl 的请求时产生了一个很好的结果,类似于

curl -d phony_param='<SOAP-ENV:Envelope></SOAP-ENV:Envelope> https://host:port/path

但是当从真实客户端调用时,请求被服务器拒绝。

我认为这是因为从真实客户端发送的数据有效负载是 urlencoded 的。使用十六进制选项检查 mitmproxy 中的请求表明了这一点。

0000000000 25 33 43 53 4f 41 50 2d 45 4e 56 25 33 41 45 6e   %3CSOAP-ENV%3AEn
0000000010 76 65 6c 6f 70 65 2b 78 6d 6c 6e 73 25 33 41 53   velope+xmlns%3AS
0000000020 4f 41 50 2d 45 4e 56 3d 25 32 32 68 74 74 70 25   OAP-ENV=%22http%

而通过 curl 调用发出的请求在十六进制视图中显示未编码的 XML。

从那以后,我尝试制作一个内联脚本来完成这项工作

def request(context, flow):
    if flow.request.method == "POST":
        form = flow.request.get_form_urlencoded()
        real_post = form.get("phony_param")[0]
        form.__delitem__("phony_param")
        print real_post
        flow.request.content = real_post
        flow.request.set_form_urlencoded(form)

上面我正在尝试删除表单名称/值,将值添加到请求内容并重新添加修改后的表单。我不认为我走在正确的路线上,或者至少它还没有奏效。

感谢 mhils 在这方面的帮助。

脚本的问题在于request.set_form_urlencoded和设置 request.content 都替换了 HTTPRequest 的内容。您应该设置一个或另一个。

错误地认为我应该对我的代理过滤器进行编码,以在传入请求中保留任何其他表单参数。但经过反思,HTTP POST不会混合不同的内容类型。因此,丢弃表单是正确的。

修改后的脚本将生成有效的请求:

def request(context, flow):
    if flow.request.method == "POST":
        form = flow.request.get_form_urlencoded()
        real_post = form.get_first("phony_param")
        if real_post:
            flow.request.content = real_post

最新更新