【初心者】0から調べてOWASP ZAPを使ってみた。

0から調べてOWASP ZAPを使ってみた時の手順書を投稿します。
「OWASP ZAPとは」と調べるところから行いました。

# 本記事の環境
Windows 10
OWASP ZAP(ZAP_2_7_0_windows.exe)
Firefox 66
Java SE 12
脆弱性診断の対象サイト
※興味本位でサイトを攻撃しないようにしてください。

# OWASP ZAPとは
無料で脆弱性診断を行うことができるWebアプリケーションセキュリティスキャナ。
オワスプ ザップと読む。
https://www.zaproxy.org/

# OWASP ZAPのインストール手順
* OWASP ZAPのインストーラーをダウンロードする。  
https://github.com/zaproxy/zaproxy/wiki/Downloads  
※ZAP_2_7_0_windows.exe等

* ダウンロードしたインストーラーを実行する。
  ※「インストール4jウィザードは、システム上にJava(TM)ランタイム環境を
　　　見つけることができませんでした。適切な64-bitのJREを検索してください。
　　　(最小バージョン： X.X)」と表示された場合は、Javaをダウンロードし、
　　　インストールしてください。※ https://java.com/ja/download/

**※以後、明記されていないものは留意しなくてもよいと判断したものです。**

* インストール形式は「カスタムインストール」を選択する。

* Check for Updates(更新バージョンの有無をチェックするかどうか)の設定を変更する。※後からでも、ツール -> オプション -> アップデートのチェック で変更可能です。
  * 「Automatically download new ZAP releases」
      * 更新されたZAP本体のダウンロードを自動で開始する。※チェック推奨。
  * 「Check for updates to the add-ons you have installed」
      * インストール済みアドオンの更新状況を公式リポジトリに問い合わせます。更新されているかどうかを表示するのみ。※チェック推奨。
  * 「Automatically install updates to the add-ins you have installed」
      * 更新が確認されたインストール済みのアドオンを自動でインストールする。※チェック非推奨。  
  * 「Auromatically install updates to the scanner rules you have installed」
      * 更新が確認されたインストール済みのスキャナルールを自動でインストールする。※チェック非推奨。
  * 「Report new release quality add-ons」
      * 新しい「リリース版」のアドオンを報告します。自動インストールは行いません。※チェック推奨。
  * 「Report new beta quality add-ons」
      * 新しい「ベータ版」のアドオンを報告します。自動インストールは行いません。※チェック推奨。
  * 「Report new alpha quality add-ons」
      * 新しい「アルファ版」のアドオンを報告します。自動インストールは行いません。※チェック推奨。

※更新確認処理時に「Unable to securely access the "Check for Updates" service」と表示された発生した場合は、ツール -> オプション -> ネットワーク -> プロキシ・チェイン利用 -> 外部プロキシサーバ利用の設定 を確認してください。

# OWASP ZAPの設定手順(1)
* OWASP ZAPを起動する。

* ZAPセッションの保持方法を選択する。
  * 「継続的に保存せず、必要に応じてセッションを保存」を選択する。
  * 「選択を記録して、再度問い合わせない。」はチェック非推奨。

* アドオン管理(表示された場合)
  * 更新が必要と判断した場合は、更新を実施してください。

* 左上のモードを「標準モード」から「プロテクトモード」に変更する。
  ※「標準モード」や「攻撃モード」は、管理外のサイトへの診断を行ってしまう可能性がある。「セーフモード」は、脆弱診断が一切できないモード。
  ※「プロテクトモード」にするとクイックスタートが使用出来ない。

* ツール -> オプション -> Local Proxies でポートを"55555"※1に変更する。
  ※1：ポート競合が起きなければ何でもよい。

※「コンテキストをエクスポート」でエクスポートしたファイルがある場合は、
　OWASP ZAPの上部の「ファイル」から「コンテキストをインポート」でインポートする。
　インポートした後、以下の手順を見ながら設定がインポートされているか確認する。

* ツール -> オプション -> スパイダー で各項目を以下のように変更する。
  ※AJAXスパイダーと混同しないこと。
  * 「クロールする最大の深さ」：※1  
    ※1：サイト内のリンクをどこまで深く探しにいくかという設定。  
   　　　数値が小さいと取得出来ないページが出てくる可能性がある。
  * 「並列スキャンスレッド数」：1  
    ※いくつのスレッド数でスキャンするかという設定。  
      　PCのスペックにもよるが"1"でよいと思われる。
  * 「新しいURIのSVNのメタデータを解析」：ON
  * 「新しいURIのGitのメタデータを解析」：ON
  * 「OData固有のパラメータを処理」：ON

