ポイント

●ディレクトリ・トラバーサルとは,「../」のような文字列を使ってWebサーバーのディレクトリ・パスをさかのぼり(横断して),公開されていないディレクトリにアクセスする手法のことである
●OSコマンド・インジェクションは,ディレクトリ・トラバーサルの手法を用いてOSコマンドがあるディレクトリにアクセスし,OSコマンドを実行する手法のことである
●どちらの手法も,Webアプリケーションの脆弱性,具体的には「入力される可能性のあるデータに対する考慮不足」を悪用する攻撃手法である

 前回は,Webアプリケーションの脆弱性の大枠を確認しました。今回は「ディレクトリ・トラバーサル」と「OSコマンド・インジェクション」の詳細を学びます。いずれもWebアプリケーションの脆弱性=「入力される可能性のあるデータに対する考慮不足」を狙った攻撃手法です。

ディレクトリ・トラバーサルのカラクリ

 ディレクトリ・トラバーサルとは,Webサーバーの管理者が公開(許可)していないファイルにアクセスする攻撃手法です。トラバーサル(トラバース)は「横断する」という意味で,公開されているディレクトリから目的のディレクトリへ横断するイメージから命名されています。

 どんなWebサーバーでもディレクトリ・トラバーサルの危険性にさらされているかというと,そうではありません。例えばWebアプリケーションを利用して目的のデータを表示させるような運用をしているサイトで,「入力される可能性のあるデータに対する考慮不足」がある場合に,この問題を引き起こします。では,具体的に見ていきましょう。

 例として,サーバー内にある特定のテキスト・ファイルを公開することを考えます。図1のテスト環境上で,C:/test/txt/というディレクトリ内にあるテキスト・ファイルだけを公開したいとしましょう。このディレクトリ中には「1.txt」「2.txt」のように,テキスト・ファイルが保存されています。また,Cドライブのtestディレクトリ直下にはhimitsuというディレクトリがあり,そこには外部に公表したくない秘密情報が入っているものとします。

図1●テスト環境のパス構成
図1●テスト環境のパス構成

 この環境下で,Webアプリケーションを利用して情報を公開します。ユーザーがサーバーにアクセスすると,図2(1)のようなページが表示されます。ここでユーザーは,アクセスしたいファイル名をテキスト・ボックスに入力します。「見る」ボタンを押すと,テキスト・ボックスに入力した文字列がサーバーに送られます。

図2●Webアプリケーションを利用してサーバー上の特定ファイルの中身を参照する
図2●Webアプリケーションを利用してサーバー上の特定ファイルの中身を参照する
[画像のクリックで拡大表示]

 Webアプリケーションはこれを受け取り,公開ディレクトリのパス「C:/test/txt/」に,ユーザーが入力したファイル名「1.txt」を結合して「C:/test/txt/1.txt」というパスを作成して当該ファイルにアクセスします(2)。そして,テキスト・ファイルの中身を読み出してユーザーに返信します。ユーザーのブラウザは,これを表示します(3)。図2(3)のページの実行結果のところで,1.txtの中身が表示されていることがわかります(なお,Webサーバー上で動作しているプログラムは,ユーザーが入力した文字列とWebアプリケーションが作成した文字列,そして実行結果を確認できるようにしています)。

 このように,公開ディレクトリのパス「c:/test/txt/」を付与するのはWebアプリケーションです。ユーザーはディレクトリ名を指定できません。ですから,ユーザーからのアクセスを,このWebアプリケーション経由に限定すれば,ほかのディレクトリへのアクセスが不可能になっているように見えます。

 しかし,サーバー上で動作しているWebアプリケーションに「入力される可能性のあるデータに対する考慮不足」があったとします。すると,任意のディレクトリへのアクセスが可能になってしまいます。少し極端ですが,このWebアプリケーションは,どんな文字列でも受け入れるようになっていたとしましょう。

 悪意のあるユーザーは,アクセスしたいファイル名に「../himitsu/himitsu.txt」と入力して送信します(図3(1))。Webアプリケーションは,これを受け取って「C:/test/txt/」にユーザーが入力したファイル名「../himitsu/himitsu.txt」を結合して,「C:/test/txt/../himitsu/himitsu.txt」というパスを作成します。そして,当該ファイルにアクセスします。この時,入力された文字列中の「../」は親ディレクトリを意味しますので,図3中サーバー内のディレクトリ構造の青線をたどり,本来は公開していない秘密情報(himitsu.txt)にアクセスできてしまいます(2)。この結果,Webアプリケーションはhimitsu.txtの中身を読み出して悪意のあるユーザーに返信してしまいます(3)。

図3●「../」を悪用することで親ディレクトリに移動して任意のファイルにアクセスできる
図3●「../」を悪用することで親ディレクトリに移動して任意のファイルにアクセスできる
[画像のクリックで拡大表示]