ある方から質問を受けたのもあり、OWASP ZAPの基本的な使い方(手動診断編)の続編として、「環境構築からテストサイトを構築して動的スキャンでXSSなどを検出するまで」の手順を解説してみます。
OWASP ZAP初心者が基本的な動的スキャン検査を行えるようになるまでの手順、という位置づけです。
ここでは、Windows環境で、XAMPPとOWASP ZAPを一からセットアップするという形で解説します。(Win以外の環境や、XAMPP以外の環境を使いたい方は適宜ご自身の環境に合わせて読み替えてください)
■Windwows環境でXAMPPを使ったテストサイトの構築
まず注意点ですが、普通にインターネット上に公開されているサイトにOWASP ZAPの動的スキャンなどをかけたら、サイバー攻撃と見なされて最悪通報されてしまうため、OWASP ZAPで診断を行う対象は「自己の管理下にあるサイト」である必要があります。
つまり、OWASP ZAPの使い方を習得するにあたっては、ローカル環境や社内LAN上に「練習用の診断対象サイト」(いわゆるわざと脆弱性を持たせた「やられサイト」)を構築することがまず必要です。
「やられサイト」にはOWASP Mutillidae 2などがありますが、「やられサイト」のインストール・使いこなしはそれはそれでやや敷居が高い面があり、何かしらサイトを構築した経験があるのであれば、「検出したい脆弱性があるサイト」をローカル環境に自力で作ってしまうのが一番敷居が低い・手っ取り早いように思うので、ここではその手順で説明します。
1.XAMPPのインストール
XAMPPダウンロードサイトよりWindows向けXAMPPをダウンロードし、インストールします。
インストール時の手順については、特に難しい設定はないと思いますので、図などは割愛します。基本的にデフォルトの設定で「次へ」で進んでいけばインストールが完了します。
XAMPPインストール完了後、「スタート」-「XAMPP」-「XAMPP Control Panel」を選択するとXAMPPのコントロールパネルが起動します。
XAMPPのコントロールパネルで「Apache」のところにある「Start」のボタンを押下すると、Apacheが起動し、ブラウザから「http://localhost/」にアクセスすると、XAMPPのApacheが動作していることを表す「Welcome to XAMPP for Windows 5.6.28」等の表記があるページが表示されます。
もし、XAMPPのコントロールパネルで「Apache」のところにある「Start」のボタンを押下してエラーになる場合は、80ポートを別のアプリケーションが使っている可能性があります。
例えば、Skypeが起動している場合、Skypeはデフォルトでは80ポートを使うためエラーになります。この場合Skypeのオプションで80ポートではなく別のポートを使うように設定するオプションがありますので、その設定でSkypeが80以外の別のポートを使うように設定してください。
参考:Skype が占有するポート 80 を変更する方法
2.脆弱性診断用テストサイトの構築
検出したい脆弱性のある動的ページを作成します。
環境がXAMPPなので、単純なXSSのあるサイトをphpなどで作ればよいのですが、本手順では、Hack Your Design!様が公開しているXSS脆弱性のあるPHPコード簡易サンプルが1ソースでシンプルなので、こちらを利用させていただきます。
(自分自身にPOSTするフォームで、POST値がそのままページ上に表示される、というサンプルソースです)
上記サイトのサンプルコードをXAMPP内のApacheのドキュメントルート(デフォルトでは「C:\xampp\htdocs」下)に、test.phpなどの名前で保存し、ブラウザから「http://localhost/test.php」というURLにアクセスし、POSTを行い、ちゃんとサンプルサイトがPHPとして動作していれば、ZAP練習用のXSS脆弱性のあるサイトが完成します。
(この手順のままのXAMPPデフォルト環境だと、「Notice: Undefined index: xss_text in C:\xampp\htdocs\test.php on line 7」のようなメッセージが画面上に表示されるかもしれませんが、特に動作に支障はないのでそのまま放置でも良いですし、気になる場合はphp.iniなどでnoticeレベルのメッセージは表示しないように設定しましょう)
■OWASP ZAPのインストール・ブラウザのプロキシ設定
3.OWASP ZAPのインストール・設定
OWASP ZAPプロジェクトのサイトからWindows版のZAPをダウンロードし、そのままインストールを行います。(本記事執筆時の最新版は2.5.0です)
インストール完了後、OWASP ZAPを起動し、メニューの「ツール」-「オプション」-「ローカル・プロキシ」で、ZAPの待ち受けポートが「8080」になっているのを「7777」などの空いているポートに変更します。
(8080のままでも良いですが、8080ポートは他のアプリケーションとかぶりやすいので、エラーではまるのを防ぐため別ポートにしておいたほうが安全です)
4.ブラウザのプロキシ設定
ブラウザのプロキシ設定でOWASP ZAPの待ち受けポートを指定します。ここではFirefoxでの手順を説明します。
Firefoxのメニューの「ツール」-「オプション」-「詳細」-「ネットワーク」タブの「接続 インターネット接続に使用するプロキシを設定します。」の横の「接続設定...」ボタンを押下します。
出てきたウィンドウで「手動でプロキシを設定する」ラジオボタンを選択し、HTTPプロキシ欄に、ホスト「localhost」、ポート「7777」(ZAPの待ち受けポート)を指定し、「すべてのプロトコルでこのプロキシを使用する」にチェックを入れます。
また、今回のテストサイトがlocalhost上にあるため、「プロキシなしで接続」欄に、「localhost」「127.0.0.1」がある場合は削除します。
■ブラウザで対象サイトにアクセス・動的スキャン実施まで
5.ブラウザで対象サイト操作
4.の手順でプロキシ設定を終えたブラウザで、2.の手順で構築したテストサイトにアクセスを行います。
テストサイトにブラウザからアクセスした際、OWASP ZAPの履歴タブ内にテストサイトへのアクセス履歴が表示されます。(ここではブラウザの通信を、ローカルプロキシであるZAPが中継して通信内容を表示しています。ここでZAPに何も反応がなければブラウザのプロキシ設定やZAPのポート設定などのどこかが間違っています)
テストサイト上のフォームから任意の値(「aaa」など)をPOSTします。二つ目の履歴(「メソッド」が「POST」になっているもの)がZAPの履歴タブ内に記録されます。
ここで安全のための手順として、ZAP左上の「モード」を「標準モード」から「プロテクトモード」に変更します。
プロテクトモードにすると、「コンテキスト」に入れたサイト以外に対しては「攻撃」メニューが実行できなくなり、ZAPからの攻撃対象でなくなります。サイトを「コンテキスト」に入れる方法は次で解説します。
サイトツリーの「http://localhost」を右クリックし「Include in Context」-「規定コンテキスト」を選択し、「セッション・プロパティ」ウィンドウが出るのでそのままOKを押します。
すると、サイトツリーの「http://localhost」に赤い二重丸がつきます。この二重丸が付いているサイトにしかZAPは動的スキャンなどの処理を行わないため、想定外のサイトを攻撃してしまう事故が起こらなくなります。
ZAPの履歴タブの二つ目の履歴(「メソッド」が「POST」になっているもの)をZAP上で右クリックし、コンテキストメニューから「攻撃」-「動的スキャン...」を選択します。
「動的スキャン」ウィンドウの「スコープ」タブで「Starting point」が目的のサイトか念のため確認し、「Show advanced options」チェックボックスをオンにします。すると、「スコープ」以外のタブが表示されます。
「入力ベクトル」タブで「POST Data」にチェックを入れます。
「ポリシー」タブの「インジェクション」で「クロスサイトスクリプティング(反射型)」がThreshold、Strengthともに「規定」になっていることを確認し「スキャンを開始」ボタンを押下します。
スキャンが完了すると、XSSが検出されます。
上記の手順は、テストサイトのPOSTにターゲットを絞ったものでしたが、サイトツリーの「http://localhost」を右クリックして動的スキャンを行うと、ZAPに記録されたlocalhost下の履歴全体に対する動的スキャンが行われ、同様にXSSが検出されます。
(厳密にはサイト全体への動的スキャンは「スコープ」タブで「再帰的」のチェックが入っている必要がありますが、サイトツリーで一番上のノードを選択して「動的スキャン」を選択した場合はデフォルトでチェックが入っています)
ここまでの手順が成功すれば、診断用のテストサイトを構築して、OWASP ZAPの動的スキャンでXSSが検出できたことになります。
SQLインジェクションなど、他の脆弱性を検出したい場合は、その脆弱性のあるテストサイトを作成し、同様の手順で動的スキャンを実施してみてください。
※OWASP ZAPの「クイックスタート」でのスキャンについて
上記手順はブラウザのプロキシを設定するなど、やや手間のかかる手順でした。
OWASP ZAPを起動すると、起動して表示される最初の画面に「クイックスタート」というタブが表示されていて、そこにお手軽に一発でサイトをスキャンできそうな入力欄があります。
なぜこれを使わないのか、と疑問に感じる方もおられるかもしれません。
手順3までの構築が終わり、XAMPP上にあるテストサイトで手動ではXSSが発動できるのに、テストサイトのURLをOWASP ZAPの「クイックスタート」のところにある「攻撃対象URL」欄に入力して「攻撃」を行っても、XSSが検出されません。
OWASP ZAP「クイックスタート」による検査は、対象として入力したURLを起点に「スパイダー」(クローリング)を実施し、その後で「動的スキャン」を実施する機能で、今回のテストサイトのXSSは検出されていいはずなのですが、何でこれが検出されないんだろうと思って調べたところ、「スパイダー」の記録ではちゃんとテストサイトへのPOST(XSS発火点)までクローリングしているのに、なぜか、「動的スキャン」のほうではGETしか見ておらず、検出されないという挙動であることが分かりました。
ZAPの「ツール」-「オプション」-「動的スキャンの入力ベクトル」設定ではちゃんとPOSTまで見る設定になっているのに、GETしか見てないのはおかしいので、またバグなのでは……? という感じなのですが、ちょっと「クイックスタート」でのスキャンは、私自身が今まであまり利用したことがないので、設定が足りていない等あるのかもしれません。(「クイックスタート」でのスキャンはZAPの標準モードでないと実施できないので、誤爆事故が起こりうる設定での全自動検査というのが危険と感じるためあまり利用していません)
ただ、とりあえずインストール直後のZAPのデフォルト設定で気軽に「クイックスタート」でスキャンしてみたところ、検出されるべき単純なXSSが検出できなかったという事象が今回発生したので、サイトへの動的スキャンをかけたい場合には、「クイックスタート」ではなく、本稿で説明したような「ブラウザにプロキシ設定を行って、そのブラウザでサイトを見て回り、ZAPに記録された履歴に対しての動的スキャン」という手順のほうが確実とは言えそうです。
(解説に含めませんでしたが、ブラウザでサイトを見て回った後、ZAPの「スパイダー」機能を使ってクローリングを補強しても良いと思います)
「クイックスタート」での不検出問題については、後日時間があったら調べてバグだったらまたGithubに報告を挙げておきます。
※本稿のOWASP ZAPでの動的スキャンの手順は、「脆弱性診断ええんやで」講師松本さんから教えてもらった内容をベースにしています。
https://security-testing.doorkeeper.jp/