OWASP ZAP – 簡単にWeb脆弱性診断ができる診断ツール
こんにちは。ソリューション開発部の羽澤です。
現在、インターネット上に公開されるWebアプリケーションの開発をさせて頂いております。インターネット公開と言えばやはりセキュリティ対策が必須となります。
今回のプロジェクトでは、我々アプリケーション開発チームとは別に、セキュリティテストを行うチームが組まれることとなりました。ですので、セキュリティテストの計画立案~テスト実施まで、そのチームがおこないます。ここで問題が発見された場合、我々アプリケーション開発チームが対応するという体制です。
我々アプリケーション開発チームは、セキュリティテストチームからの挙がる指摘を極力少なくしなければなりません。これを出来る限り少ない工数で行うのが、今回の目的となります。
対応すべきWebサイトのセキュリティ脆弱性とは
今更ではありますが、代表的な脆弱性を明確にしておきます。情報処理推進機構から、代表的なWebサイトのセキュリティ脆弱性が公開されていますので引用します。2016年1月時点の情報です。新しいとは言えませんが、指針にするには十分な鮮度かと思います。代表的な11種類の脆弱性が上げられております。我々も、普段からこの指針をベースにセキュリティ脆弱性診断を実施しています。
1) SQL インジェクション
2) OS コマンド・インジェクション
3) パス名パラメータの未チェック/ディレクトリ・トラバーサル
4) セッション管理の不備
5) クロスサイト・スクリプティング
6) CSRF(クロスサイト・リクエスト・フォージェリ)
7) HTTP ヘッダ・インジェクション
8) メールヘッダ・インジェクション
9) クリックジャッキング
10)バッファオーバーフロー
11)アクセス制御や認可制御の欠落
どうやってWebサイトのセキュリティ脆弱性診断を行うか
ターゲットが明確になりましたが、Webサイトのセキュリティ脆弱性診断を手動で行うのは簡単ではありません。SQLインジェクション程度であれば可能かもしれませんが、手間がかかるのは確かです。となると、何かツールが欲しくなります。
Webサイトのセキュリティ脆弱性診断と言えば・・・ そうです。OWASP ZAPですね。今回Webセキュリティ診断を行なうにあたり、新進気鋭のツールが出ていないか調査してみましたが、特に目ぼしいツールは見つかりませんでした。というわけで、いつも通りOWASP ZAPを利用します。
ZAPで出来ること、出来ないこと
ZAPといえば、「代表的なセキュリティ脆弱性の診断は大体やってくれるという」と認識されている方が多いのではないでしょうか。ここで、出来ること・出来ないことを明確にしておきます。前述した代表的な脆弱性と、ZAPの診断内容とつき合わせてみます。
まずは一旦アプリケーションを動かしてみます。メニューの中から、ポリシー > 追加 と進みデフォルトのポリシーを確認します。ターゲットとなる脆弱性のうち、ZAPで確認できないのは以下の5つとなります。
4) セッション管理の不備
7) HTTP ヘッダ・インジェクション
8) メールヘッダ・インジェクション
9) クリックジャッキング
11)アクセス制御や認可制御の欠落
今回のシステムの特性を考えると、本来であれば「4) セッション管理の不備」及び「 7) HTTP ヘッダ・インジェクション」は確認しておきたいところでした。しかしながら、ZAPを使うことに価値があるのは間違いありませんね。
どう運用するか
一番お手軽なのはクイックスタートです。クイックスタートは、基本的な検証を自動で行ってくれる、大変お手軽で便利な機能です。しかし、安易に利用するととても危険なものでもあります。
起動直後、右ペインからクイックスタートが可能です。クイックスタートに、WebサイトのURLを指定してスキャンを開始すると、対象のWebサイトのリンクを全て辿って対象を洗い出し、それら全てに動的スキャン(脆弱性の検証)を行います。大変便利ではありますが、外部リンクなどが貼られていると辿ってしまい、意図しないWebサイトに攻撃してしまう可能性がありますので注意してください。
これを防ぐため、以下の手順を実施することをお勧めします。
プロテクトモードに変更する
まずはプロテクトモードに変更します。起動直後は標準モードが指定されております。標準モードではクイックスタートが利用できますが、プロテクトモードに変更すると、クイックスタートは利用不可となります。
ZAPのProxy機能を経由し、Webサイト(Webシステム)にアクセスする
ブラウザでProxy設定を行い、ZAPのProxy機能を経由するよう設定します。今回私が検証したいのはWebアプリケーションであるため、8080ポートで動作しています。ZAPのProxy機能も8080ポートで動作するため被ってしまっていましたので、ZAP側のポートを変更します。今回は7777にしてみました。
ブラウザのProxy設定を、localhostの7777ポートに変更し、Webシステムへのアクセスを行います。今回はhttp://localhost:8080/index.htmlです。
履歴を元に、コンテキストに登録する
アクセスすると、履歴タブにURLが記録されますので、右クリック>Include in Context>New Context を選択します。これで、左ペインのサイトタブに登録されます。
登録したWebサイト(Webシステム)を検証する
コンテキストに登録すると、その下のサイトに表示されるようになります。脆弱性の検証を行いたいページを選択し、右クリック>攻撃>動的スキャン を選択します。これで検証が可能です。
たったこれだけの手順でWebサイトのセキュリティ脆弱性の検証が可能です。弱点としては、少々時間がかかることでしょうか。テストコードのように気軽にぽちっと出来ないのが残念なところです。基本、1日1回かけるという運用をしております。
おまけ
運用は1日1回と書きました。しかしながら、毎日手動で行うのは手間となります。それを解決するための選択肢として、Jenkinsのプラグインがあります。今回のプロジェクトでは、まだJenkinsのプラグインを動かす環境を作っていないので、環境が整い次第導入する予定です。
まとめ
如何でしょうか、Webサイトのセキュリティ脆弱性診断はそれ程難しいものではないと考えています。ZAPを使ったことが無い方は、一度使ってみることをお勧めします。