| ア | イ | ウ | エ | オ |
| カ | キ | ク | ケ | コ |
| サ | シ | ス | セ | ソ |
| タ | チ | ツ | テ | ト |
| ナ | ニ | ヌ | ネ | ノ |
| ハ | ヒ | フ | ヘ | ホ |
| マ | ミ | ム | メ | モ |
| ヤ | ユ | ヨ | ||
| ラ | リ | ル | レ | ロ |
| ワ | ヰ | ヴ | ヱ | ヲ |
| ン |
| A | B | C | D | E |
| F | G | H | I | J |
| K | L | M | N | O |
| P | Q | R | S | T |
| U | V | W | X | Y |
| Z | 数字 | 記号 | ||
インジェクション攻撃の一つ。
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の引数に "../.."のようなトラバーサルに使われる文字列が入り込むことはなくなる。
コメントなどを投稿するフォームは、日本語対応時のみ表示されます