0

mitmproxy を使用して、変更できないクライアント (監視エージェント) からの要求を適応させようとしています。

クライアントは、JSON や SOAP XML データなどのデータを要求に POST できません。フォームの名前と値のペア (またはヘッダーの名前と値) のみを投稿できます。

私は次の方法でこの制限を回避しようとしています:

  • クライアントにフォームのペアを投稿させる: "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

しかし、実際のクライアントから呼び出されると、要求はサーバーによって拒否されました。

これは、実際のクライアントから送信されるデータ ペイロードが urlencode されているためだと思います。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 の呼び出しによって作成されたリクエストは、16 進表示でエンコードされていない 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)

上記では、フォームの名前/値を削除し、値をリクエストのコンテンツに追加して、変更されたフォームを追加しようとしています。私は正しい方向に進んでいるとは思わないか、少なくともまだ機能していません。

4

1 に答える 1

0

これについて支援してくれたミルズに感謝します。

スクリプトの問題は、 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
于 2014-12-09T08:48:30.407 に答える