脆弱性診断ツール OWASP ZAP vs 脆弱性だらけのWebアプリケーションEasyBuggy

脆弱性診断ツール[「OWASP ZAP」](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project)は、脆弱性だらけのWebアプリケーション[「EasyBuggy」](https://github.com/k-tamura/easybuggy/blob/master/README.jp.md)の脆弱性をどの程度検出できるでしょうか？

![VS.png](https://qiita-image-store.s3.amazonaws.com/0/43869/c1208b1b-06b3-8e00-7edd-d5fc9e171e44.png)

今回は次の基本的な機能で検証してみました。

 - 簡易スキャン：WebアプリケーションのルートのURLを入力すると、OWASP ZAPがその配下をクロールして脆弱性があるか診断する。
 - 静的スキャン：ブラウザ上でWebアプリケーションの基本的な機能を一通り手作業で動かすと、OWASP ZAPがレスポンスの内容などを検査する。
 - 動的スキャン：静的スキャンで行った操作を、OWASP ZAPがリクエストパラメータを変えるなどして再実行し、診断する。

なお、検証で行った作業内容もこのページ載せていますので、OWASP ZAPを試してみたい方は参考にしてみて下さい。

# はじめに

## OWASP ZAPとは

その前にOWASP ZAPについて簡単に説明しておきます。「OWASP ZAP (OWASP Zed Attack Proxy)」は、オープンソースのWebアプリケーション脆弱性診断ツールで、Webアプリケーションのセキュリティに関するガイドやツールを公開している[「OWASP (The Open Web Application Security Project)」](https://www.owasp.org/index.php/Main_Page)が開発しています。

## EasyBuggyとは

脆弱性やリソースリークなどを含む、バグだらけのWebアプリケーションです。現時点では、20種類の脆弱性を実装しています。詳しくは[このページ](https://t246osslab.wordpress.com/2017/03/14/easybuggy-%e3%81%ae%e3%83%88%e3%83%aa%e3%82%bb%e3%83%84/)を参照下さい。

## OWASP ZAPのインストールと初期設定

## OWASP ZAPのインストール

[このページ](https://github.com/zaproxy/zaproxy/wiki/Downloads)からインストーラをダウンロードします。インストールは、デフォルトのまま「次へ」をクリックしていけば完了します。インストールに関しては、Java 7が必要ということを除けば、特筆すべき点は無いので省略します。インストールが完了したら、起動します。Windowsの場合、ファイアウォールの警告が出るので、「アクセスを許可する」をクリックして下さい。

![WS000008.JPG](https://qiita-image-store.s3.amazonaws.com/0/43869/504f7a02-d9e9-2589-4c75-b976a2792b97.jpeg)

初回起動時は次のようなダイアログが表示されます。

![Screenshot from 2017-09-09 21-50-15.png](https://qiita-image-store.s3.amazonaws.com/0/43869/246c6f95-5055-176b-cb83-bca88ad54201.png)

どれを選んでも構いませんが、ここでは「継続的に保存せず、必要に応じてセッションを保存」を選択しました。その後、以下のようなメイン画面が表示されます。

![Screenshot from 2017-09-09 21-57-35.png](https://qiita-image-store.s3.amazonaws.com/0/43869/5454dcd8-767b-feb4-cf89-46f25d22838a.png)


## OWASP ZAPのプロキシ設定

次に、OWASP ZAP経由でEasyBuggyへリクエストが送信されるように、ローカルプロキシを設定します。

![proxysettings.png](https://qiita-image-store.s3.amazonaws.com/0/43869/18fea987-2580-d871-5a97-eb9366697eb0.png)

ツール > オプション > ローカル・プロキシ をクリックして、 ポートを8080以外(EasyBuggyと重複ないポート)に変更します。

![Screenshot from 2017-09-09 21-59-13.png](https://qiita-image-store.s3.amazonaws.com/0/43869/61b51209-4369-2cf4-630e-15a726a25a8f.png)

## ブラウザのプロキシ設定

EasyBuggyにアクセスするブラウザのプロキシ設定を変更します。Firefoxを使用している場合は、「設定」 > 「ネットワーク」 > 「接続設定」 で以下のようにプロキシ設定を変更します。

![ffproxy.png](https://qiita-image-store.s3.amazonaws.com/0/43869/9a144e10-32b6-4cf7-b35a-5d3519fc7a14.png)

## EasyBuggyの起動

脆弱性だらけのWebアプリケーションは[このページ](https://github.com/k-tamura/easybuggy/releases)からダウンロードして、次のコマンドで起動します。

```bash
java -Deasybuggy.mode=only-vulnerabilities -jar easybuggy.jar
```

<table style="width:100%"><tr><td>※EasyBuggyを起動するにはJavaが必要です。`-Deasybuggy.mode=only-vulnerabilities`を付加することで、脆弱性以外の問題を発生させるページへのリンクが表示されなくなります。EasyBuggyはOutOfMemoryErrorやJVMクラッシュを引き起こすようなリンクが多数あり、これらにOWASP ZAPのクローラーがアクセスすると、EasyBuggyが停止してしまいます。</td></tr><table>


# OWASP ZAPによる脆弱性診断

## 簡易スキャン

OWASP ZAPのショートカットをクリックして起動します。起動したら、クイックスタート画面の攻撃対象URLに[http://localhost:8080](http://localhost:8080)を入力します。

![Screenshot from 2017-09-09 22-21-17.png](https://qiita-image-store.s3.amazonaws.com/0/43869/47f759fa-2bb4-3436-1aaf-fcd5c2b4a8a2.png)

「攻撃」ボタンをクリックすると、簡易スキャンが開始されます。アプリケーションの規模によりますが、この操作には数分～数時間の時間がかかります。

![Screenshot from 2017-09-10 12-47-45.png](https://qiita-image-store.s3.amazonaws.com/0/43869/98b9b08c-a024-527c-f458-229adc249f8d.png)

簡易スキャンにより大量のリクエストが送信されます。上の画面キャプチャのURLを見て分かるように、クエリストリングなどに不正な文字列を付加して、診断しています。

![Screenshot from 2017-09-09 22-17-51.png](https://qiita-image-store.s3.amazonaws.com/0/43869/965769f8-e70f-14f2-352a-164f03e98474.png)

簡易スキャンが完了すると、結果が「アラート」のタブに表示されます。ここでは、パストラバーサル、リモートファイルインクルージョン、XSSの３種類の脆弱性が見つかりました。

## 静的スキャン

次に静的スキャンを行います。静的スキャンは、ブラウザ上でWebアプリケーションの基本的な機能を手動で一通り動かすこと(手動クロール)で行います。これにより、OWASP ZAPがレスポンスの内容などを検査してくれます。この手動クロールを行うことで、後述する動的スキャンの検査対象のURLが登録されます。

ということで、EasyBuggyのトップページ([http://localhost:8080](http://localhost:8080))にアクセスします。

![Screenshot from 2017-09-10 13-11-29.png](https://qiita-image-store.s3.amazonaws.com/0/43869/f807b851-e369-6d7a-b7b7-1925fd3065ec.png)

一番上のXSSの機能から順にリンクをクリックし、機能を実行していきます。全てが完了してからアラートタブをクリックします。静的スキャンでは、クリックジャッキングとXSSの2種類の脆弱性が見つかりました。

![Screenshot from 2017-09-10 11-34-17.png](https://qiita-image-store.s3.amazonaws.com/0/43869/4a02ba07-7c1d-0e90-164d-f3f27243911e.png)

## 動的スキャン

最後に動的スキャンをします。静的スキャンで登録された検査対象に対して、パラメータを変えたりしながらリクエストを送信します。サイトのURL([http://localhost:8080](http://localhost:8080))を右クリックして、「攻撃」 > 「動的スキャン」を選択すると、次のようなダイアログが表示され、「スキャン開始」をクリックすると動的スキャンが開始されます。

![Screenshot from 2017-09-10 11-36-16.png](https://qiita-image-store.s3.amazonaws.com/0/43869/0fe7fdbc-1983-230e-d1aa-d020f952a5fe.png)

簡易スキャンの時と同様に動的スキャンにより大量のリクエストが送信されます。

![Screenshot from 2017-09-10 12-40-33.png](https://qiita-image-store.s3.amazonaws.com/0/43869/b9e92778-722f-022e-7650-b91ce8f2b50e.png)

さらに追加でSQLインジェクションが検出できました。

![Screenshot from 2017-09-10 11-42-56.png](https://qiita-image-store.s3.amazonaws.com/0/43869/7561ad5e-d3c7-7465-1e90-bc78df2d12f8.png)

# 結果

ということで、結果は以下のようになりました。

|脆弱性|簡易スキャン|静的スキャン|動的スキャン|
--------|--------|--------|--------|
|XSS (クロスサイトスクリプティング)|○|○|○|
|SQLインジェクション|×|×|○|
|LDAPインジェクション|×|×|×|
|コードインジェクション|×|×|×|
|OSコマンドインジェクション|×|×|×|
|メールヘッダーインジェクション|×|×|×|
|Nullバイトインジェクション|×|×|×|
|サイズ制限の無いファイルアップロード|×|×|×|
|拡張子制限の無いファイルアップロード|×|×|×|
|オープンリダイレクト可能なログイン画面|×|×|×|
|ブルートフォース攻撃可能なログイン画面|×|×|×|
|セッション固定攻撃可能なログイン画面|×|×|×|
|親切過ぎる認証エラーメッセージ|×|×|×|
|危険なファイルインクルード|○|×|○|
|パストラバーサル|○|×|○|
|意図しないファイル公開|×|×|×|
|CSRF (クロスサイトリクエストフォージェリ)|×|×|×|
|クリックジャッキング|×|○|○|
|XEE (XMLエンティティ拡張)|×|×|×|
|XXE (XML外部エンティティ)|×|×|×|

脆弱性20件のうち、検出できたのは５件でした。今回は、OWASP ZAPの基本的な機能を使用した検証を行いましたが、OWASP ZAPの機能はこれだけではなく、使い方を学習すれば、さらに多くの脆弱性を検出することができます。脆弱性やOWASP ZAPの学習のために、是非EasyBuggyも使ってみて下さい。

ちなみにEasyBuggyの[Spring Bootクローン](https://github.com/k-tamura/easybuggy4sb/blob/master/README.jp.md)もあります。warファイルをダウンロードして、次のコマンドで起動できます。

```bash
java -Deasybuggy.mode=only-vulnerabilities -jar ROOT.war
```

# 参考資料

 - [OWASP ZAP GitHub](https://github.com/zaproxy/zaproxy)
 - [OWASP ZAP Home page ](https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project)
 - [OWASP ZAPで開発中にセキュリティ診断！](http://codezine.jp/article/detail/9504)
 - [OWASP ZAPではじめる2016年のウェブアプリケーションセキュリティ](http://gihyo.jp/dev/column/newyear/2016/owasp)
 - [IPA テクニカルウォッチ 「 ウェブサイトにおける脆弱性検査手法 ( ウェブアプリケーション 検査 編 ) 」](https://www.ipa.go.jp/files/000054737.pdf)