OWASP ZAP で送信されるリクエストに自動で独自ヘッダを追加する方法

プロキシ設定したブラウザを手動操作した時、各スキャンを実行した時、Fuzzerを実行した時などに送信されるHTTPリクエストに独自ヘッダを追加する方法をメモしておきます。スクリプトを使う方法(今回の例では JavaScriptを使います)なのですが、この方法を知っていると他にもいろいろ応用が効きます。

この記事は、OWASP ZAP User Group に投稿されていた以下の内容を基にしています。

動作確認した環境

  • OWASP ZAP 2.3.1

手順

  1. [Scripts]タブをクリックします。
  2. スクリプトを新規作成します。
    • Script 名
      • 任意の名前を付ける
    • タイプ
      • Stand Alone
    • Script engine
      • ECMAScript : Oracle Nashorn
    • テンプレート
      • なし
  3. 以下のコードを記述します。

    今回の例は、HTTPリクエストに X-MyCustomHeader: ValueOfMyCustomHeaderというヘッダを追加するコードになります。

    
     // HttpSenderListenerというインタフェースを持ったリスナーを HttpSender に登録する
     org.parosproxy.paros.network.HttpSender.addListener(
       new org.zaproxy.zap.network.HttpSenderListener {
         getListenerOrder: function() {
           return 1;
         },
    
         // リクエスト送信前に呼ばれる            
         onHttpRequestSend: function(msg, initiator) {
           // メッセージオブジェクトのリクエストヘッダ部分に独自ヘッダを追加する
           msg.getRequestHeader().setHeader(
             "X-MyCustomHeader", "ValueOfMyCustomHeader");
         },
    
         // レスポンス取得後に呼ばれる        
         onHttpResponseReceive: function(msg, initiator) {
         }
     });
     
  4. [実行]ボタンを押します。
    • リクエストにヘッダを追加するリスナーが、ZAP内部に登録されます。
    • これ以後、プロキシ設定したブラウザによるリクエスト・各スキャン処理で送信するリクエスト・Fuzzerで送信するリクエスト等には、独自ヘッダが追加されます。

やっていることのメモ

  • ZAP は JSR-223 を使って JavaScriptを実行しています。
    • Java 8 からはエンジンが Nashorn になりました。(それまでは Rhino)
    • JavaScript からは、ZAPが内部で使用している Java のクラスをそのまま使用することができます。
  • HttpSender は HTTPリクエストを送信してレスポンスを取得するクラスです。これは、プロキシ処理・各スキャン処理・Fuzzer等で使用されています。
  • HttpSender には リスナー(HttpSenderListener)を登録することができます。
    • このリスナーは、リクエストが送信される直前とレスポンスが返ってきた直後に呼ばれ、各メッセージデータを操作することができます。
    • ZAPの中では、この機構を利用していろいろなリスナーが使用されています。
    • 今回は、ここにリスナーを1つ追加したことになります。
  • コードの中の msg は、HttpMessage クラスのインスタンスです。リクエストやレスポンスの情報を持っています。

その他のメモ

  • リスナーを削除するメソッドは無さそうなので、ZAPを終了させないと今回追加した処理は無効にならないみたいです(もしかしたら何か方法があるかもしれませんが)。
  • プロキシ設定したブラウザを手動で操作する場合の HTTPリクエストだけに何かしたい場合は、Stand Alone ではなく、Proxy というタイプのスクリプトを生成して使用します。
    • Proxy用に独自ヘッダを追加するスクリプトの例
      • これは、ProxyScript というインタフェースを利用していることになります。
    
      function proxyRequest(msg) {
        msg.getRequestHeader().setHeader(
          "X-MyCustomHeader", "ValueOfMyCustomHeader"); 
        return true 
      } 
    
      function proxyResponse(msg) { 
        return true 
      }
      
  • 今回の方法を応用すれば、かなりいろいろなことができるはずですが、内部処理の知識がないと有効活用するのは難しそうです。また、書いたスクリプトのデバッグがちゃんとできない(?)ので、どのみち複雑な処理は書けないのではないかという気もします。

[最終更新日: 2014年11月14日]

Pocket

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*