OWASP ZAP の公式ドキュメントに、ZAP を使った診断で OWASP TOP 10 をカバーするためのガイドがあります。
本記事ではこの ZAPping the OWASP Top 10 を参考に、OWASP Top 10 のセキュリティ要件を ZAP で診断するための様々なコンポーネントを紹介します。
OWASP や ZAP の概要については他の入門用の記事や本家のドキュメントをご参照ください。
入門者の方には脆弱性診断研究会の過去資料もオススメです(私も以前そこで学びました)。
こちらの技術同人誌もオススメです。
対象となる読者
本記事の対象は以下のような悩みにぶつかった ZAP 初級〜中級者を対象としています。
- 自分が ZAP を適切に使えているか、正しいチューニングができているか迷う
- 動的スキャンを実行しても、どのレベルのセキュリティ要件が達成されたのか分からない
- マーケットプレイスに色んなアドオンがあるのは知っているが、多過ぎて深掘りできていない
ざっくりと紹介する記事なので、各コンポーネントの詳細は別途ドキュメントやアドオンの GitHub ページをご確認ください。
Fuzzer とかを掘り下げたらそれだけで一つの記事が書けるので・・・
Note
- コンポーネント名の後に *(アスタリスク)が付いているコンポーネントは ZAP にデフォルトではインストールされていません
- アドオンのコンポーネントは ZAP の [ヘルプ] > [アップデートのチェック] > [マーケットプレイス]タブから検索、ダウンロードして有効化する必要があるのでご注意ください。
- メニューの操作は macOS 版の手順なので、他のプラットフォームだと異なる箇所もあります。
- 翻訳記事ではなく、紹介記事です。情報は著者の判断で省略されたり追記されていたりするので、この記事を元に診断をするのではなく、この記事をきっかけに原文にも目を通していただけると嬉しいです。
それでは、ZAPping the OWASP Top 10 の内容とその関連するコンポーネントについて紹介していきます。
ZAPping the OWASP Top 10
この文書は、OWASP TOP 10 2017 の各リスクをテストするために推奨される自動および手動コンポーネントの概要を提供します。
OWASP TOP 10 のリスクは基本的な脆弱性の広い範囲をカバーしており、そのうちのいくつかは完全に自動化されたテストで検証することは不可能ですが、様々なコンポーネントによってそれらを検証する手段を提供しています。
Common Components
Common Components はほとんどすべての場合に使用するコンポーネント。
自動/手動 | Component |
---|---|
Manual | Man-in-the-middle proxy |
Manual | Manual request / resend |
Manual | Scripts |
Manual | Search |
Man-in-the-middle proxy
ZAP 自体は Man-in-the-middle Proxy として機能し、Web アプリに行うすべてのリクエストとレスポンスを記録、解析することができます(AJAX コールも見ることができます)。
ブレークポイントを設定して、その場でリクエストやレスポンスを変更することもできます。
※TLS 暗号化された通信も、特別な対策をされていない限りは ZAP の証明書をブラウザにインストールすることで復号できるようになります。
Manual Request
手動リクエストは、手動リクエストダイアログを使って指定したターゲットに送信されるリクエストをゼロから作成したり、既存のリクエストに変更を加えて再送信したりすることができます。
手動リクエストダイアログは、[ツール] > [手動リクエスト...]、またはサイトタブやリクエストの履歴から対象のリクエストを右クリックして[再送信]で表示します。
Script Console
Script Console アドオンを使用すると、ZAP 内部のデータ構造にアクセスできるスクリプトを実行することができるようになります。
-
スクリプトはJSR 223 をサポートするスクリプト言語をサポートしています。
-
Warning: スクリプトは ZAP と同じパーミッションで実行されるので、信頼できないスクリプトは実行しないように。
これらのスクリプトには様々なタイプがあります。
-
Stand Alone: スクリプトを手動で起動した場合にのみ実行される自己完結型のスクリプト
-
アクティブルール: アクティブスキャナの一部として実行され、個別に有効にすることができる
-
パッシブルール: パッシブスキャナの一部として実行され、個別に有効にすることができる
-
プロキシルール: これらはインラインで実行され、リクエストとレスポンスごとに変更することができ、個別に有効にすることができる。また、ブレークポイントをトリガーすることも可能
-
HTTP Sender: ZAP が送受信するすべてのリクエスト/レスポンスに対して実行するスクリプト。これには、プロキシされたメッセージ、アクティブなスキャナ、ファザーなどの間に送信されたメッセージが含まれる
-
ターゲットルール: ターゲットURLで起動され、手動で起動した場合にのみ実行されるスクリプト
-
認証: コンテキストに対して認証が実行されるときに呼び出されるスクリプト。使用するには、コンテキストのスクリプトベースの認証方法を構成する際に選択する必要がある
-
スクリプト入力ベクトル: ZAP が攻撃すべきものを正確に定義するためのスクリプト
-
エクステンダー: グラフィカルな要素や新しい API エンドポイントなど、新しい機能を追加できるスクリプト
-
自動的に実行されるすべてのスクリプトは、初期状態では「無効」になっています
- スクリプトを実行するにはスクリプトの「ツリー」タブで有効にする必要がある
-
スクリプトの実行時にエラーが発生すると、スクリプトは無効になる
-
スクリプトを選択すると、最後のエラーがスクリプト コンソール タブに表示されます。
-
対象のスクリプトは[サイト] タブまたは [履歴] タブのレコードを右クリックして、[スクリプトで起動] メニュー項目を選択することで起動できる
org.zaproxy.zap.extension.script.ScriptVars.setGlobalVar でグローバル変数を呼び出したり、 org.zaproxy.zap.extension.script.ScriptVars で異なる呼び出しでも共有できる変数を宣言することもできます。
Search
検索タブでは URL、リクエスト、レスポンス、ヘッダー、およびアドオンによって提供されるその他の機能のすべてを正規表現で検索することができます。
検索結果を右クリックしてコンテキストメニューを開き、リクエストの再送信や Active Scan などを実行できます。
A1 Injection
自動/手動 | Component |
---|---|
Automated | Active Scan Rules |
Automated | Advanced SQLInjection Scanner* (Based on SQLMap) |
Manual | FuzzDb* と SVN Digger* ファイルを組み合わせた Fuzzer |
Active Scan Rules
動的スキャンは選択されたターゲットに対して既知の攻撃を行い、潜在的な脆弱性を発見しようと試みます。
これはれっきとした攻撃なので、自分が所有していない Web アプリケーションでは使用しないようにしてください。
なお、動的スキャンでは、特定の種類の脆弱性しか発見できないことに注意が必要
認可制度の不備のような論理的な脆弱性は、動的スキャンや自動化された脆弱性スキャンでは発見されないですし、すべてのタイプの脆弱性を発見するためには、動的スキャンに加えて手動でのペネトレーションテストを実施する必要があります。
動的スキャンで実行するルールは動的スキャンポリシーで設定します。
Scan Policy
スキャンポリシーは動的スキャンの一部として実行されるルールを定義しています。
スキャンポリシーは事前に幾つでも定義しておくことができ、動的スキャンダイアログでスキャンを開始するときに最も適切なものを選択して実行します。
動的スキャンをクリックした後に表示されるダイアログの[Policy]タブで定義したポリシーを選択できます。
Advanced SQLInjection Scanner*
SQLi 検出のための高度なアクティブインジェクションバンドルを提供するアドオン。
動的スキャンのインジェクションポリシーに追加されます。
FuzzDb* と SVN Digger* ファイルを組み合わせた Fuzzer
ZAP では、特定のリクエストに対して以下のファジングを行うことができます。
- ビルドインされたペイロードのセット
- オプションのアドオンで定義されたペイロード
- カスタムスクリプト
FuzzDB* プラグインのペイロードは、File Fuzzers のタイプから選択することができます。
実行する際はコンテキストメニューの[攻撃] > [Fuzzerの開始...] か[ツール] > [Fuzzer の開始...]から実行できます。
A2 Broken Authentication
自動/手動 | Component |
---|---|
Manual | HTTP Sessions |
Manual | Spider |
Manual | Forced Browse |
Manual | Token Generator* |
Automatic | Access Control Testing* |
HTTP Sessions
このツールは特定のサイト上の既存の HTTP セッションを追跡し、Zaproxy ユーザがすべてのリクエストを特定のセッション上に強制的に置くことを可能にします。
基本的には、サイト上のユーザセッションを簡単に切り替えたり、既存のセッションを "破棄 "せずに新しいセッションを作成したりすることができます。
これは HTTP メッセージのパラメータ (今のところ Cookie のみ) であり、HTTP サーバがリクエストメッセージを以前のリクエストや保存されたデータと接続することを可能にします。Zaproxy の場合、セッショントークンはデフォルトのセッショントークンとサイトセッショントークンの二つに分類されるます。
- デフォルトのセッショントークンはユーザーがオプション画面で設定できるもので、デフォルトではどのサイトでも自動的にセッショントークンとみなされるトークン
- サイトセッショントークンは特定のサイトのためのトークンのセットで、通常は [Params] タブで利用可能なポップアップメニューを使用して設定する
このツールは定義されたセッショ トークンまたは自動的に検出されたデフォルトのセッショントークンを使用して、通信に存在する任意の HTTP セッションを自動的に検出します。
検出されたセッションは、[HTTP Sessions] タブに表示されます。
設定は [ツール] > [オプション] > [HTTP セッション]から。
※この機能使ったことないので的外れな翻訳になってそう・・・
Spider
Spider は特定のサイトの新しいリソース(URL)を自動的に発見するためのツール。
リソースを取得するためのリクエストを行い、 そのレスポンスを解析してハイパーリンクを特定します。
Spider の設定と起動は Spider ダイアログを使って行います。クッキーに関する Spider の動作は、起動方法とどのオプションが有効になっているかによって異な流ことに注意。
強力なコンポーネントだけど、React や Vue で書かれた SPA などにはあまり役に立たない印象です・・・
後述する Ajax スパイダーといったアドオンもありますが、それほど規模が大きくないアプリでは手動で画面遷移して履歴を溜めていくのが堅実だと思います。
Forced Browse
forced browsing を使用してディレクトリやファイルの検出を試みることができます。
このコンポーネントには多数のファイル名とディレクトリ名を含むファイルセットが提供されています。
設定は[ツール] > [オプション] > [強制ブラウズ]から。
Token Generator*
このアドオンでは、セッション処理や CSRF 保護に使用されるような疑似ランダムトークンを生成して解析することができます。
トークンを生成して分析するには
- 生成したいトークンを含むリクエストを見つける
- サイトタブまたは下部のタブで右クリックし、「Generate Tokens...」を選択
- 生成するトークンを選択
- 生成ボタンをクリック
- レスポンスとトークンは、「トークン生成」タブに表示されます。
- すべてのトークンが生成されると、「トークンの分析」ダイアログが表示されます。
- NOTE: メッセージがスコープ内にない場合、セーフモードでもプロテクトモードでもトークン生成は許可されません。
Access Control Testing*
今回一番「こんな機能あったんだ・・・」と思ったアドオン。
このアドオンは、ウェブアプリケーションのどの部分が一部のユーザが利用できるかを比較し、アクセス制御のテストを行います。アクセスルールの設定を可能にし、許可されていないクライアントがアクセス可能な Web アプリケーションのセクションを特定するのに役立つことを目的とした攻撃を行います。
このアドオンに関連して説明すべき2つの主な概念があ利ます。
アクセスルール
潜在的なアクセス制御の問題を特定するために、ZAP は Web アプリケーションのどの部分がどのユーザーによってアクセスされることになっているかを知る必要があるため、それを定めたアクセスルールをコンテキストに対して設定し、コンテキストの各ユーザーに対して各サイトノード(ウェブページ)に以下の関連付けを行います。
- Allowed: ルールが参照しているユーザーがリソースにアクセスできる
- Denied: ルールを参照しているユーザーはリソースにアクセスできない
- Unknown: Unknown
ZAPでは、アクセスルールの定義作業を簡素化するために、URL のツリー構造を利用しており、特定のルールが定義されていない場合は URL 内の親に基づいて各ノードのマッチングルールを検出する推論アルゴリズムが使用されます。
アクセスルールを設定する際にはサブツリー全体に対して1つのルールだけを明示的に設定する必要があり、他のノードに対してはルールが推測されることを意味します。
これについての詳細は、Context option の Help を参照してください。
テスト手順
ウェブアプリケーションのアクセス制御テストを完全に実行するためには、次のステップに従うべきです。
- テスターはユーザのセットとそれらがどのように認証するかを定義する
- テスターはZAPがどのようにして未承認のリクエストを識別するかを定義する(セッションプロパティの「認証」パネルから)
- ウェブアプリケーションを手動または Spider で探索する
- テスターはコンテキストに関連付けられた各ユーザーのアクセスルールを定義する
- 攻撃を実行する
- 対応するステータスタブには結果が表示され、どのページがどのユーザーによって正常にアクセスされたかを示し、アクセスルールが守られていないケースをマークする
Note: アクセス制御のテストは、セーフモードでもプロテクトモードでも、コンテキストがスコープ内にない場合は許可されません。
A3 Sensitive Data Exposure
自動/手動 | Component |
---|---|
Automated | Active Scan Rules |
Automated | Passive Scan Rules |
Passive Scan
ZAP はデフォルトでテスト対象の Web アプリケーションに送信されたすべての HTTP リクエストとレスポンスをパッシブにスキャンします。
- スキャンはアプリケーションの探索を遅くしないようにバックグラウンドスレッドで実行されている。
- パッシブスキャナの主な動作は [ツール] > [オプション] > [静的スキャナ]から設定
- パッシブスキャナはタグを自動的に追加したり、アラートを表示したりするためにも使用できる
- 自動タグ付けのための一連のルールがデフォルトで提供されている。[ツール] > [オプション] > [静的スキャン]から変更、削除、または追加できる
- アラートは[ツール] > [オプション] > [静的スキャンルール]から変更、削除、または追加できる
A4 XML External Entities (XXE)
自動/手動 | Component |
---|---|
Automated | Active Scan Rules |
A5 Broken Access Control
自動/手動 | Component |
---|---|
Automated | Active Scan Rules |
Automated | Passive Scan Rules |
Automatic | Access Control Testing* |
Manual | HttpsInfo* |
Manual | Port Scanner* |
Manual | Wappalyzer - Technology detection* |
HttpsInfo*
HTTPS Info アドオンは、[サイトツリー]または[履歴]テーブルのコンテキストメニューからアクセスできます。
ステータスパネルにタブが表示され、そこには、ターゲットサーバの HTTPS 証明書と、提供されている SSL/TLS 暗号スイートに関する様々なサマリー情報が表示されます。
インストールしてみたんですが、コンテキストメニューにそれらしいものは追加されませんでした・・・
タブに追加されている[HTTPS 情報]のことかな。
Port Scanner*
診断対象のサイトでどのポートが開いているかを表示するベーシックなポートスキャナ。
ポートスキャンは、[ツール] > [オプション] > [ポートスキャン]画面を使用して設定します。
Wappalyzer - Technology detection*
Technology detection アドオンは Wappalyzer ルールを使用してアプリケーションで使用されている技術を検出します。
インストールすると、[テクノロジー]というタブが追加されます。
テクノロジータブには以下の情報が表示されました。なお、選択しているのは私が個人開発している Nuxt.js のアプリです。
Hugo で作った Web サイトもホスティングサービスと共に検出されました。
基本的なフレームワークは検出してくれるようです。
- Angular とか Express は使っていないけど何を検知したのかな・・・
- この前に Localhost で開いていた OWASP Juice Shop が検知されているのか・・・?
- 他にもめちゃくちゃサードパーティー制ライブラリを使ってるけど・・・
A9 Using Components with Known Vulnerabilities を正確に検証できるかは疑問。
なお、WAPPALYZERは Chrome や Firefox のエクステンションとしても提供されています。
A6 Security Misconfiguration
自動/手動 | Component |
---|---|
Automated | Spider |
Automated | Ajax Spider |
Manual | Session comparison |
Automatic | Access Control Testing* |
Manual | HttpsInfo* |
Ajax Spider
AJAX Spider アドオンは、Crawljax という AJAX リッチサイトのクローラーを ZAP に統合します。
設定は[ツール] > [オプション] > [[AJAX スパイダー] 画面から。
- クローリングには通常の Spider よりも長い時間が掛かります
- しかし通常の Spider と違ってプログレスバーや中断などのメニューがないのが少し使い辛いです(動的なページをクロールしてくれるのだから仕方ないけど)
- 同一サイトに対して[AJAX スパイダー]のメニューが活性化していたら終了したと判断できます。
- しかし通常の Spider と違ってプログレスバーや中断などのメニューがないのが少し使い辛いです(動的なページをクロールしてくれるのだから仕方ないけど)
- Angular で実装されている OWASP Juice Shop で試してみましたが、重複を数多く含んだ膨大なリクエストが検出されるので検出結果の確認がしんどい・・・
Session comparison
これはファイルメニューの[永続化セッション...]で保存したデータを比較することができます。
これは以前に保存した ZAP セッション同士を比較する機能です。
(使ったことはないのですが)異なる権限を持ったユーザーセッションのアクセスログを比較することができます。
A7 Cross-Site Scripting (XSS)
自動/手動 | Component |
---|---|
Automated | Active Scan Rules |
Manual | Fuzzer, combined with the FuzzDb* |
Manual | Plug-n-Hack |
Plug-n-Hack
Plug-n-Hack は Mozilla セキュリティチームが提案している標準規格で、これを Firefox のアドオンにインストールすると開発者ツールバーから ZAP を操作できるようになります。
Plug-n-Hack and ZAP: manually changed proxy settings after initial pnh configuration
このアドオンは、クイックスタートタブに「Plug-n-Hack」ボタンを追加します - このボタンをクリックすると、ZAPを素早く簡単に動作させるようにブラウザを設定できます。
ですが、Mozilla でも既に "Archive of obsolete content":https://developer.mozilla.org/en-US/docs/Archive に移動されている機能なので、これを新規で使うことはなさそうです。
A8 Insecure Deserialization
自動/手動 | Component |
---|---|
Automated | There are two outstanding issues that are relevant to this Top 10 entry: Insecure deserialization active scanner & Java Serialization Handling |
リンクがどちらも Issue...
私見ですが、Insecure deserialization はブラックボックスでは検証が難しい脆弱性だと思います。
可能であれば、Deserialization Cheat Sheet を参考に WhiteBox Review を行うことを推奨します。
余談ですが、Insecure Deserialization については徳丸先生の YouTube が分かりやすいです。
A9 Using Components with Known Vulnerabilities
自動/手動 | Component |
---|---|
Automated | Passive Scan Rules and Retire |
Manual | Wappalyzer - Technology detection* and Retire |
A9 を外部から診断するのは難しいと思います(現状では Wappalyzer も全ての Third Party 製ライブラリーを検出できないはず)。
Passive Scan Rules の結果と合わせて、ホワイトボックステストと組み合わせて検証するのが良いでしょう。
A10 Insufficient Logging & Monitoring
自動/手動 | Component |
---|---|
Automated / Manual | Spider(s)、Active Scanner、Fuzzer、および Access Control addon はすべてのトラフィックを生成するために使用することができ、ログとアラートの潜在的なソース/原因である「攻撃」を生成するために使用することができます。 |
サーバーサイドで出力されるログは、(別の脆弱性がない限り)ブラックボックスで確認することはできません。
いくつかのコンポーネントで様々なログ出力パターンを試すことができますが、ログの確認自体はホワイトボックス、または完全なペネトレーションテストで行う必要があります。
後書き
一部の機能に対しては苦言を呈している箇所もありますが、これだけの機能を利用できる OWASP ZAP はやはりとても強力なツールだと思います。
ZAP だけで OWASP TOP 10 を検証することは Still Hard だと思いますが、動的スキャン以外にも様々な機能が提供されていて、それらは脆弱性診断におけるさまざまなフェーズに対応しています。手動の診断は専門的な知識やペネトレーションも必要になりますが、ZAP やその他のツールも駆使しながら、アプリケーションに潜む脆弱性を潰していきましょう。
本記事が脆弱性診断の内製化や効率化の一助になれば幸いです。