この記事について、公式ドキュメントのGetting Startedページを参考にしています。このページを見てわからないことがあれば、公式ドキュメントを参照してください。
公式サイト:https://www.zaproxy.org/
ドキュメント:https://www.zaproxy.org/docs/
Getting Started:https://www.zaproxy.org/getting-started/
OWASP Zed Attack Proxy (ZAP)とは
オープンソースのWebアプリケーション脆弱性診断ツールです。無料で使えて、世界で最も広く使われていると言われています。
基本的に、ZAPは「中間者プロキシ」です。ブラウザーとWebアプリケーションの間にあり、ブラウザーとWebアプリケーションの間で送信されるメッセージを傍受して検査し、必要に応じて内容を変更して、宛先に転送できます。
ネットワークプロキシ経由でも利用できます。
バージョン
この記事では、ZAP 2.9.0を使っています。
インストール
ZAPには、Windows、Linux、Mac OS用のインストーラーがあります。ダウンロードから利用しているOSにあったものをダウンロードしてください。
なお、Dockerイメージを入手することもできますが、この記事ではデスクトップアプリケーションに絞って記載します。
ZAPを実行するには、Java 8以降が必要です。 Mac OSインストーラーには適切なバージョンのJavaが含まれていますが、Windows、LinuxではJava 8+を個別にインストールする必要があります。
インストールはインストーラーの指示に従って、インストールしてください。
診断の大まかな流れ
- 起動する
- Automated Scanをする
- Manual Exploreで徹底的にサイトを探索する
- ContextとScopeを設定する
- Active Scanをする
起動
ZAPを起動すると、セッションの保存について聞かれます。
Persist Session dialog(継続的セッションダイアログ)
セッションとは、ZAPで行っている作業のことです。

現在のタイムスタンプでファイル名をつけてセッションを保存
これを選択すると、現在の時刻に基づいた名前でデフォルトのディレクトリにセッションを継続的に保存します。デフォルトディレクトリは、Macでは、/Users/[user]/Library/Application Support/ZAP/sessions/
です。
保存先のパストファイル名を指定してセッションを保存
これを選択すると、継続的にセッションを保存する場所を指定します。続きで作業する時は、このオプションを指定して、保存先を指定した方が管理しやすいと思います。
継続的に保存せず、必要に応じてセッションを保存
継続的に保存しない場合は、このオプションを選択します。テスト起動などの際には、これがいいでしょう。
選択を記録して、再度問い合わせない。
チェックすると次回以降、この選択は不要になります。
また、選択を変更したい場合は、オプション > データベースから変更できます。
データベースを選択して、変更します。ZAPは、一部日本語化できていないところがあります。
Modes(モード)
ZAPは、攻撃する権限があるアプリケーションをテストする場合にのみ使用してください。実際に擬似攻撃を行います。サイトの機能やデータなどに実際の損害を与える可能性があります。使用が心配な場合は、セーフモードに切り替えてください(ZAPの機能は大幅に低下します)。
- セーフモード:潜在的に危険な操作を行いません
- プロテクトモード:スコープ内のURLに対して(潜在的に)危険なアクションのみを実行します
- 標準モード:潜在的に危険な操作を含む全てを実行します
- 攻撃モード:スコープ内にある新しいノードは、発見されるとすぐにアクティブにスキャンします
とりあえず、標準モードでいいと思います。
事前設定
セッショントークン
サイトで使われるセッショントークン名がわかる場合は、オプションから予めセッショントークン名を登録しておきましょう。
- ツールバーのオプションアイコンをクリックします
- HTTPセッションを選択し、追加ボタンをクリックします
- トークン名を入力します。大文字小文字は区別しないので、大文字で入力しても小文字になります


トークン名を登録しておくことで、ZAPがセッショントークンと認識し、HTTP Sessionsなどの機能で役立ちます。
アンチCSRFトークン
サイトで使われるアンチCSRFトークンがわかる場合は、オプションから予めアンチCSRFトークン名を登録しておきましょう。
- ツールバーのオプションアイコンをクリックします
- アンチCSRFトークンを選択し、追加ボタンをクリックします
- トークン名を入力します。

