Webアプリケーション向けのセキュリティスキャナ「skipfish」を使う 2ページ

skipfishのダウンロードとビルド

 skipfishはGoogle Codeのプロジェクトページからダウンロードできる。動作環境はLinuxおよびFreeBSD、Mac OS X、Windows(Cygwin)だ。なお、バイナリパッケージは配布されていないため、各自の環境でコンパイルを行う必要がある。

 skipfishのコンパイルには、OpenSSLおよびPCRE、libidnが必要だ。たとえばCentOSの場合、openssl-develおよびpcre-devel、libidn-develパッケージをインストールしておけば良い。これらが利用できる環境で配布パッケージを展開し、展開先ディレクトリ内でmakeコマンドを実行すればコンパイルが完了する。

$ tar xvzf skipfish-2.10b.tgz
$ cd skipfish-2.10b
$ make

skipfishを使う

 skipfishはコマンドラインベースで操作するツールであり、GUIは用意されていない。skipfishのビルドが完了すると、makeを実行したディレクトリ内にskipfishというバイナリファイルが作成される。skipfishには多数のオプションが用意されているが、最低限必要なオプションは「-W」および「-o」オプションだ。これらを指定してskipfishを実行するには以下のようにすれば良い。

$ ./skipfish -W <キーワード辞書の保存先ファイル> -o <レポートの出力先ディレクトリ> <クロールを開始するURL> [<クロールを開始するURL2> ...]

 まず「-W」オプションだが、これは学習したキーワード辞書の保存先ファイルを指定するものだ。skipfishでは調査対象とするURLを収集するためにWebページをクローリングしていくとともに、キーワードが格納された辞書を利用して生成された未知のURLに対してもアクセスを試みる。

 skipfishにはあらかじめいくつかの辞書がdictionariesディレクトリ以下に同梱されているほか、クローリングに使用したURLやページ内に含まれるURL、文字列などからキーワードを抽出して独自の辞書を生成する機能も用意されている。

 ここで生成された辞書データは、-Wオプションで指定されたファイルに保存される。-Wオプションは必須のオプションであるが、もし辞書を保存したくない場合、「-W /dev/null」、もしくはそれと同じ挙動を行う「-W-」オプションを指定すれば良い。また、存在しないファイルを指定することはできないので、新たに辞書を作成したい場合は空のファイルをあらかじめ作成しておく必要がある。

 レポートの出力先ディレクトリを指定する「-o」オプションも必須である。そのほかのオプションについては、「--help」オプション付きでskipfishを実行することで確認できる(主要なものについては後述する)。

 なお、skipfishでは対象とするWebサーバーに連続してアクセスを行う関係上、サーバーに負荷をかける点には注意したい。フォームへの投稿なども行うため、実際に運用中のサーバーに対して実行することは避けることが望ましい。

使用する辞書を指定する

 skipfishのdictionariesディレクトリ以下には多くのサイトで利用できる汎用性の高いキーワード辞書が付属しており、これを使用することで意図せずに公開されているファイルや不適切な挙動を行うURLを検出できる。

 dictionariesディレクトリに用意されている辞書は、最小限のものに絞った「minimal.wl」および中程度のキーワードを含む「medium.wl」、多くのキーワードを網羅した「complete.wl」、そして拡張子に対するチェックのみを行う「extensions-only.wl」の4つだ。併用する辞書は、-Sオプションで指定できる。たとえばcomplete.wlを使用してスキャンを行うには以下のようにする。

$ ./skipfish -S dictionaries/complete.wl -W <作成する辞書ファイル> -o <出力ディレクトリ> <クロールを開始するURL>

skipfishによるスキャンを高速化する

 skipfishでは辞書やサイトから抽出したキーワードからURLを生成してスキャンを行うため、存在しない膨大なURLに対してのアクセスを行うことになる。そのため、辞書やキーワードの利用を制限してスキャンを高速化するためのオプションも用意されている(表1)。ただしスキャンが高速になるということは、そのぶん脆弱性の「発見漏れ」が生じる可能性も高くなる点に注意が必要だ。

表1 キーワードや辞書関連のオプション(抜粋)
オプション説明
-Lサイトコンテンツからのキーワードの抽出を行わない
-Y辞書から「<ファイル名>.<拡張子>」というURLを生成する際、一部の組み合わせしか使用しない
-W-抽出したキーワードを辞書へと書き込まない

 たとえば、skipfishのドキュメントでは「もっとも高速だが一般的な用途には推奨できないオプション」として、以下のような「-W-」および「-L」オプションの併用が挙げられている。

$ ./skipfish -W- -L -o <出力ディレクトリ> <クロールを開始するURL>

 このオプションを指定した場合、スキャン時間は短くなるものの、ディレクトリに対する総当たり攻撃が不十分になるという。短時間でスキャンを済ませたいのであればプリセット辞書「extensions-only.wl」もしくは「complete.wl」を使用し、-Yオプション付きでskipfishを実行するのがおすすめだ。

$ ./skipfish -S dictionaries/extensions-only.wl -W <作成する辞書ファイル> -Y -o <出力ディレクトリ> <クロールを開始するURL>
$ ./skipfish -S dictionaries/complete.wl -W <作成する辞書ファイル> -Y -o <出力ディレクトリ> <クロールを開始するURL>

 もちろん、-Yオプションを指定すると辞書中のキーワードの一部の組み合わせしか使用されないので、時間的な余裕があるのであれば-Yオプションを使わないほうが好ましい。たとえば以下の例は、指定したWebサイトに対して完全なスキャンを実行するものだ。

$ ./skipfish -S dictionaries/complete.wl -W <作成する辞書ファイル> -o <出力ディレクトリ> <クロールを開始するURL>

ログインが必要なサイトに対する調査を行う

 アクセスの際に何らかの認証が必要となるWebサイトに対して調査を行いたい場合、skipfishに認証情報を与えて実行させる必要がある。たとえばBASIC認証を利用している場合、-Aオプションで以下のようにそのユーザー名およびパスワードを指定できる。

-A <ユーザー名>:<パスワード>

 いっぽう、Cookieを使った認証を行っている場合は-Cオプションで以下のようにアクセスの際に送信するCookieを指定できる。

-C <Cookie名>=<値>
たとえば名前が「sid」、値が「foobar」というCookieを利用する場合、以下のように指定すれば良い。
-C sid=foobar

特定のディレクトリを無視する

 Cookieを使った認証を行っている場合、特定のURLにアクセスすると認証が解除されてしまう(ログアウトされる)場合がある。これを防ぐには、-XオプションでそのURLを指定しておけば良い。-Xオプションは指定されたURLを調査対象から外す働きをするオプションだ。たとえば「/logout/」というURLを対象外とするには、以下のオプションを追加すれば良い。

-X /logout/