* ツール -> オプション -> 動的スキャン で各項目を以下のように変更する。
  * 並列スキャンするホスト数：1  
    ※サブドメインがあった場合にそのドメインも診断対象にするかという設定。  
　診断結果が混在して出力されるので"1"推奨。複数ドメインある場合はドメイン毎に診断させてください。
  * 並列スキャンスレッド数：1  
※"1"推奨。
  * スキャン中にミリ秒単位の遅延：1000  
※診断用のリクエストを投げる間隔。

* ポリシー -> スキャンポリシー で追加を選択する。スキャンポリシーが開いたら、以下を行う。
  * 「ポリシー」に任意の名前を付ける。
  * 適用の一つ目をOffにし、右にある「開始」を選択する。
  * 適用の二つ目を低にし、右にある「開始」を選択する。

* 左のメニューの「インジェクション」を選択する。インジェクションが開いたら、以下のように変更する。
　※しきい値：アラートを出すレベル。
　　※Low：NGかOKか判断できない場合もアラートを出す。
　　※High：NGの場合のみアラートを出す。
　※強度：テストの精度。Highが細かめ。
  * SQLインジェクション-しきい値：Low
  * SQLインジェクション-強度：Low
  * クロスサイト・スクリプティング(反射型)-しきい値：Low
  * クロスサイト・スクリプティング(反射型)-強度：Low

* スキャンポリシーに戻り、以下の通りであることを確認する。問題なければ「OK」を選択して閉じる。
  * インジェクションのしきい値：空欄
  * クライアント・ブラウザのしきい値：空欄
  * クライアント・ブラウザの強度：空欄

* ポリシー -> スキャンポリシー にポリシーが追加されたことを確認する。

* 「エクスポート」を選択し設定を保存する。問題なければ「閉じる」を選択して閉じる。

# Firefoxのインストールと設定
* プロキシの設定をOSの設定と切り離せるので、Firefoxを使用します。Firefoxをインストールしてください。
   https://www.mozilla.org/ja/firefox/new/

* Firefoxを起動し、右上のメニューから「オプション」を選択する。

* オプションの最下部にある「ネットワークプロキシ」の「接続設定」を選択する。接続設定が開いたら、以下のように変更する。
  * 手動でプロキシを設定する：ON
  * HTTPプロキシ：localhost
  * ポート：※先ほど設定したポート番号。
  * すべてのプロトコルでこのプロキシを使用する：ON
  * プロキシなしで接続：入力値を空にする。

* Firefoxでセキュリティチェック対象のサイトを開く。
※セキュリティの問題でエラーが表示された場合は、
　「詳細」を選択し十分に内容を確認した上で、問題なければ、
　「危険性を承知で続行」を選択してください。
　※エラー状態のままではセキュリティチェックが出来ません。

# OWASP ZAPの設定手順(2)
* OWASP ZAPの左部にセキュリティチェック対象のサイトのURL「https:...../hogehoge」(以降、「サイトのURL」と記載)が表示されていることを確認する。

* 「サイトのURL」にカーソルを合わせ右クリックし、「攻撃」を選択、詳細の各項目がグレーアウトで選択できない状態であることを確認する。

* 「サイトのURL」にカーソルを合わせ右クリックし、コンテキストに含める -> 既定コンテキスト で「セッション・プロパティ画面」を表示する。

* 「サイトのURL」.*を選択した状態でOKを選択する。

* 「サイトのURL」にカーソルを合わせ右クリックし、攻撃を選択、詳細の各項目が選択可能になったことを確認する。

* コンテキストに含める。
  * 「既定コンテキスト」をダブルクリックして「セッション・プロパティ」を表示する。
  * 「コンテキスト」の「既定コンテキスト」の「コンテキストに含める」を選択する。
  * 「追加」で「\Q「サイトのURL」\E.*」を入力する。  
※正規表現とする必要があるため、前後に「\Q」「\E」を付ける。

* コンテキストから除外する。※Basic認証が必要なページがあれば除外。
  * 「既定コンテキスト」をダブルクリックして「セッション・プロパティ」を表示する。
  * 「コンテキスト」の「既定コンテキスト」の「コンテキストから除外する」を選択する。
  * 「追加」で「\Q「Basic認証が必要なページ」\E.*」を入力する。  
※正規表現とする必要があるため、前後に「\Q」「\E」を付ける。