アンチCSRFトークンを登録しておけば、ZAPが登録したトークンを検出した時、そのURLとトークン値を記憶し、スキャン時に設定や必要に応じてトークン値を再生成します。
Automated Scan(自動スキャン)
クイックスタートタブから簡単に始められるスキャンです。なお、ZAPは、攻撃する権限があるアプリケーションをテストする場合にのみ使用してください(念のためもう一回)。
- ZAPを起動し、ワークスペースウィンドウの[クイックスタート]タブをクリックします。
- Automated Scanボタンをクリックします。
- [URL to attack]テキストボックスに、攻撃するWebアプリケーションの完全なURLを入力します。
- [攻撃]をクリックします。


ZAPは、spiderを使用してWebアプリケーションをクロールし、検出した各ページにpassive scanをします。次に、ZAPはActive Scanを使用して、検出されたすべてのページ、機能、およびパラメーターを攻撃します。
spiderとは、WebアプリケーションからのレスポンスのHTMLを調べることによってリンクを発見して、探索していきます。しかし、javascriptで作るようなリンクは辿ることができません。AJAXアプリケーションの場合、ZAPのajax spiderの方がいいです。ajax spiderは、生成されたリンクを辿るブラウザーを呼び出してWebアプリケーションを探索します。 ajax spiderはspiderよりも低速であり環境によっては利用できないので注意が必要です。
passive scanは、レスポンスを変更することのない、安全なスキャンです。いくつかの脆弱性を見つけます。Webアプリケーションの基本的なセキュリティ状態を把握し、さらに調査が必要な場所を見つける方法としても役立ちますが、簡易的なスキャンであり、このスキャンで何も見つからなくても、安心しないでください。
Active Scanでは、既知の攻撃を使用して、他の脆弱性を見つけようとします。実際の攻撃であり、ターゲットを危険にさらす可能性があるため、テストする権限のないターゲットに対してアクティブスキャンを使用しないでください。
スキャン結果
Webアプリケーションをspiderすると、Webアプリケーションのページとそれらのページのツリーが作成されます。次に、各ページに送信された要求と応答を記録し、要求または応答に潜在的に問題がある場合はアラートを作成します。
アラート
Information Windowの[アラート]タブにアラートが表示されます。このアラートが脆弱性に関する指摘です。

アラートのリスクは次の通りに分類されます。
アラートの内容は、英語で表示されることが多いです。理解するために慣れが必要ですが、慣れれば詳細な文章を読まなくても、タイトルだけでアラートの内容が理解できるようになると思います。
アラートを生成したレスポンスを調べるには、アラートタブのURLをクリックするとWorkspace Windowsのレスポンスタブに表示されます。また、アラートの原因になった箇所が、ハイライト表示されます。
サイト
探索したWebページをサイトタブにツリー形式で表示します。

また、ページを選択し、右クリックして、[このノードのアラート]を選択すると、このページのアラートが表示されます。
Manual Explore(手動探索)
Automated scanで行うpassive scanは、Webアプリケーションの脆弱性評価を開始するためには、簡単でいいのですが、いくつかの制限があります。
- 設定していない場合、認証が必要なページはクロールしません
- クローリングの方法や攻撃の種類をあまり制御できません
spiderは、自動的にクロールするだけですので、例えば入力フォームによってページ内容や遷移するページが変わるようなアプリケーションを正しくクロールできません。より効果的にクロールするために、手動探索と組み合わせる必要があります。
抜け漏れなく脆弱性診断をするためには、ZAPをプロキシにして全てのページを探索する必要があります。なお、手動探索で見つけたページは、自動的にpassive scanされます。
クイックスタートタブのManual Exploreから始めます。
- ZAPを起動し、ワークスペースウィンドウの[クイックスタート]タブをクリックします。
- Manual Exploreボタンをクリックします。
- URL to exploreテキストボックスに、探索するWebアプリケーションの完全なURLを入力します。
- ブラウザを選択します。
- [Launch Browser]をクリックします。


