OWASP ZAP2.9.0で脆弱性診断をする - 認証機能の設定

この記事について、マニュアルのAuthenticationページを参考にしています。このページを見てわからないことがあれば、マニュアルを参照してください。

公式サイト：https://www.zaproxy.org/
OWASP ZAP Desktop User Guide：https://www.zaproxy.org/docs/desktop/
Authentication：https://www.zaproxy.org/docs/desktop/start/features/authentication/

# Getting Started
ZAPの簡単な使い方は、公式ドキュメントの[Getting Started](https://www.zaproxy.org/getting-started/)を参考にしてください。また、私なりにまとめた[OWASP ZAP2.9.0で脆弱性診断をする - Getting Started](https://qiita.com/koujimatsuda11/items/3d5b7eac5f9455015ba6)も見ていただける幸いです

# バージョン
この記事では、OWASP ZAP2.9.0のデスクトップアプリを使っています。

# ZAPの認証機能
ZAPの認証機能は、ログインが必要なページをスキャンする場合に使います。例えば、Manual Exploreでログインが必要なページを探索します。サイトタブに保存される情報は、探索時のセッションのため、一度ログアウトしたり、セッションが切れると、Active scanを実行しても元のページにスキャンができない可能性があります。

そういった場合に、認証機能を設定することで、自動で再認証をしてログイン状態でActive scanを実行できます。ZAPでは、スキャン時のレスポンスを中身を見て、認証済みかどうかを判定し、未認証の場合は、設定したユーザで認証をしてから再度リクエストを行います。

色々なタイプの認証方法が用意されているので、Webアプリケーションに合わせて使い分けましょう。

＜設定の大まかな流れ＞
1. Webアプリケーションのコンテキストを設定する（コンテキストの設定は、[Getting Startedの記事](https://qiita.com/koujimatsuda11/items/3d5b7eac5f9455015ba6)に記載しました）
2. コンテキストのセッション管理方法を設定します
3. コンテキストの認証方法を設定します
4. 認証済み判定を設定します
5. ユーザ情報を設定します

## 1. コンテキストを設定する
コンテキストを設定します。

＜設定＞
1. サイトタブのコンテキストに含めたいページで右クリック
2. コンテキストに含める -> New Context もしくは既にあるコンテキストを選択
3. 表示したダイアログでOKをクリックするとコンテキストにURLが追加されます

<img width="1436" alt="スクリーンショット 2020-04-28 0.56.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/0a544906-4d08-e5d9-5c7f-51917114172b.png">
<img width="762" alt="スクリーンショット 2020-05-10 11.19.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/b82d0cd9-47ab-a865-c32f-5d3611d08577.png">

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

<img width="508" alt="スクリーンショット 2020-04-28 1.05.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/a0fa8b10-da3e-3670-631f-16d3cb2dc139.png">

## 2. コンテキストのセッション管理方法を設定
ZAPでは、コンテキストごとのセッションの管理方法を指定します。

＜設定方法＞
1. ヘッダのセッションプロパティアイコンをクリックします
2. 設定するコンテキストのセッション管理をクリックします
3. 管理方法を選択します

<img width="1439" alt="スクリーンショット 2020-04-30 0.18.36.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/301bde0d-1622-4fc7-7c56-bdfe0e42e754.png">

### Cookie-Based Session Management
セッションIDをCookieで管理する方法の場合、これを選択します。

### HTTP Authentication Session Management
セッションがHTTPリクエストヘッダーAuthorizationで管理される場合、これを選択します。

### Script-Based Session Management
セッション管理が複雑で、上記２つではカバーできない場合に選択します。この方法は、カスタムスクリプトが必要です。なお、利用するためには、MarketplaceからScripts Console アドオンをインストールする必要があります。


## 3. コンテキストの認証方法を設定
ZAPには、複数の認証方法が用意されています。

### マニュアル認証
この方法は、Manual Exploreで認証を自身で認証を行う方法です。つまり、自動で再認証をしない方法です。Manual Exploreで探索した後、ログアウトしない、もしくはセッションがタイムアウトしない間に、Active scanを実行する場合に限り、有効な方法です。後述する設定が不要なので、簡単に実行できるというメリットがあります。

特に設定は必要ありません。

### Form-based Authentication
この方法は、フォームで認証を行う方法です。POSTもしくはGETに対応しています。WebアプリケーションがログインフォームにアンチCSRFトークンを設定している場合、ZAPは自動的に再生成します。ただし、アンチCSRFトークン名を正しく設定しておきましょう。[設定方法はこちら](https://qiita.com/koujimatsuda11/items/3209715774b73f81e85f)。

＜設定方法＞
1. サイトタグや履歴タグのリクエストを選択し右クリックします
2. Flag as Context -> 追加したいコンテキストのForm-based Auth Login Requestを選択します
3. 表示されたダイアログのConfigured Authentication Methodを設定し、OKをクリックします

<img width="1440" alt="スクリーンショット 2020-05-01 0.01.43.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/2934ddab-9f1c-74f3-2207-1e1bbe228f44.png">

Login Request POST Data(if any):にログインリクエストボディが勝手に入ります。正しいボディが入っていれば、Username ParameterとPassword Parameterのパラメータ名を選択します。実際に認証で使う値はあとで設定します。
<img width="762" alt="スクリーンショット 2020-05-01 0.05.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/82485274-a5d0-3c18-1300-7f6c826d8a02.png">


### JSON-Based Authentication
認証情報の「ユーザー名/パスワード」ペアをJSONオブジェクトで送信することにより認証が行われるWebアプリケーションで使用されます。

設定方法は、Form-based Authenticationとほぼ同じです。Login Request POST DataがJSONになります。

### HTTP/NTLM Authentication
HTTPメッセージヘッダーを使用するHTTPまたはNTLM認証を使用して認証が実行されるWebアプリケーションで使用されます。 Basic認証、Digest認証、NTLM認証の3つの認証スキームがサポートされています。なお、認証ヘッダーはすべての認証済みリクエストとともに送信されるため、再認証が可能です。

＜設定方法＞
1. ヘッダのセッションプロパティアイコンをクリックします
2. 設定するコンテキストの認証をクリックします
3. Authentication MethodでHTTP/NTLM Authenticationを選択します
4. ホスト、ポート、認証レルムを設定して、OKボタンをクリックします

<img width="431" alt="スクリーンショット 2020-05-01 0.39.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/356cdfbe-814c-61cc-f833-f5936bc9829a.png">

<img width="762" alt="スクリーンショット 2020-05-01 0.28.49.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/1d58df81-5fe9-5a75-7c47-4680c6693de3.png">


### Script-Based Authentication
認証が複雑で、他ではカバーできない場合に使用します。この方法を使用するには、最初にWebアプリケーションの必要に応じて他のアクションを実行する認証スクリプトを定義する必要があります。このスクリプトは、認証が実行されるたびに呼び出されます。再認証が可能です。設定は、セッションコンテキストダイアログを使用して行うことができ、MarketplaceからScripts Consoleアドオンをインストールする必要があります。

設定方法は割愛します

## 4. 認証済み判定を設定
ZAPでは、認証済みかどうかを判定するため、レスポンスの中身を見て判定します。Logged in indicatorに設定した文字列がレスポンス（ヘッダかボディのどちらか）に存在する場合、ログイン状態と判定します。例えば、ログアウトリンクや「ようこそ〇〇さん」といった文字列です。同様に、Logged out indicatorに設定した文字列がレスポンス（ヘッダかボディのどちらか）に存在する場合、ログアウトと状態と判定し再認証します。例えば、ログインリンクです。適切に機能させるためには、Logged in indicatorかLogged out indicatorのどちらかを設定します。どちらとも設定していない場合は、デフォルトで認証済みと判定します。

まとめると

- どちらか一方を設定する
- 両方設定がない場合は、認証済みと判定し何もしない
- Logged in indicatorに文字列を指定し、その文字列がレスポンスに含まれない場合、再認証します
- Logged out indicatorに文字列を指定し、その文字列がレスポンスに含まれる場合、再認証します

＜設定方法＞
設定方法は直接指定する方法もありますが、実際のレスポンスの文字列から設定する方法を記載します。

1. サイトタグや履歴タグのリクエストを選択します
2. レスポンスタグのヘッダかボディの中から文字列を選択します
3. 右クリックします
4. Flag as contextを選択し、コンテキスト名とLogged inもしくはoutのいずれかを選択します
5. 正規表現の形で文字列が挿入されます。OKをクリックします

<img width="1440" alt="スクリーンショット 2020-04-29 23.49.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/54c8516b-f5ca-4a6c-80fd-e01f64c04c3c.png">

<img width="762" alt="スクリーンショット 2020-04-29 23.52.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/234a896b-a127-00dc-d212-6e78927e35bb.png">

## 5. ユーザ情報を設定
認証する際のユーザを設定します。

＜設定方法＞
1. ヘッダのセッションプロパティアイコンをクリックします
2. 設定するコンテキストのユーザをクリックします
3. 追加ボタンをクリックし、ユーザ名とパスワードを入力します
4. Forced Userをクリックします
5. 自動認証で使用するユーザを選択して、OKをクリックします

<img width="762" alt="スクリーンショット 2020-05-01 0.45.26.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/65f79e32-7a67-c083-598b-81d8e5bf3d39.png">

ユーザ名は管理しやすい名前を入力します。Usernameとパスワードに実際の認証情報を入力します。
<img width="502" alt="スクリーンショット 2020-05-02 21.11.01.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/5f249c6a-0ccf-50dd-a2ee-9ecdefc5e6bb.png">

<img width="762" alt="スクリーンショット 2020-05-01 0.46.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/21aa381c-5df6-1c36-62c0-90c247ee4f5d.png">

## 6. 最後に
自動認証を有効にします。

<img width="1034" alt="スクリーンショット 2020-05-01 0.48.16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/6503ac4d-862a-ac09-7c7c-2759b113f067.png">

クリックしてONにします
<img width="1011" alt="スクリーンショット 2020-05-01 0.48.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/343282/a8ede3b3-ad01-a3c9-9afc-3cf9ca4498db.png">



# 参考
https://www.zaproxy.org/
https://www.zaproxy.org/docs/desktop/
https://www.zaproxy.org/docs/desktop/start/features/authentication/
https://www.zaproxy.org/docs/desktop/start/features/sessionmanagement/