皆さん、こんにちは。セキュリティチェックしてますか?
今、世の中では多くの分野で、WEBアプリケーションが利用されており、その中には、個人情報や重要な情報を扱っているものも多くあります。そのため、WEBアプリケーションが攻撃対象となることも少なくありません。したがって、開発者はセキュリティ対策に気を配る必要があります。その際、脆弱性を発見する手がかりとして、自動セキュリティチェックツールが非常に有用になるでしょう。
今回、取り扱うのはskipfishというWEBアプリケーション用セキュリティ調査ツールです。skipfishはGoogleによって開発されたオープンソースソフトで、Apache License 2.0で公開されています。GCEやGAE等で作成したアプリについても当然、Googleのノウハウが入ったツールを利用して脆弱性チェックを行うことが可能です。skipfishの特徴は、再帰的なクローリングだけでなく、辞書ファイルや、学習したキーワードを使って、様々なリクエストを生成するところです(下図を参照)。
本記事ではskipfishについて、以下のような構成でご紹介します。
- インストール
- 実行
- 結果
- Tips
- まとめ
なお、 skipfishは動作環境として、Linux, FreeBSD, MacOS X, and Windows (Cygwin)をサポートしていますが、 本記事を書くにあたっては、LinuxのUbuntu 13.10上で動作の検証を行いました。
目次
インストール
インストール方法はソースコードをダウンロードし、makeコマンドでコンパイルするというLinuxではよく見られる方法です。バイナリでのプログラムの配布は行われていません。この章では、ソースコードを入手し、コンパイルする方法について説明します。
コンパイルの前に
ソースコードをダウンロードする前に、コンパイルに必要なものを確認しましょう。KnownIssuesのProblem #1に必要なコンパイラやライブラリが列挙されています。ここに挙げられているものはすべて、APTでインストール可能です。筆者が最初にコンパイルを試みたときは、zlib以外は使用環境にインストールされていなかったので、以下のコマンドでインストールしました。
$ sudo apt-get install \
build-essential \
libssl-dev \
libpcre3-dev \
libidn11-dev
コンパイル
ソースコードはhttps://code.google.com/p/skipfish/からダウンロードできます。まずは、skipfish-2.10b.tgzをクリックして、ソースコードをダウンロードしてください。ダウンロードが完了したら、ターミナルを立ち上げて、ダウンロードしたファイルを保存したディレクトリに移動し、ファイルを展開します。
$ cd <skipfish-2.10b.tgzを保存したディレクトリ>
$ tar xvzf skipfish-2.10b
展開されたディレクトリ、skipfish-2.10bの中に移動し、makeコマンドを実行します。
$ cd skipfish-2.10b
$ make
makeコマンドが正常に終了すると、skipfishという名前の実行ファイルが生成されているはずです。また、以下のコマンドでskipfishのヘルプを表示することができます。
$ ./skipfish -h
これでヘルプが表示されれば、正常にコンパイルできたと考えてよいでしょう。さて、次はいよいよ実行です。
実行
実行する前の注意事項
セキュリティ調査ツールは、その性質上、実際にサイトに対して攻撃を仕掛けるので、実行する際は、以下の注意事項を守るようにしてください。
- 自分のサイトや、テストを許可されているサイト以外に対しては、実行しないでください。
- 悪意ある攻撃をしないよう作られているはずですが、必ずしも、対象のサイトの正常な運用を害さないとは限らないので、注意してください。
実行コマンド
さて、skipfishでは、再帰的なクローリングによって、アクセス可能なURLを抽出するだけでなく、指定した辞書ファイルに含まれるキーワードや、クローリングしたデータから学習した単語を組み合わせて、brute-force方式でURLを生成して、サイトのスキャンを行うことができます。辞書ファイルはdictionariesディレクトリに、あらかじめ以下のものが用意されています。
- complete.wl
- medium.wl
- minimal.wl
- extensions-only.wl
まず、最も簡易なスキャンを行うコマンドを示します。
$ ./skipfish -L -W /dev/null \
-o <出力ディレクトリ> <クロールを開始するURL>
上述の例では、そのような単語を組み合わせて、brute-forceでスキャンを行わないようオプションしています。
-L : クロールしたデータから単語を学習しない
-W: 読み込み用+学習したデータを追記する辞書ファイル
次に、辞書ファイルを指定して、軽めのbrute-forceスキャンを行うコマンドの例を示します。
$ touch new_dict.wl
$ ./skipfish -W new_dict.wl \
-S dictionaries/minimal.wl \
-o <出力ディレクトリ> <クロールを開始するURL>
この例では、書き込み用に空のファイルnew_dict.wlを初めに作成して、-Sオプションで読み込み専用の辞書ファイルを指定しています。
では、実際にコマンドを入力して、実行してみましょう。
コマンドを実行すると、ターミナルに以下のような表示がされます。
この状態で、なにかキーを押すか、60秒放置すると、スキャンが開始され、以下のような経過のレポートが表示されます。フロントエンドで実行され、実行中はレポートが随時更新されるので、ターミナルを閉じず、そのままにしておいてください。
実行が終了すると、以下のようなメッセージが表示され、プロンプトが返ってきます。スキャン対象のサイトのコンテンツが多いと、1日放置しても終了しないということもあり得るので、注意してください。なお、実行中に、Ctrl + Cで強制終了すると、スキャンが終了した分だけの結果を出力して終了します。
結果
結果の見方
スキャンが終了すると、指定した出力フォルダに、結果が出力されます。その中のindex.htmlをウェブブラウザで開くことで結果を見ることができます。以下はindex.htmlを開いた時の画面です。
結果の見方については、詳しいドキュメントは存在しない(専門家が見れば、意味がわかるように書かれているからだそうです)のですが、ここでは、実際の結果にもとづいて、見方を説明します。
結果は“Crawl results”、”Document type overview”、”Issue type overview”の3つの大項目に別れており、それぞれの項目の内容は、以下の表のようになっています。
Crawl results | リスクの度合いごとに、検出された問題の件数を表示。また、サイトマップに沿って、各URLで検出された問題を閲覧可能。 |
Document type overview | リクエストURLに対して、どのようなタイプのコンテンツが返されたかを表示。 |
Issue type overview | 検出された問題を、種類ごとに、リスクの高い順に表示。 |
実際に利用する際には、リスクの高いものを優先してチェックしたいと思うので、ここでは、”Issue type overview”について、もう少し説明したいと思います。
”Issue type overview”内の各項目をクリックすると、どのURLにアクセスした時に、その問題を検出したかとその問題に関するメモの表示が開かれます。以下はいくつかの項目を開いた時のスクリーンショットです。
この例では、1つ目の問題として、Query injection vectorが検出されており、Memoには、あるパラメータに”9-8”を指定して、アクセスした際に、サーバサイドで算術演算されたことを示唆する結果が返ってきた旨が記されてています。さらに、[show trace +]をクリックすると、具体的なリクエストとレスポンスを表示するウインドウが開きます。必要であれば、これを見て、検出された問題について、さらに詳しく分析することができるでしょう。
結果に関する注意事項
skipfishを使うと、WEBアプリケーションの網羅的なセキュリティチェックを、手軽に行えますし、結果も見やすく出力してくれるので、非常に便利なのですが、結果をそのまま鵜呑みにしないよう注意してください。脆弱性を見逃す場合や、逆に、誤検出をする可能性もあります。結果を参考にして、ソースコードをチェックするなどして、きちんと判断を行ってください。
Tips
skipfishには、様々なオプションが用意されており、それにより、実行時の挙動を制御することができます。すでにご紹介した辞書ファイルの指定以外で、使用頻度の高そうなものをいくつかご紹介します。
実行中にメモリ不足で落ちる場合
skipfishは、デフォルトでは、クローリングしたデータをすべてメモリ上に持つため、コンテンツの多いサイトに対して実行すると、メモリが枯渇してしまうことがあります。2.10bから–flush-to-diskというオプションが追加され、データをdiskにflushすることができるようになりました。このオプションを指定することで、メモリ不足で実行中にskipfishが落ちるのを回避することが可能です。
認証が必要なサイトへの対応
skipfishには、いくつかの認証方法で、認証をクリアして、スキャンを行うためのオプションが用意されています。
①Basic認証
-Aオプションを使って、以下のようにユーザ名とパスワードを指定します。
-A user:pass
②Cookieクッキーに認証情報を保持する
-Cオプションで、Cookieのパラメータ名と値を指定します。また、-Xオプションを使うと、指定した文字列にマッチしたURLはスキャン対象から除外できるので、ログアウトアクションでCookieが削除されるのを回避するため、ログアウトアクションURLを指定しておきましょう。
-C “name=value” -X <ログアウトアクションURL>
③その他の一般的なフォーム
フォームにユーザ名とパスワードを入力させ、データベースの内容と照合するような認証の場合、ログインフォームページや、パラメータ名、ログインアクションURLなどを、それぞれ、オプションで指定して、認証させることができます。
–auth-form <ログインフォームのあるページのURL> \
–auth-form-target <ログインアクションURL> \
–auth-user-field <ユーザ名のフィールド名> \
–auth-pass-field ?<パスワードのフィールド名> \
–auth-user <ユーザ名> \
–auth-pass <パスワード> \
–auth-verify-url <認証できたか確認できるページのURL> \
-X <ログアウトアクションURL>
まとめ
オープンソースのWEBアプリケーション用セキュリティ調査ツール
skipfishはGoogleが開発したWEBアプリケーション用のセキュリティ調査ツールで、Apache License 2.0で公開されています。
単語の組み合わせによるbrute-force
再帰的なクローリングだけでなく、辞書ファイルやクローリングしたデータから学習した単語を組み合わせて、いろいろなURLを生成し、アクセスを試みます。
結果はHTMLで見やすく表示
結果はHTMLで出力され、検出された問題を、リスクの度合いなども含めて、見やすく表示されます。また、問題を検出した際の、具体的なリクエストやレスポンスも結果に出力、表示してくれます。
豊富なオプション
様々なオプションが用意されており、ログイン認証が必要なサイトへの適用など、状況に応じて挙動を制御できます