すでにインストールされているブラウザを使う場合は、ZAPをプロキシにしてページを探索できるように自分で設定する必要があります。またその際には、ZAP Root CA 証明書をインストールし信頼する必要があります。詳しくはマニュアルを参考にしてください。
HUDについて、上図の[Enable HUD]にチェックを入れると下図のように、立ち上がったブラウザの両端と下部にいくつかのアイコンがオーバーレイされます。手動探索の際に、助けになるのですが、使いこなすには慣れが必要です。邪魔になるようならOFFにして使いましょう。

Manual Exploreで探索したページは、サイトにも追加されます。
ContextとScope(コンテキストとスコープ)
コンテキストとは、複数のURLをまとめたものです。認証方法、セッション管理方法、アラートの基準の変更、除外URLなどの設定をコンテキスト単位で行います。テストするWebアプリケーションごとに新しいコンテキストを定義しておきましょう。設定しておく診断の範囲を限定したり、認証を適用したりする時に便利です。
<設定>
- サイトタブのコンテキストに含めたいページで右クリック
- コンテキストに含める -> New Context もしくは既にあるコンテキストを選択
- 表示したダイアログでOKをクリックするとコンテキストにURLが追加されます


下記のアイコンから設定したコンテキストを編集できます。

Modesで説明した各モードの説明のスコープもこのスコープに当たります。
- プロテクトモード:スコープ内のURLに対して(潜在的に)危険なアクションのみを実行します
- 攻撃モード:スコープ内にある新しいノードは、発見されるとすぐにアクティブにスキャンします
<設定>
- アイコンをクリックしてセッション・プロパティを開く
- スコープに加えたいコンテキストを選択
- In Scopeをチェックしてスコープに加える
ただし、コンテキストを作成した時にデフォルトでチェックされている。


スコープは下記のアイコンをクリックすることで、アラート、履歴、サイトなどをスコープ内の物だけに限定することができます。

Active scan(動的スキャン)
Active scanは、選択したターゲットに対する既知の攻撃をしかけ、潜在的な脆弱性を見つけようとします。Passive scanのように、安全に使うことはできません。ZAPは、攻撃する権限があるアプリケーションをテストする場合にのみ使用してください(念のためもう一回)。
Active scanでは、特定の脆弱性のみ検出できます。例えば、broken access controlのようなロジックに関する脆弱性は、Active scanもPassive scanも検知できません。
Manual Exploreによって見つけた個別のページに対して改めて、Active Scanを行います。
- 診断を開始するURLをサイトタブから選択して、右クリック
- 攻撃 -> 動的スキャン
- ダイアログで設定を[スキャンを開始]をクリック


スキャンを開始すると、動的スキャンタグに結果が随時書き込まれます。

スキャンが完了もしくは途中でも、結果が随時アラートタブに追加されます。

認証機能の設定
ログインが必要なページをスキャンする際に、認証機能を使います。設定しておくと認証が必要なページで未ログインだった時に、自動的に認証をしてスキャンを続行してくれます。詳しい設定方法は、認証機能の設定に記載しましたので見ていただければ幸いです。
アンチCSRF機能
この機能を利用するとActive Scanの時にCSRFトークンを検知したら、自動再生成してくれます。ただし、通常マルチスレッドスキャンをするところを、CSRFトークンを再生成するためにシングルスレッドになります。スキャンの速度が遅くなることに注意しましょう。詳しい設定方法は、アンチCSRFトークンを設定するに記載しましたので見ていただければ幸いです。
詳しくは
ZAPの中に組み込まれているマニュアルを参考にしてください。使い方のヒントなども載っています。
クイックスタートタブのLearn Moreをクリックすると開けます。

OWASP Top 10をテストするためのコンポーネントをまとめたZAPping the OWASP Top 10と、それについて私なりにまとめたOWASP ZAP2.9.0を使ってOWASP Top 10を検証するも併せて読んでいただければ幸いです。
参考
https://www.zaproxy.org/docs/
https://www.zaproxy.org/getting-started/
https://www.pupha.net/archives/1204/