ZAP2.4.3にいくつかバグを見つけて本家GithubのIssuesに報告していたのですが、それが先日リリースされたZAP 2.5.0でどこまで直っているかを確認してみます。
■[OWASP ZAP2.4.3にあったバグ1]
診断対象のURLのURLパラメーターのキーにブラケット([])等*が付いていると自動診断が失敗する
再現手順:
1) 以下のテスト用phpファイルを作成し、自分の管理下にあるウェブサーバーに設置します。
[test.php]
<html>
<body>
<?php print_r($_GET); ?>
</body>
</html>
本再現手順では、例として http://localhost/zaptest/test.php に設置することにします。
2) ブラウザのプロキシ設定にOWASP ZAPを設定し、以下のURLにアクセスして、ZAPの履歴にURLが記録されることを確認します。
http://localhost/zaptest/test.php?a=b&c=d&e=f&g[]=h
3) 上記2)のアクセスのZAP上の履歴を右クリックし「動的スキャン...」-「入力ベクトル」タブの 「Injectable Targets:」で「URL Query String」を選択、「ポリシー」タブで、「インジェクション」以外のThresholdを「オフ」にし、「スキャンを開始」ボタンを押下します。
4) スキャンが開始されると、ZAPの「動的スキャン」タブがアクティブになり、ZAPがアクセスしたURLが「動的スキャン」タブ内の履歴のリストにどんどん溜まっていくので、一見、普段通りZAPが自動診断を行っているように見えます。
が、よく見ると履歴のリストに出てくるURLのGETパラメーターが変動していません。
診断が行われているなら色々とGETパラメーターが変化するはずなのに、パラメーターが全く変化せずにただひたすら同じURLへのアクセスを繰り返しています。
5) 比較として、2)のURLからブラケット([])を外したURLにアクセスし、そのURLに対して診断を行ってみます。
診断対象URL(改):
http://localhost/zaptest/test.php?a=b&c=d&e=f&g=h
診断ログ:
今度はちゃんとURLパラメーターが変化しており、診断がちゃんと行われていることが分かります。
このバグに気づいて本家GitHubのIssuesに投稿したところ、既知の問題だった模様で、#1848 のIssue とduplicate ということでそちらのIssueにマージされました。
(ひどい英語で)報告したIssueのURL:
https://github.com/zaproxy/zaproxy/issues/2152
Issue報告した後、しばらくZAPの次期バージョンが出るのを待っていたのですが、なかなか出ないので、とりあえず問題を周知させようとOWASP ZAP Japan Groupに投稿したりもしました。
https://groups.google.com/forum/#!topic/owasp-zaproxy-japan/dMWp_HKShbU
本現象のZAP2.5.0での検証結果:
ZAP2.5.0で、上記と同じ手順で2)のURLに対して動的スキャンをかけると、ちゃんと各パラメーターに対し診断が行われていることが確認できます。本問題はZAP2.5.0で修正されています。
[2016/6/10追記]
本問題に関連して、ブラケット以外の記号でも同様の問題が起こるケースがあることを発見し、本家GitHubのIssuesに関連情報として報告していましたが、私個人としてもその後業務でURLパラメーターのキーのほうにブラケット以外の記号がつくというケースに出会わなかったこともあり、本家でも重要な扱いを受けずに放置後クローズされたので、この件はあまり重要な問題でないという印象になっていました。
ただ、ケースとしてあまりないとはいえ、URLパラメーター側のキーに何かしらの記号が付くこともありうるので、今回洗い出してみたところ、ブラケットを含む13種類の文字で、今回のようなバグが発動するようです。
[調査対象文字]
ASCII文字のprintableな文字から英数を除いた全記号
[確認した手順]
http://localhost/zaptest/test.php?a=b&c=d&e[文字]=f
この[文字]の位置に記号を入れてテスト環境にアクセスしてZAPで上記の再現手順と同じ設定にして動的スキャンをかけてみました。
その結果、以下の記号が今回のバグを発生させるようでした。
記号 | ZAP2.4.3 | ZAP2.5.0 |
---|---|---|
(半角スペース) | NG | OK |
" | NG | OK |
+ | NG | OK |
< | NG | OK |
> | NG | OK |
[ | NG | OK |
\ | NG | OK |
] | NG | OK |
^ | NG | OK |
` | NG | OK |
{ | NG | OK |
| | NG | OK |
} | NG | OK |
(※2016.6.14 記号が2つ欠けていたので追加しました)
また、上の表にあるように、ZAP2.5.0で動作に異常がないか確認したところ、すべての記号で問題なく動的スキャンが正常動作しました。
(念のためZAP2.5.0でもASCII文字のprintableな文字から英数を除いた全記号でテストしてみましたが、すべての記号で正常動作したので、このバグに関してはZAP2.5.0で完全に直っているようです)
※書いてみたら長くなったので以後続きます。
今後ZAP2.5.0で直っているか確認する予定のバグ:
バグ2: POSTパラメーターのキーにブラケット([])がついているものが複数あると、自動診断時に勝手に一つにまとめられてしまう
https://github.com/zaproxy/zaproxy/issues/2153
バグ3: 出力にXSSがあっても、<html>~</html>の内部でないと自動診断で検出してくれない
https://github.com/zaproxy/zaproxy/issues/2279
バグ4: ZAP2.5.0リリース後に報告したので2.5.0に存在。診断対象URLにスコープ外へのリダイレクトがある場合、ZAPがスコープ外へアクセスしてしまう場合がある
https://github.com/zaproxy/zaproxy/issues/2546
(2016.6.13 当初「バグ4」として書くつもりだった項目はバグ2の補足情報として書いたのでこのリストから消しました。)