OWASP ZAP(Zed Attack Proxy)でWEBサイトの脆弱性診断をしよう
経緯
最近セキュリティの要件が非常に厳しくなっており、例えばWEBサイトに決済システムを導入したい場合、脆弱性診断ツールの使用を求められることも多いです。私も決済サービス「Stripe」を利用しようとし、非常に制約が厳しくなっているのに驚きましたが、兎に角対応しないと始まりませんので、脆弱性診断ツールを色々調べながらこのZAPにたどり着きました。
近年はクレジットカードの不正利用が多発していますが、勿論あまりにも杜撰なWEBサイトはあるにはありますが、個人的には、そもそも1/1000の確率で通る、つまりセキュリティコードなんかに頼っているクレジットカードと、それを使う側のリテラシーのなさの問題で、いくらWEBサイトを堅牢にしてもクレカの不正利用は止まらないとは思いますが、
WEBサイトを堅牢にするのは企業としては当然のことなので目をつぶりましょう。
補足
本記事はセキュリティには最低限の知識しかない筆者が、インターネット検索とChatGPTと語りながらたどり着いた内容です。誤った内容や不十分な個所を含むこともあるかと思いますが、その際は是非ご指摘ください。
また、本稿は軽く試したい方向けの記事です。そういった記事があまりありませんでしたのでこの記事を書いています。がっつり使いこなしたい方は別の記事をご参照ください。
ZAPとは
よく「OWASP ZAP」と呼ばれますが、これは「OWASP」が公開している「ZAP」というWeb脆弱性診断ツールになります。「ZAP」は「Zed Attack Proxy」の頭文字をとったものになります。
無料で使用でき、サイトを検証したり、攻撃したりして脆弱性を診断します。
使い方
環境
Windows 11
インストール
まずはソフトウェアをインストールします。こちらのページから環境にあったインストーラーをダウンロードします。今回は「Windows (64) Installer」を選択しました。
ダウンロード時に警告が出てダウンロードができないことがあります。これは攻撃ができるツールである以上仕方がないと思います。信用する場合は、強制的にダウンロードしましょう。
Chromeの場合は、ダウンロード一覧から強制的にダウンロードできます。方法がわからない方は調べてください。
ただし、私の企業アカウント(Google Workspace)のChromeからは強制ダウンロードができませんでしたので、この辺りは注意・確認してください。
インストールにはJDK等が必要な場合があります。インストールされていない場合はインストールしてください。方法は以下の記事等を参考にされるとよいかと思います。
インストーラーを実行するとZAPがインストールされます。
実行
起動すると恐らく「Welcome to ZAP」ページが開きます。
Automated Scan
「Automated Scan」は自動でサイトを攻撃して検証してくれる方法ですが、これは結構危険です。使用方法が結構複雑なうえ、下手に攻撃すると場合によっては犯罪になります。後時間がかかります。
本当に細かく検証してくれますが、場合によっては環境を壊すような可能性もあり、本番環境では実行しないほうが良いと思います。
普通のWEBサイトであれば(法律に気を付けつつ)取り合えず攻撃してみてもよいのですが、ほとんどの場合検証したいサイトはWEBアプリケーションのはずです。が、ログイン操作等を実行させるのは、様々なサポートはありますが、結構難易度が高いと思います。
今回はサクッと試したい方向けの記事なのでこちらは割愛します。
Manual Explore
こちらは実際に当該サイトを操作しながら、ZAPが自動的に検証してくれる方法です。実行するとブラウザ(ChromeかFirefox)が起動しますので、その中で自身で操作します。操作中そのページをZAPが自動で検証してくれます。こちらの方法はログイン操作等を自身で行えますので、柔軟な検証ができます。また、危険な攻撃等はこの時点では行いませんので、安全に診断できる方法になります。
合わせ技
上記「Automated Scan」「Manual Explore」を組み合わせて、「Manual Explore」で閲覧、ログインしたページに対して、自動でスキャン(攻撃)して検証することもできます。一般的なログイン方法であればそのままログイン状態を維持してスキャンできるので便利です。
方法はいくつかありますが、例えば「Manual Explore」を実行するとアクセスしたページが「サイト」に一覧で表示されますので、その対象のサイトを右クリックして「攻撃 > 動的スキャン」等を行うことでスキャンできます。
出力
スキャン結果を出力します。出力結果はHTML形式で出力されるので、ブラウザで開くと翻訳や検索ができて便利だと思います。
「レポート > レポートを生成 > [Sitesから対象のサイトを選択] > レポートを生成」で設定したフォルダに出力されます。リスクは「High」「Medium」「Low」「Information」で出力されます。少なくとも「High」には対処したほうが良いでしょう。
「The provided browser was not found」エラー
ある時「Manual Explore」を実行しようとして、急に「The provided browser was not found」が出て実行できなくなりました。再インストールしても変化なし。色々試した結果、「ツール > オプション > Selenium」から各ブラウザのパスを設定したら治りました。
お勧めはFirefoxです。Chromeは更新が多い為か、これでも上手くいかなかったり、不安定な感じがしたりします。
今回の場合、「chromem.exe」を指定しても解消できず、「chromem_proxy.exe」を指定するとエラーっぽい表示はされたものの、取り合えず実行はされました。
CSPとは
セキュリティに配慮して構築されたWebサイト、或いはモダンなフレームワークで作成されたWebサイトの場合、ほとんど「High」リスクの脆弱性が見つかることは無いと思います。
その代わり、中程度のリスクとしてContent-Security-Policy (CSP)が指摘されることが良くあります。
CSPは、ヘッダにこのサイトが取り扱う様々なリソースを記述しておいて、その他のリソースを制限するというものです。私はこの仕組みには結構懐疑的で、そもそもブラウザでヘッダを無視させればフロントなんてどうにでもできるのではないか、と思っているのですが、あと、高機能なWEBアプリの場合結局ほとんどのリソースを許可せざるを得ないので、その効果も疑わしいと思っていますが、まあ、私はセキュリティに詳しくはありませんし、そもそも、対策したという事実が大事です。
例えばフレームワークにNuxt3を使用している場合、「nuxt-security」というモジュールがあり、(ドキュメントが少々不親切ですが)比較的容易にCSP等の設定を行うことができます。恐らくReactにも同じようなものがあるでしょう、きっと、恐らく、多分。
終わりに
というわけで、ZAPを軽く使うための説明でした。
セキュリティ周りは本当に複雑でイタチごっこで、開発の難易度は年々下がる一方、セキュリティ周りは複雑になり続けていて、進化しているような退化しているような、プログラマという仕事がAIとは別のところで変容している気がしますね。
いい加減Google、Apple、Microsoftあたりで協力して、アプリケーションとはこうである、という定義を確立し、あらゆる端末で安全に動作する規格を作ってほしいものです。
根本的にWEBは脆弱過ぎるし、かといってアプリ開発は大変すぎる。
Discussion