テストをしてみよう（セキュリティーテスト）

この記事は、「[架空プロジェクトを通してシステム開発とドキュメント作成を体験してみる（2022 Late）](https://qiita.com/minimumskills/items/aedf6a93658db3f74747)」の記事の一部です。

# 概要

Webシステムは外部に公開されることが多いため、公開前にセキュリティーテストを実施することが一般的です。
ここでは代表的なフリーセキュリティーチェックツールであるOWASP ZAPを使って、公開したwebサイトのフォームとAPIの脆弱性テストを行ってみます。

>なお、実施する内容は「セキュリティーテスト」の実務を体験してもらうことを重視するので、細かな設定や対応はしません。
>OWASP ZAPに限らず、セキュリティーチェックツールはSPAやCSR系のWebの診断は苦手です（細かくいろいろ手動でやる必要がある）。

# 今回の診断手順

今回の診断手順は以下の作業となります。
- インストール
- 起動（初期設定）
- 手動探索
    - 自動でスキャンする方法などありますが、今回は手動探索で診断するページを探索します。
- コンテキストの設定
    - コンテキストを設定することで、診断対象のURLをまとめることができます（今回はwebサイトとapiをまとめます）。
- 動的スキャン
    - 設定したコンテキストに対し攻撃を仕掛け脆弱性をテストします。
- レポート
    - テスト結果のレポートを出力します。


# OWASP ZAPのインストール

https://www.zaproxy.org/

:::note warn 
Windows環境など、Javaのインストールが必要になる場合があります。その場合はJavaのインストールを実行してください。
[Javaダウンロード](https://www.oracle.com/java/technologies/downloads/#jdk19-windows)
:::

公式サイトにアクセスし「Download」をクリックします。
環境に合わせてインストーラをダウンロードしてインストールを実行し完了させます。
![000001.jpg](https://drive.google.com/uc?export=view&id=1DGZJWJ2TYhtLd_iftjr-Hlv13OzK4vsQ)

自分の環境にあったものをダウンロード。

![000010.jpg](https://drive.google.com/uc?export=view&id=1BJLQc58ue8JxcyX0ILImPAXE0t9kuLTD)






# OWASP ZAPの起動（初期設定）

OWASP ZAPを起動します。
セッション保存方法を設定するダイアログがでるので「継続的に保存せず、必要に応じてセッションを保存」を選択し、「開始」をクリックします。

![000020.jpg](https://drive.google.com/uc?export=view&id=1rKgb1atxGACQFUN3DwKJmjMHtrIurgqp)

>アドオンのアップデートを聞かれたら全て更新でアップデートしておきましょう。

左上にあるモード選択で「プロテクトモード」を選択します。
> プロテクトモードに設定すると、指定した範囲以外のURLに対するスキャンをブロックし、他サイトへの誤った攻撃を防止します。
![000030.jpg](https://drive.google.com/uc?export=view&id=1Q3xYGeBLHG8qK4sEm5sO1BeXCEPnLHcT)


アドオンは「アドオンの管理」からも随時アップデート可能です（必要に応じて実行してください）。

![000040.jpg](https://drive.google.com/uc?export=view&id=1uRy-4NTYE1fIkuJMZ8HxNzPVbQyCkPyq)


# 手動探索（テスト対象の設定）

「クイックスタート」タブの「Manual Explore」をクリックします。
![000050.jpg](https://drive.google.com/uc?export=view&id=1Ydy7yrBGNUNlTqdLRnXIeAGLXhe9Bl4u)

各項目入力したら、Explore your applicationの「ブラウザ起動」をクリックします。

- URL to explore
＜テスト対象のWebアプリケーションのURL＞
- Enable HUD
チェックOFF
- Explore your application（ブラウザ）
＜インストールされている任意のブラウザを選択＞

![000060.jpg](https://drive.google.com/uc?export=view&id=1L1UBnx5CXWNurCSMew0hWna5tVgspXSI)


起動したブラウザで問合わせの操作を行います。
一連の操作ができたらブラウザを閉じます。（以下一連の動作）
- Contactページに移動
- フォーム入力
- 送信ボタンクリック
- アラート確認

# コンテキスト設定

コンテキストの設定をします。

>コンテキストとはOWASP ZAP用語で、対象となるURL（や設定のセット）のことです。

今回のwebサイトはJavaScriptからAPIを呼び出している仕組みを採用しているのでwebsite側とAPI側の両方のコンテキストの設定を行う必要があります（ZAPが標準だとJavaScriptを解釈・実行できないため）。

## website側

「サイト」ツリーを展開すると、先ほどの手動探索でアクセスしたURLが記録されています。
テストのURLを右クリックで、「コンテキストに含める」＞「既定コンテキスト」をクリックします。

![000070.jpg](https://drive.google.com/uc?export=view&id=1J_7ZE3NBmCZ2xBf_h_gBL_0T4NudGLc9)

テスト対象のURLが正規表現でコンテキストに含まれていることを確認したら、「OK」をクリックします。

![000080.jpg](https://drive.google.com/uc?export=view&id=1PpYE76taSpDreEcs4HB-iSttEmCl6L6x)

## API側
先程と同じ手順で、APIもコンテキストに含めます。

::: note info
基本的には既定コンテキストに含めてしまえばいいのですが、本コース上、website側のアラートとAPI側のアラートと表示を分けて見やすくしたいので今回は「新規コンテキスト」を選択しています。
:::

APIのURLをたどって設定します。「https://script.google.com 」＞「macros」＞「s」＞「xxxxxxxxxxx」を右クリックで、「コンテキストに含める」＞「新規コンテキスト」をクリックします。

![000090.jpg](https://drive.google.com/uc?export=view&id=1J4sHreaEM6ivG13YUwTzxygdONXFy2mM)

「1.既定のコンテキスト」の下に「2.xxxxxx」と表示されているのでクリックしてコンテキスト名をわかりやすく変更します。
新規で作るコンテキストにテスト対象のURLが正規表現でコンテキストに含まれていることを確認したら、「OK」をクリックします。

![000100.jpg](https://drive.google.com/uc?export=view&id=1fdxKePCUPS1ZJscsnlvm3e8mndVN9iIq)

コンテキストに２つ表示されているのがわかります。

![000110.jpg](https://drive.google.com/uc?export=view&id=17tHFfGHf6X36wZ2nAvcB-R4o0Y0loZ6k)

サイトに表示されている、webとapi以外のその他テスト対象外のものは選択して右クリックで削除をします。

![000120.jpg](https://drive.google.com/uc?export=view&id=1MfVDN4logZmAmfqFGWogOl4EQ384mHZA)


# 動的スキャン

## website側

サイトURLを選択して右クリックで「攻撃」＞「動的スキャン」をクリックします。
![000130.jpg](https://drive.google.com/uc?export=view&id=12ujNZcZ_0ATviDeBwLpgsj5QItD4FidH)

「スキャンを開始」をクリックします。
![000140.jpg](https://drive.google.com/uc?export=view&id=1pOaNmQmdZjXcyevtoiJIbk-ylu-SxDE6)

スキャンを開始し　進行状況が確認できます。100%になっていればスキャンが終了しています。
![000150.jpg](https://drive.google.com/uc?export=view&id=1VRRLBW2XPpwM7QL1-Z5DFdna6vkCVV-w)

### アラート確認

アラートタブをクリックして確認します。
「Show only URLs in scope」をクリックして赤になっていることを確認します。
すると、スコープ内のURLに対してのアラートのみが表示されます。

![000160.jpg](https://drive.google.com/uc?export=view&id=12azbN5pnxo0VgMzQ49LB1-tPiU5vS28g)

ですが現在、このスコープにはAPIも含まれているのでAPIコンテキストをスコープから一旦削除してみます。

![000170.jpg](https://drive.google.com/uc?export=view&id=1MHMpGSu-84gOCufGOP2W-GDIjmzDdZSP)

website側のアラートのみになりました。
それぞれのアラートをクリックすると、右側に説明が記述されています。

![000180.jpg](https://drive.google.com/uc?export=view&id=1MpKj4_p8pee9mYGwVntaY4hmZwjyW1W3)

## API側

同様に、APIのURLでも「攻撃」＞「動的スキャン」をクリックし、「スキャンを開始」をクリックして実行します。

### アラート確認

終了後、アラートを確認すると、脆弱性を確認できます。
今のままでは、スコープに既定コンテキストのみ入っているのでアラートはwebsite側の情報しか表示されていません。
APIコンテキストをスコープに追加して、

![000190.jpg](https://drive.google.com/uc?export=view&id=1V_6go_DUY2jJ1oMvMzb5Wj-m1hLk47uq)

既定コンテキストをスコープから削除します。

![000200.jpg](https://drive.google.com/uc?export=view&id=1x3RgRjkp9gB6DJBxUEeCEooptV9io_Ox)

この状態になります。

![000210.jpg](https://drive.google.com/uc?export=view&id=1nGV4nvXq9Dbw8mZuzO2xqsexYXkfJDb-)

アラートを確認すると、API側に対するアラートのみが表示され見やすくなりました。
![000220.jpg](https://drive.google.com/uc?export=view&id=1V2XR6YxSngVhSucowPoszv14kxQ-L7GK)

また、APIのテストを行うと、スプレッドシートには攻撃によって送られたデータが大量に入っていることが確認できます。

![000230.jpg](https://drive.google.com/uc?export=view&id=1XvTggdzBWpkpntsg8s7EhIZA7xZa9v8x)


# レポート作成

レポートを作成していきます。
「レポート」＞「Generate Report」をクリックしてレポートを作成できます。

<img width="400" alt="000240.jpg" src="https://drive.google.com/uc?export=view&id=1CCcIzSGatJvnUQQKbFo5SgrqCnddPcHn">

「スコープ」を確認して、website/api側両方入っていることを確認します。
![000250.jpg](https://drive.google.com/uc?export=view&id=110fAxI55rfo0x0lfeklEk5SX4MtM-1wU)



レポートの形式は「template」から選択できます。

![000260.jpg](https://drive.google.com/uc?export=view&id=1fLtlxsev_yQwFuVFvvkiwA-EGEqNDb2C)

テンプレートを選択したら「Generate Report」をクリックしてレポートを生成します。
Traditional HTML Reportを選択した場合、このようなレポートが出力されます。

>検出されるエラーはバージョンによって変わってきますので常に最新にするようにします。
![000270.jpg](https://drive.google.com/uc?export=view&id=1d4YAz_Hy_wRr7EAGvdFNzwnJepy_rYNG)


# アラートの内容について
リスクレベル「高」と診断されたものはありませんでした。
リスクレベル 「中」や「低」「インフォメーション」に関しては場合に応じで内容を精査し対応していくことが必要です。

>本来ならば中や低についても可能な限り対応するのですが、今回はGoogle環境やDrive To Web環境の設定に起因し、こちらでは設定できないものがほとんどのため対応はしません。通常はWebサーバなどの設定を変更・修正してなるべくリスク要素を減らします。

# まとめ

* Webの場合はセキュリティーテストをする場合が多い
* セキュリティーテストはツールを使って行うことが多い（外部に委託する場合も多い）
* サーバレス環境では検出されたリスクに対応できない場合もある
  * それが脅威ではないことを理解・提示する必要がある
* 今回のテストでは網羅できてない部分がある。どこか？

# ドキュメント作成視点での考察

* セキュリティテスト実施の有無、方法等をどこにどう記述するのか？

# 関連コンテンツ

* 次：[監視をしてみよう（運用）](https://qiita.com/minimumskills/items/f7cd01d7f4adf37d97a7)
* 前：[テストをしてみよう（性能テスト）](https://qiita.com/minimumskills/items/f5bab03b081740c0b369)