前の投稿 次の投稿

OWASP ZAP2.4.3にあったバグが2.5.0でどこまで修正されたか確認する part4(修正版)

[OWASP ZAP2.4.3にあったバグ4] 診断対象URLにスコープ外へのリダイレクトがある場合、ZAPがスコープ外へアクセスしてしまう場合がある(2016/6/20改題)


本家GitHubのIssuesに(多少マシになったような気がする英語(当社比)で)報告した
https://github.com/zaproxy/zaproxy/issues/2546
の解説です。

これはZAP2.5.0リリース後に報告したので、2016/6/20現在、この問題はZAP2.5.0にも存在しています。

※本記事の修正前のバージョンでは、
・http://localhost/zaptest/redirect.php に対する動的スキャンではスコープ外のリダイレクトが起こらない
・http://localhost/zaptest/redirect.php?a=b の動的スキャンの時にスコープ外への不正なリダイレクトが起こる場合がある
という内容を書いていました。

が、前者のパラメーターなしのURLに対する動的スキャンであってもリダイレクトが発生するケースがあることを発見したので(ディレクトリブラウジングの検査の場合)「スコープ外へのリダイレクトがある場合、リダイレクト先にアクセスしてしまうことがある」という形に改めてまとめ直すことにしました。

また、修正前のバージョンではリダイレクトしない正常なケースでの例示が、URLパスが改変された診断項目のものでリダイレクトが起こり得ないログを例示しており例としては不適切なものでした。ミスをお詫びいたします。(今回の修正版では記事が長くなってしまうため正常なケースの例示を削除しました)


再現手順:
1) ZAP 2.5.0、もしくはZAP 2.4.3を起動します。

2) FiddlerもしくはBurp Suiteを起動します。

3) ZAPとFiddlerもしくはBurp Suiteのネットワーク設定を行い、以下のように多段プロキシの状態にします。

[ブラウザ] - [ZAP] - [Fiddler または Burp Suite] - [診断対象のサイト]


4) 以下のphpファイルを作成し、自分の管理下のウェブサーバーに置きます。

[redirect.php]
<?php
header('Location: https://www.*****.com/');
exit;
?>

※このphp内に書いてある「https://www.*****.com/」は、自分の管理下にある(=ZAPで診断しても問題のない)URLを指定してください。

本例では、このファイルが http://localhost/zaptest/redirect.php というURLに設置されていて、
リダイレクト先は
header('Location: http://127.0.0.1/redirecttest/');
が設定されているものとして進めます。
(リダイレクト先の実体が外部サーバーでないので例として微妙ですが、「スコープ外」という判定になるはずのサーバということで…。ここに外部サーバーを指定しても同じ動きをします)


5) スコープの外部へのリダイレクトが起こってしまう設定例を以下に示します。

5-1) プロキシとしてZAPを設定したブラウザで、URLパラメーターをつけて http://localhost/zaptest/redirect.php?a=b にアクセスします。

5-2) ZAPを「プロテクトモード」にし、 'http://localhost/' をデフォルトコンテキストに入れます。

5-3) ZAPの履歴から http://localhost/zaptest/redirect.php へのアクセスを右クリックし、「入力ベクトル」タブの「Injectable Targets」で全てにチェックを入れます。


「ポリシー」タブの全てのカテゴリのthresholdをいったん全てオフにし、それから「インジェクション」カテゴリの'Server Side Include'のthresholdを「既定」に戻します(Server Side Includeのスキャンのみが実行される設定にします)。


いったん全てオフにした後に、


Server Side Includeだけを「規定」に戻します。

それからhttp://localhost/zaptest/redirect.phpの履歴へ動的スキャンを実施し、ZAPではなくFiddlerもしくはBurpのログを確認します。(他のプロキシを使う理由は、ZAPの実際の動作を確認するためです)

ZAPではこの場合リダイレクトのログが出ないため、ZAPではなくFiddlerもしくはBurpのログを確認します。

ZAPの動的スキャンの履歴では、以下のようにリダイレクト先にアクセスしている記録は出ないのですが、


FiddlerもしくはBurpのログを見ると、ZAPが http://127.0.0.1/redirecttest/ にアクセスしてしまっています。(例はFiddlerの画面です)


これが仕様なのかバグなのか不明だったのでIssueで質問したところ、まずそうなのでASAPで調べるという回答があり、その後比較的迅速に対応されつつあるようなので、まずいバグだったようです。

この問題の現在のステータスは、https://github.com/zaproxy/zaproxy/issues/2546 を見ると、修正が入り、クローズされていますが、修正版がまだリリースされていない状態です。(2016/6/20現在)


上記は問題が発生する一例で、リダイレクトがあるページにURLパラメーターが付いている場合だと、'Server Side Include'を含め多くのスキャンルールでリダイレクト先へのアクセスが発生してしまうようです。

また、いろいろ設定を変えて調べてみた結果、リダイレクトがあるページにURLパラメーターを付けないでアクセスした場合はZAPは大半のケースでリダイレクトせずに踏みとどまるのですが、'ディレクトリブラウジング'の検査の場合にはリダイレクト先へのアクセスが発生してしまうようです。

[この問題の回避策]
スコープ外へのアクセスを避けるため、回避策を調べてみたところ、

・ZAPの「セッションのプロパティ」-「コンテキストから除外」→効果なし(リダイレクト先へのアクセス発生)
・ZAPの履歴右クリック-「以下の処理から除外」-「プロキシ」→効果なし(リダイレクト先へのアクセス発生)

と、ZAPだけだとリダイレクト先にアクセスしないように設定することができないようなので、ZAPの先に多段でFiddlerもしくはBurpを繋げて、Fiddlerのオートレスポンダーで404で返すようにするか、Burpのスコープ外へのアクセスをドロップする設定で回避する手段しかないようです。

FiddlerのAutoResponderの設定方法:

(1) URLを選択
(2) AutoResponderタブを選択
(3) AddRuleボタンを押下
(4) If Request Matches... のところに(1)のURLが出てくる
(5) Rule Editorの欄に「EXACT:http://127.0.0.1/redirecttest/」というURLが入力される
(6) プルダウンより「404_Plain.dat」を選択し「Save」
(7) 「Enable rules」「Unmatched requests paththrough」にチェック

これで、当該URLにアクセスしようとすると404が返ることになります。

※この手順で指定しているAutoResponderの

EXTRACT:http://~

という指定は完全一致の指定なので、リダイレクト先URLが変化する場合は、regex:を使って正規表現でマッチさせる必要があります。正規表現による指定の方法は以下のページなどを参照ください。
http://docs.telerik.com/fiddler/KnowledgeBase/AutoResponder

Burp Suiteでのスコープ外へのアクセスをドロップする設定方法:
(1)「Target」-「Site map」からドメインを右クリックして「Add to scope」を選択


(2)「Options」-「Connections」の「Out-of-Scope Requests」の設定項目の「Drop all out-of-scope requests」のチェックを入れます。

これで、http://localhost/以外へのリクエストが発行されてもBurp Suiteのところでドロップされるようになります。

Leave a Reply

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