※当ブログではアフィリエイト広告を利用しています。
ペネトレーションテストツール「OWASP ZAP」でWEBサイトの脆弱性を簡易チェックする方法は以前、エントリにまとめましたが、フォームで入力チェックを行っている場合などはその方法では脆弱性を検知できないことがあります。
そのような場合でも「OWASP ZAP」をプロキシとして使用し、リクエストを再現すれば脆弱性を検知できるため、その方法をまとめます。
OWASP ZAPの簡易チェック(Quick Start)で脆弱性が発見できないのはどんな場合?
以前のエントリで紹介した方法では、指定したURLにOWASP ZAPが自動的にスキャンをかけて脆弱性をチェックしました。
しかしお問い合わせフォームなどでプログラムの先頭のほうで値の入力チェックを行う場合などは入力チェックエラー等で処理が途中で終わることがあります。このような場合、本来脆弱性があるプログラムでも「OWASP ZAP」で脆弱性が検知されないケースがあります。
OWASP ZAPで脆弱性が発見できない具体例
サンプルプログラムprintpost.php
を例にとってOWASP ZAPで脆弱性が検出されないパターンをみていきます。サンプルプログラムはGitHubにアップしたので参考までにご覧ください。脆弱性があるのでローカル環境でのみお使いください。
https://github.com/fidn/xssformsample
printpost.php
ではフォームindex.php
からPOSTで送信された値name1
値に応じて以下の処理をします。
POSTされた値name1
が空白の場合、エラーのみ表示する。
POSTされた値name1
が空白でない場合、POSTされた値をそのまま表示する。
(POSTされた値をエスケープせずそのまま表示するためXSS脆弱性があります)
このような場合OWASP ZAPのURL指定でprintpost.php
をそのままチェックしても、POSTされる値がないためエラーのみ表示される状態となり、本来検知されるべきXSSの脆弱性が検知されません。
上記のようなプログラムの脆弱性をチェックしたい場合、OWASP ZAPをプロキシとして使うことで脆弱性を発見することができます。
OWASP ZAPをプロキシとして使い脆弱性チェックする手順
以下のような流れで実施します。
- ローカルエリアネットワーク(LAN)でプロキシの設定
- ブラウザで脆弱性のあるプログラムにリクエストを送信
- リクエストを再現してOWASP ZAPで動的スキャン
ローカルエリアネットワーク(LAN)の設定
OWASP ZAPをプロキシとして使うための設定を行います。
OWASP ZAPを起動し、「ツール」→「オプション」を選択します。
左メニューの「ローカル・プロキシ」を選択し、右側の画面に表示される「Address」と「ポート」を確認します。デフォルトではlocalhost:8080
となっています。すでに他のプログラム等で8080番のポートを使っている場合は任意のポート番号に変更し、「OK」を押します。
Internet Explorerを開き、設定から「インターネットオプション」を開きます。
「プロキシ サーバー」欄の「LANにプロキシサーバーを使用する」にチェックを入れ、アドレスとポートに先ほどOWASP ZAPで確認したアドレスとポートを入力し、OKボタンを押します。
※これ以降はOWASP ZAPが起動していないとブラウザでページ表示ができなくなります。プロキシを使用しない設定に戻すには「LANにプロキシサーバーを使用する」のチェックをオフにします。
ブラウザで任意のサイトを開き、OWASP ZAPの「履歴」タブに開いたページが記録されていればOWASP ZAPをプロキシとして使うための設定は完了です。
ブラウザで脆弱性のあるプログラムにリクエストを送信
ブラウザで正常時のフォーム送信操作を実施し、OWASP ZAPにリクエスト内容を記録します。
正常な結果となる値をフォーム送信します。今回のサンプルプログラムでは空白以外であれば何でもOKです。
リクエストを再現してOWASP ZAPで動的スキャン
フォーム送信後OWASP ZAPを見てみると、printpost.php
に送信されたリクエストの内容が記録されています。
このPOSTリクエストの履歴を右クリックし、「攻撃」→「Active Scan single URL」を選択します。
記録されたリクエストをもとに、自動的に脆弱性チェックのスキャンがはじまります。
スキャンが完了した後「アラート」タブを見ると、簡易チェックでは発見できなかったXSS(Cross Site Scripting(Reflected))脆弱性が検知されました。脆弱性のあるパラメータname1
も検知されています。
今回はXSSのみを例にとりましたが、SQLインジェクションやパストラバーサルなどの脆弱性も同様にチェック可能です。
おわりに
OWASP ZAPをプロキシとして使う方法を用いれば、ログインが必要なサイトや入力チェックが多いサイトでも脆弱性チェックをすることが可能です。
ただしメールを送信するお問い合わせフォームをチェックする場合などは動的スキャンで大量にリクエストを送信するため、メールも大量に送信されてしまう可能性があります。(開発環境だったので被害はありませんでしたが実際にやってしまったことがあります)
脆弱性検査で他への被害を生み出しては元も子もないので、完全に閉じた開発環境でテスト実施する等の考慮も重要ですね。