ディレクトリトラバーサル
読み:ディレクトリトラバーサル
外語:directory traversal
インジェクション攻撃の一つ。
概要
"../../../etc/passwd" のように相対パスを書き連れた値がopen文などの引数に入り、相対パスの機能で任意のファイルが読み出せてしまうというもの。
システム内のディレクトリを自由に横断することから、ディレクトリトラバーサルと呼ばれる。
実際の例
サンプルソースコード(Perl)
CGIプログラムという前提で記述。
#!/usr/bin/perl
use strict;
use CGI;
my $cgi = new CGI;
my $option = $cgi->param('opt')
my $filename = "/usr/hoge/data/$option";
my $fp;
open($fp, $filename) or die "File Cannot Open '$filename'";
my $ret_data = phaseData($fp);
close($fp);
print $ret_data->{userdata};
この例では、CGIパラメーターoptの値に "../../../etc/passwd" が入ると、open文で開こうとするファイル名は "/usr/hoge/data/../../../etc/passwd" すなわち "/etc/passwd" となってしまう。
これにより(phaseData関数の実装によっては)パスワードファイルの内容が表示される可能性がある。これによりクラッカーは攻撃時に有力な情報となるユーザー一覧を取得できるかもしれない。
攻撃の防止方法
CGIパラメーターoptの入力値として妥当なものが何であるかを判断し、妥当でない値が含まれていた場合は処理を行なわないようにする。
修正したソースコードは次の通り。
#!/usr/bin/perl /T
use strict;
use CGI;
my $cgi = new CGI;
my $option = $cgi->param('opt')
if ( !$option=~m/^(\w{1,10})$/ ){
die "attacked by a cracker(injection attack?).";
}else{
$option = $1; # 汚染検出モード対応
}
my $filename = "/usr/hoge/data/$option";
my $fp;
open($fp, $filename) or die "File Cannot Open '$filename'";
my $ret_data = phaseData($fp);
close($fp);
print $ret_data->{userdata};
修正したソースコードは、optの入力値は1文字から10文字までの英数字しかありえないという前提に基づいて値のチェックを行なっている。英数字以外の値が含まれていたら即座に処理を停止する。
これにより、openの引数に "../.."のようなトラバーサルに使われる文字列が入り込むことはなくなる。
再検索