OWASP ZAPをプロキシとして使用し、リクエストを再現して脆弱性チェックする方法

OWASP ZAP

※当ブログではアフィリエイト広告を利用しています。

ペネトレーションテストツール「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脆弱性があります)
サンプルフォームXSS

このような場合OWASP ZAPのURL指定でprintpost.phpをそのままチェックしても、POSTされる値がないためエラーのみ表示される状態となり、本来検知されるべきXSSの脆弱性が検知されません。
OWASP ZAP 脆弱性が検出されない

上記のようなプログラムの脆弱性をチェックしたい場合、OWASP ZAPをプロキシとして使うことで脆弱性を発見することができます。

OWASP ZAPをプロキシとして使い脆弱性チェックする手順

以下のような流れで実施します。

  • ローカルエリアネットワーク(LAN)でプロキシの設定
  • ブラウザで脆弱性のあるプログラムにリクエストを送信
  • リクエストを再現してOWASP ZAPで動的スキャン

ローカルエリアネットワーク(LAN)の設定

OWASP ZAPをプロキシとして使うための設定を行います。

OWASP ZAPを起動し、「ツール」→「オプション」を選択します。
OWASP ZAP ツール オプション

左メニューの「ローカル・プロキシ」を選択し、右側の画面に表示される「Address」と「ポート」を確認します。デフォルトではlocalhost:8080となっています。すでに他のプログラム等で8080番のポートを使っている場合は任意のポート番号に変更し、「OK」を押します。
OWASP ZAP ローカルプロキシ

Internet Explorerを開き、設定から「インターネットオプション」を開きます。
インターネットオプション

「接続」タブの「LANの設定」ボタンを押します。
インターネットオプション LANの設定

「プロキシ サーバー」欄の「LANにプロキシサーバーを使用する」にチェックを入れ、アドレスとポートに先ほどOWASP ZAPで確認したアドレスとポートを入力し、OKボタンを押します。
インターネットオプション プロキシの設定

※これ以降はOWASP ZAPが起動していないとブラウザでページ表示ができなくなります。プロキシを使用しない設定に戻すには「LANにプロキシサーバーを使用する」のチェックをオフにします。

ブラウザで任意のサイトを開き、OWASP ZAPの「履歴」タブに開いたページが記録されていればOWASP ZAPをプロキシとして使うための設定は完了です。
OWASP ZAP プロキシ動作チェック

ブラウザで脆弱性のあるプログラムにリクエストを送信

ブラウザで正常時のフォーム送信操作を実施し、OWASP ZAPにリクエスト内容を記録します。

ブラウザでサンプルプログラムにアクセスします。
サンプルプログラムをブラウザで開く

正常な結果となる値をフォーム送信します。今回のサンプルプログラムでは空白以外であれば何でもOKです。
リクエストを送信する

リクエストを再現してOWASP ZAPで動的スキャン

フォーム送信後OWASP ZAPを見てみると、printpost.phpに送信されたリクエストの内容が記録されています。
POSTリクエストが記録されている

このPOSTリクエストの履歴を右クリックし、「攻撃」→「Active Scan single URL」を選択します。
OWASP ZAP Active Scan single URL

記録されたリクエストをもとに、自動的に脆弱性チェックのスキャンがはじまります。
OWASP ZAP 動的スキャン中

スキャンが完了した後「アラート」タブを見ると、簡易チェックでは発見できなかったXSS(Cross Site Scripting(Reflected))脆弱性が検知されました。脆弱性のあるパラメータname1も検知されています。
owasp-zap-xss-found

今回はXSSのみを例にとりましたが、SQLインジェクションやパストラバーサルなどの脆弱性も同様にチェック可能です。

おわりに

OWASP ZAPをプロキシとして使う方法を用いれば、ログインが必要なサイトや入力チェックが多いサイトでも脆弱性チェックをすることが可能です。

ただしメールを送信するお問い合わせフォームをチェックする場合などは動的スキャンで大量にリクエストを送信するため、メールも大量に送信されてしまう可能性があります。(開発環境だったので被害はありませんでしたが実際にやってしまったことがあります)

脆弱性検査で他への被害を生み出しては元も子もないので、完全に閉じた開発環境でテスト実施する等の考慮も重要ですね。