前の投稿 次の投稿

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

[OWASP ZAP2.4.3にあったバグ2]
POSTパラメーターのキーにブラケット([])がついているものが複数あると、自動診断時に勝手に一つにまとめられてしまう


本家GitHubのIssuesに(ひどい英語で)報告した
https://github.com/zaproxy/zaproxy/issues/2153
の解説です。

再現手順:
1) 以下のPOSTテスト用htmlファイルを作成し、ブラウザからZAP2.4.3を通してPOSTを行います(POST先は自己管理下のWEBサーバーであればどこでも良いので環境に合わせて書き換えてください)。

<html>
<body>
<form method="post" action="http://localhost/zaptest/test.php">
<input type="text" name="param[]" value="value1"><br>
<input type="text" name="param[]" value="value2"><br>
<input type="text" name="param[]" value="value3"><br>
<input type="text" name="param[]" value="value4"><br>
<input type="text" name="param[]" value="value5"><br>
<input type="submit" value="submit"><br>
</form>
</body></html>


2) ZAP 2.4.3の履歴に以下のようなリクエストが表示されます。

POST http://localhost/zaptest/test.php HTTP/1.1

param%5B%5D=value1&param%5B%5D=value2&param%5B%5D=value3&
param%5B%5D=value4&param%5B%5D=value5


このURLへのアクセスのZAP上の履歴を右クリックし「動的スキャン...」-「入力ベクトル」タブの 「Injectable Targets:」で「POST Data」を選択、「ポリシー」タブで、「インジェクション」以外のThresholdを「オフ」にし、「スキャンを開始」ボタンを押下します。

3) ZAP2.4.3上で動的スキャンが開始されるので、動的スキャンの履歴を選択して「リクエスト」タブの内容を見てみると、以下のように、POSTデータがparam[]=xxxxx(診断用文字列)1つだけになってしまっています。

オリジナルのリクエスト:


「動的スキャン」時のリクエスト:


これはおそらく、ZAP2.4.3がPOSTパラメーターのキーにあるブラケット([])を配列を表す記号として解釈しておらず、「同じ値が5つ並んでいる」と判断したせいではないかと思われたので、試しにvalue5のキーだけ「name<>」に変えてみたところ、やはり動的スキャン時にvalue5のkey=valueだけ別の診断対象パラメーターとして扱われました。

ZAPのこの挙動は、POST値を配列で受け取り、その配列内の順番で値の意味付けを変えるようなWEBアプリケーションを診断する場合や、配列でx個の値がPOSTされてくることを前提として作られているようなWEBアプリケーションの診断の場合に、問題を発生させる恐れがあります。


本現象のZAP2.5.0での検証結果:

ZAP2.5.0で、上記と同じ手順で2)のURLに対して動的スキャンをかけると、ちゃんとPOSTパラメーターが5つあるという扱いになるので、本問題はZAP2.5.0で修正されています。





[残っている問題]

ZAP2.5.0では、POST値が配列となっている場合でも、動的スキャンは各key=valueごとに実施されることが分かりましたが、「診断結果が一つにまとめられる」という問題がまだ残っているようです。

ZAP only report the first XSS in array value #2496
https://github.com/zaproxy/zaproxy/issues/2496

で報告した問題ですが、これはZAP2.5.0でも同じ挙動になります。

再現の手順としては、

2-1) 上記[バグ2]の手順1)のPOST先のphpファイルを、以下のようにPOSTされた値を全てそのままエコーバックするような作りにします。

[test.php]
<html>
<body>
<?php print_r($_POST); ?>
</body>
</html>


2-2) このtest.phpに対し、上記[バグ2]の手順1)のhtmlからPOSTを行い、「クロスサイト・スクリプティング(反射型)」の診断を行ってみると、name[]に対するvalue1~5のそれぞれの箇所でXSSが検出されるはずなのに、検出されるXSSは一件のみで、「アラート」タブに出てくるXSSはvalue1の箇所のXSSのみとなっています。

これでは、value1~5の意味が違う場合などに、value1でXSSが検出された、という診断結果しか出てこないので、XSS脆弱性がある箇所を見誤る危険性があります。

これについては現状、ZAP2.5.0の修正待ちです。(ただし本家GitHubのIssuesに投稿後23日も経っていますが、コメントはおろか「Bug」タグも付かず何の処理もされていません)


続きます。

Leave a Reply

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