我正在尝试使用 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。使用 hex 选项检查 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)
上面我试图删除表单名称/值,将值添加到请求内容并添加回修改后的表单。我不认为我在正确的路线上,或者至少它还没有工作。