前の投稿 次の投稿

OWASP ZAP のスクリプトを作ってみる part6

Active Rulesスクリプト編(3) scan関数を使ったスクリプト


それでは前回からの続きで、scan関数を使ったサンプルスクリプトを作成します。

scan関数は、part4で確認した通り

・scan()関数は、「入力ベクトル」で指定された攻撃ベクター(URL Query String / POST Data 等)に合致する項目ごとにコールされる
(コールされる際、引数にパラメーターのkeyとvalueがそれぞれ入る)

なので、「パラメーターを修正して投げる」ような処理に向いています。
今回は、GETの各パラメーターのキーにブラケット([])を付けてリクエストを行うサンプルを書いてみます。

スクリプト中のコメントにも書いてありますが、GETパラメーターのキーにブラケットを付けて、どんなレスポンスが戻ってくれば異常といえるのかは定義ができず、自動的な判定が難しいため、ひとまずステータスコードが200以外だったらアラート、という処理にはしてありますが、このスクリプトの場合人間の目による結果の監視が必要と思います。
// scannode関数
function scanNode(as, msg) {
    //nop 何もしない
}

// scan関数
function scan(as, msg, param, value) {

    // 停止ボタンが押されていたら止める
    if (as.isStop()) {
        return
    }

    // デバッグログ
    print('scan called for url=' + msg.getRequestHeader().getURI().toString() + 
        ' param=' + param + ' value=' + value);
    
    // リクエストをコピー
    var clmsg = msg.cloneRequest();
    
    // setParam (message, parameterName, newValue)
    as.setParam(clmsg, param+'[]', value);
    
    // sendAndReceive(msg, followRedirect, handleAntiCSRFtoken)
    as.sendAndReceive(clmsg, true, false);
    
    // レスポンスのステータスコードを取得
    statusCode=clmsg.getResponseHeader().getStatusCode();

    // ステータスコードが200以外だったら異常が発生したとみなす。
    // ただし、キーにブラケット([])を追加することによってどんなレスポンスが戻ってくれば
    // 異常と言えるか不明なので正確な自動判定は難しい。人間によるログ確認が必要。
    if(statusCode!=200){

        // raiseAlert(risk, int confidence, String name, String description, 
        //   String uri, String param, String attack, String otherInfo, 
        //   String solution, String evidence,int cweId, int wascId,
        //   HttpMessage msg)
        // risk: 0: info, 1: low, 2: medium, 3: high
        // confidence: 0: falsePositive, 1: low, 2: medium, 3: high, 4: confirmed

        as.raiseAlert(1, 2, '*** parameter bracket error ***', 
         '*** parameter bracket error ***',
         clmsg.getRequestHeader().getURI().toString(), 
         param, '(bracket)', '(bracket)', '(bracket)',
         param+'[]', 0, 0, clmsg);
    }
}

このスクリプトをpart4でやったように、ActiveRulesスクリプトとして保存・有効化し、例えば

http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc=ddd&eee=fff

にアクセスして、それから手っ取り早くステータスコードを200以外にするためにWEBサーバーを停止してから、対象URLに対して「Script Active Scan Rules」のみ有効の動的スキャンをかけると、以下のようなアラートが「アラート」タブに記録されます。



また、ZAPがどのようなリクエストを行っているか、ZAPの先にFiddlerなどのもう一つのプロキシツールをかませて通信を記録すると、ちゃんと各パラメーターのキーにブラケットが付いていることが確認できます。(ZAP2.5.0の場合。2.4.3の場合、おそらくは例のバグの関連でキーにブラケットが付かないリクエストが飛び、意図通り動作しません)

実行時にZAPが発行したリクエスト(ZAPの先にFiddlerを接続して確認):

http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa%5B%5D=bbb&ccc=ddd&eee=fff
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc%5B%5D=ddd&eee=fff
http://localhost/zaptest/dir1/dir2/dir3/test.php?aaa=bbb&ccc=ddd&eee%5B%5D=fff


Active Rulesスクリプト編はこれで終わりです。

次へ

Leave a Reply

Powered by Blogger.
© WEB系情報セキュリティ学習メモ Suffusion theme by Sayontan Sinha. Converted by tmwwtw for LiteThemes.com.