ディレクトリトラバーサル

ディレクトリトラバーサル (directory traversal)

ディレクトリ・トラバーサルとは

ディレクトリ・トラバーサルとは、Webサーバが非公開としているファイルにアクセスする攻撃手法です。

トラバーサルは「横断する」という意味で、公開されているディレクトリから目的のディレクトリへ横断するイメージから命名されています。

ドットドットスラッシュ攻撃、 ディレクトリクライミング、バックトラッキング、パストラバーサルのような別名があります。


入力される可能性のあるデータに対する考慮不足を突く手法といえます。

この攻撃の目標は、アクセス可能にすることを意図していないファイルへのアクセスをアプリケーションに命令することです。


ディレクトリ・トラバーサルの仕組み

外部入力によりパス名を作成し、制限された親ディレクトリ配下に位置するファイルやディレクトリを識別するために用いるようなソフトウェアにおいて、パス名に含まれる特殊な要素の無効化が適切に行われない場合、制限されたディレクトリの外側のパス名解決が可能となります。

入力フォームやURLに対して、「/../../」といった特殊な記号や、「¥」や「/」を表す文字(「%c1%1c」や「%c1%8s」など)を利用して本来参照できないデータを参照します。

また、文字コードのバグなどを利用することもあります。


絶対パスのトラバーサル

相対パスではなく、「/usr/local/bin」のような絶対パスが利用できる場合もあります。

この場合も予期しないファイルへのアクセスに悪用される可能性があります。


ディレクトリ・トラバーサルの実行例

コマンドライン引数(WEBサイトにおける入力パラメータ値)を受け取って、ファイルの内容を表示するRubyスクリプトを用意します。


#!/usr/bin/ruby

exit(1) if(ARGV[0] == nil)

filepath="./account/#{ARGV[0]}"
data = File.read(filepath)
puts data

まずは正常終了させてみます。


$ ./dir_traversal.rb "user01"

結果、「./account/user01」ファイルの内容が表示されます。


では、ディレクトリ・トラバーサルを行います。

以下のように相対パスを入力値とします。


$ ./dir_traversal.rb "../../../../etc/passwd"

入力値から生成されるファイルパスは以下の通りです。


./account/../../../../etc/passwd
  ↓
./../../../etc/passwd
  ↓
/etc/passwd

結果、/etc/passwdのファイル内容が表示されることとなります。


関連ページ