■[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¶m%5B%5D=value2¶m%5B%5D=value3&
param%5B%5D=value4¶m%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」タグも付かず何の処理もされていません)
続きます。