* 自動認証設定を行う。
  * OWASP ZAPの左部に「コンテキスト」、「既定コンテキスト」が表示されていることを確認する。
  * 「既定コンテキスト」がスコープになっている(アイコンに赤丸)ことを確認する。スコープになっていなければ、右クリックしてスコープに追加する。  
  * 「既定コンテキスト」をダブルクリックして「セッション・プロパティ」を表示する。
  * 「コンテキスト」の「既定コンテキスト」の「認証」を選択する。
  * 「Currently selected Authentication method for (以下省略)」は、  
  「Form-based Authentication」を選択する。
  * 「Login Form Target URL」は、ログインページのURL「https:..../loginhogehoge」とする。
  * 「Login Request POST Data(if any)」は、「username={%username%}&password={%password%}」とする。  
※実際のアカウント情報は別で設定します。
  * 「Regex pattern identified in Loggerd In (以下省略)」は、設定不要。
  * 「Regex pattern identified in Loggerd Out (以下省略)」は、ログインページのhtmlの<hoge>...logout...</hoge>(ログインページ特有の文言を含む一文)とする。ないようであればログインページのURL※とする。  
※正規表現とする必要があるため、前後に「\Q」「\E」を付ける。
  * 「コンテキスト」の「既定コンテキスト」の「ユーザ」を選択する。
  * 「追加」でアカウント情報を設定する。※「有効」にチェックを入れること。「ユーザ名」は任意でよい。
  * 「コンテキスト」の「既定コンテキスト」の「Forced User」を選択する。  
    ユーザが選択されていなければ選択する。
  * 「コンテキスト」の「既定コンテキスト」の「セッション管理」を選択する。  
  「Currently selected Session Management method for (以下省略)」は、
  「Cookie-based Session Management」を選択する。
  * 「セッション・プロパティ」を閉じる。
  * OWASP ZAPの上部の自動認証※1をクリックし有効にします。  
※1：南京錠のマーク。
  * OWASP ZAPの上部の「ファイル」から「コンテキストをエクスポート」を選択し設定を保存する。

# スキャン手順(スパイダー)
* スパイダーを行う。
  * 「サイトのURL」にカーソルを合わせ右クリックし、攻撃からスパイダーを選択し、「ユーザ」を選択した後、「詳細オプションを表示」にチェックを入れる。
  * 「詳細オプション」タグを選択し、「クロールする最大の深さ」が上述の値であることを確認する。
  * Firefoxでセキュリティチェック対象のサイトを開く。  
セキュリティの問題でエラーが表示された場合は、「詳細」を選択し十分に内容を確認した上で、問題なければ、「危険性を承知で続行」を選択してください。エラー状態のままではセキュリティチェックが出来ません。
  * OWASP ZAPの上部の自動認証(南京錠のマーク)をクリックし有効にします。有効になっていればそのままでよいです。
  * 「スキャンを開始」を選択する。
  * 進捗が100％になれば正常終了。  
※時間がかかります。

# 動的スキャン手順
* 動的スキャンを行う。
  * 「サイトのURL」にカーソルを合わせ右クリックし、攻撃から動的スキャンを選択し、以下のように変更する。
      * ポリシー：作成したポリシー。
      *コンテキスト：作成したコンテキスト。
      * ユーザ：作成したユーザ。
  * Firefoxでセキュリティチェック対象のサイトを開く。  
セキュリティの問題でエラーが表示された場合は、「詳細」を選択し十分に内容を確認した上で、問題なければ、「危険性を承知で続行」を選択してください。エラー状態のままではセキュリティチェックが出来ません。
  * OWASP ZAPの上部の自動認証(南京錠のマーク)をクリックし有効にします。有効になっていればそのままでよいです。
  * 「スキャンを開始」を選択する。  
※時間がかかります。※2時間かかるケース有。  
※詳細は、「Scan Progress」(OWASP ZAP下部の折れ線グラフ)で確認する。

# 結果確認手順
* OWASP ZAP下部の「アラート」タブを選択し、アラートを確認する。
※各項目を選択すると、右部に詳細が表示されます。
※旗の色で危険度が分かれています。
　※赤色：危険度高
　※黄色：危険度中
　※肌色：危険度低

* セッションの保存
  * ファイル -> 永続化セッション でセッションを保存します。開くときは、ファイル -> セッションデータファイルを開く で開くことができます。

* レポートの作成
  * レポート -> HTMLレポート 等を選択してレポートを作成します。

# アラートの例
* アラート：高(中)
  * クロスサイト・スクリプティング(XSS)  
      https://www.ipa.go.jp/about/technicalwatch/20130129.html
* アラート：中(中)
  * アプリケーションエラーの開示  
 https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/401.html

# 所感
* スキャンするまでの設定手順と、スキャンを成功させるまでの設定調整が大変だった。
* レポートの読み方、対策の仕方も調べなければいけない。大変。
* セキュリティの勉強になった。よかった。