2)実際の検査におけるZAPの設定と手順
前編の1)で「Standerd Mode」の状態で「クイックスタート」による検査を行ったが、これはあくまでもZAPの動作を確認するための手順で、実際の検査ではもう少し細かい指定をして検査を行う。
以下に実際の検査時の手順を説明する。
・ブラウザのプロキシを設定し、ブラウザで検査対象のページにアクセスする
前編の事前準備のところで解説した手順で、ZAPのプロキシ設定の調整(調整不要ならデフォルトで)と、ブラウザへのプロキシ設定を行う。
その状態で、検査対象とするサイトにアクセスすると、ZAP画面下部の「履歴」タブや左の「サイト」のところにアクセスしたサイトやURLが表示される。
・モードの変更
前編では「Standerd Mode」で検査を行ったが、実際の検査ではZAPの左上のmode設定を「Protected Mode」にして、意図しないページへの検査(攻撃)が走らないようにしながら検査を行う。
セミナーでは教わらなかったか私が聞き洩らしたか、で各モードの詳細が不明だったので調べたところ
・Safe Mode - 危険な処理が一切できないモード
・Protected Mode - スコープ内のURLにのみ危険な処理が行えるモード
・Standard Mode - 全URLに危険な処理が行えるモード
という感じのようでした。
「スコープ」というのは、コンテキストの一段上の概念で、コンテキストの設定画面で「In Scope」にチェックが入っているとそのコンテキストがスコープ内として扱われるようです。
コンテキスト設定画面の「In Scope」にはデフォルトでチェックが入っているので、本記事の手順では「コンテキストに入れていればスコープ内」になります。スコープについては他にも便利な使い方があったりするようなのですが、セミナーでは「スコープ」という概念の説明は、(多分)まだ出てきていないか省略されているため、本記事でも割愛します。
この状態で検査を行うと、各URLに何の歯止めもなく攻撃できてしまうモードになっているため、誤操作や誤設定により意図しないページにまで検査を行ってしまう可能性がある。
それを防止するため、ZAPの左上のmode設定を「Protected Mode」にすることにより、「コンテキスト」に指定したページしか検査を行わないという設定を行う。
まず、ZAP左上のモードを「Protected Mode」にすると、コンテキストメニューの「攻撃」の各メニューはほとんどが無効とされてしまい、そのままでは検査(攻撃)をおこなうことができなくなる。
検査対象サイト/ページを指定するには、「サイト」もしくは「履歴」タブ内の検査対象にしたいサイトかページを右クリックし、コンテキストメニューより「include in Context」の「1」を選択。(この「1」はコンテキストの名称で、次に出てくるコンテキストの設定画面でちゃんとした名前に変更できる)
上で「1」を選択すると下図のウィンドウが開く。
ここで、「Include in Context」の「URL regexs」に「\Q」~「\E」の形の正規表現で、指定したURLが表示される。正規表現の「\Q」は「\E」までの正規表現メタ文字をエスケープするため、URLの「.」などが余計な意味を持たない。
「Include in Context」の「URL regexs」にURLを指定すると、ZAPの「サイト」タブのその正規表現にマッチするURLを持つページだけに二重丸「◎」のようなマークが付く。
この二重丸「◎」のようなマークが付いているページはコンテキストメニューの「攻撃」が有効になり、検査対象のページとなる。
ここで、本記事の手順を手元で確認中に気付いたのですが、Protected Modeの場合、対象となるページをコンテキストに入れるだけではなく、サイトのルートもコンテキストに入れないとうまく検査が走らないという挙動があるようです。(セミナーでも、単体のページだとうまく検査が動かず、急遽ルートからの検査に切り替えていたような気がします)
例えば、Protected Modeにした後で「http://127.0.0.1/test/test.php」だけを指定してコンテキストに入れて、このページに「◎」が付いている状態で自動検査を行おうとしても、一見、右クリックメニューで「攻撃」が有効になっているように見えて、実際に「Active Scan single URL」を選択しても検査が走らず、何もせずに止まってしまいます。
モードを「Standard Mode」に戻すか、「http://127.0.0.1/」をコンテキストに入れると、右クリック-「攻撃」-「Active Scan single URL」が動作するようです。
ただ、「◎」が付いていて、コンテキストメニューでも攻撃可能になっているのに、実際には攻撃が走らない、というのは直感に反するので、この挙動が正しいのか自分の設定ミスなのか、後日確認します。
ひとまず上記手順で検査が動かない場合、「サイトのルート」もコンテキストに入れる、という手順を追加して確認してみてください。
※2014/11/8追記
この現象について、私がいろいろZAP関連で参照させていただいているYuki(@yukisov)様のブログで検証がされていました。
Yuki様の調査によるとやはりバグっぽいようで、近いうちに出るZAP 2.4では修正されるようです。ありがとうございます。
OWASP ZAP 2.3 の Protected mode で Active Scan した時の問題について
(Web Application Security Memo)
OWASP ZAPを部分的に使って、手動検査を行うことも可能で、ここではその手順を解説する。
ブレークポイント
OWASP ZAPの右ペインの上部に「→」(全リクエストにブレークポイントセット)というアイコンがあり、このボタンを押下すると、ブラウザから発行されるPOSTやGETをZAPで中継する際に一時的に差し止めて、リクエストを改変してから発行することができる。
「Standard Mode」の場合、「→」(全リクエストにブレークポイントセット)を押下しただけで全てのリクエストにブレークポイントが設定されるが、「Protected Mode」の場合、ブレークポイントが有効になるのはコンテキスト内のURLに対してのみの模様。
ブレークが入るURLの場合、POSTやGETなどで当該URLに遷移する際、ZAPが反応してリクエストを差し止めてくれる。右上ペインの「ブレーク」タブが自動的に有効になり、上にリクエストヘッダ、下にリクエストボディが表示された状態になる。パラメータやリクエストヘッダの内容を改変し、「サブミットして次のリクエストかレスポンスへ移動」「サブミットして次のブレークポイントへ移動」のどちらかのボタンを押下すると、改変したリクエストがサーバーに投げられ、レスポンスが戻ってくる。
サーバから戻ってきたレスポンスは、ZAPの右上の「レスポンス」タブで内容が見られるし、ブラウザにも表示される。
この手順でリクエストをいろいろ改変し、脆弱性を探すことができる。
Fuzzer
ブレークポイントを使ってパラメータを一つ一つ改変するのを手作業でやるのがつらい時がある。
OWASP ZAPには、ファジングを行う機能もあり、その機能を使って様々なパラメータを楽に試すことができる。(ファジングに使うパラメータリストを自前で作成することもできる。)
Fuzzerの設定を調整
「ツール」-「オプション」-「Fuzzer」で「並列スキャンスレッド数」を設定することができる。並列スレッド数を増やすと、ファジングを行うスレッドが増え、検査の進捗が早くなるが、サーバ及びクライアント側の負荷が高くなる。
また、この画面の「Add Custom fuzz File:」「ファイルを選択してください」というボタンを押下し、任意のテキストファイル(1行に1パラメータを記述したテキストファイル)を、自前のファジング用パラメータリストとしてZAPに設定することができる。
ここでFuzzerの動作を確認するため、試しに
fuzz1
fuzz2
fuzz3
上図Options画面の「Add Custom fuzz File:」「ファイルを選択してください」というボタンを押下し、「fuzztest.txt」を指定する。(このファイルをZAPが格納するディレクトリの書き込み権限がないとエラーになることがある。その場合はエラーダイアログに表示されるディレクトリを作成し書き込み権限を追加してください)
ZAPの画面下部の履歴タブからファジングを行いたいリクエストを選択し、画面上部右の「リクエスト」タブを開き、ファジングを行いたい箇所をドラッグで選択してから右クリック-「Fuzz..」を選択。
「Fuzz」という子ウィンドウが開くので、「Fuzzカテゴリー:」のプルダウンを「Custom Fuzzers」にセットし、Fuzzリストにさきほど読み込ませたファイルが出てきていたら、それを選択。
「Fuzz」ボタンを押下すると、ZAPメインウィンドウの「Fuzzer」タブがアクティブになり、読み込ませたファイルに記載したパラメータが、ドラッグした箇所に設定されて次々とリクエストされる。
後は、レスポンスを見て回って脆弱性を示すようなレスポンスがないかチェックする。
結果一覧で、「Status」がHTTPステータスコード、「RTT(ms)」がレスポンス時間、「size」がレスポンスサイズ、「Fuzz」欄にリクエストしたパラメータが表示されるので、
特定のパラメータの時だけ
・HTTPステータスがおかしい
・他のパラメータの時と比べてレスポンスに時間がかかっている
・他のパラメータの時と比べてレスポンスサイズが大きい/小さい
などの変化を一覧で表示してくれるので、大変便利である。
また、「State」に「Refrected」とあると、リクエストしたパラメータが変更なく反射されたということを表すので、XSSの判定などに便利である。
・ZAPのアップデート
ZAPの「ヘルプ」-「アップデートのチェック」で、「Manege Add-ons」というウィンドウが開き、すでにZAPにインストールされているアドオンのアップデートがある場合には「Installed」タブに「Update」という印がついているので、右のチェックボックスをクリックして「Update Selected」ボタンでアップデートすることができる。
「MarketPlace」タブのほうでアドオンを追加することもでき、ここでstatusが「Release」になっている項目は、リリースレベルであると確認されたものなので追加しても安全とされる。
Betaレベルのアドオンでもベータ版であることを分かった上で追加することもでき、たとえば「SQLMap」がBetaレベルのアドオンとしてリストにあるので、追加してみると、スキャンポリシーのインジェクションカテゴリに「Advanced SQL Injection」という設定項目が増える。
(SQLMapは強力なツールなので、利用には気をつけたほうがよいようです。私は機能追加のテストとしてのみ入れ、ポリシーの項目が増えるのを確認した後アンインストールしました。)
参考資料
Translations / OWASPドキュメント翻訳
https://www.owasp.org/index.php/Japan#Completed
OWASP ZAP マニュアル Ver.2.1.0版 がある(日本語マニュアル)
zaproxy Google Code プロジェクト
https://code.google.com/p/zaproxy/
downloadsのところにUserGuideがある
(参考)別の方のOWASP ZAP ハンズオンセミナーマニュアル
OWASP ZAPのススメ (亀田 勇歩氏)
http://sssslide.com/speakerdeck.com/ykame/owasp-zapfalsesusume
ZAPをぶん回せ(境 稔氏、亀田 勇歩氏)
http://www.slideshare.net/minorsakai/130821-owasp-zed-attack-proxy