2007年5月29日火曜日

PHP/Perl CGIにて、ファイル名に記号を使わせなければ安全っていうのは嘘。



windows限定の話になってしまって恐縮なのだが。。。。


例えば以下のコードはDoS脆弱性を抱えている。


試しにfile=COM1とするとロックがかかった状態でプロセスが刺さってしまう。


(COMポートがないノートPC等では再現できない)


lock中にこの状態に陥るので全てのアクセスが凍る事になる。


希にファイル名=セッションIDにしてセッション文字列を[a-zA-Z0-9]+としてチェックをかけている実装をみかけるが、windows上でCGI/PHPを動かす事を考えると危険であると言える。


せめて^[a-zA-Z0-9]{32}$とかにしないとやられちゃうです。



$fp=fopen("lockfile","w");
if(flock($fp,LOCK_EX)){
print("lcokGet");
$file=$_GET["file"];
if(preg_match("[^a-zA-Z0-9]",$file)){
print("Attacked so Abort");exit();
}
$ffp=fopen("./data/".$file,"w+");
$contents = fread($ffp,10);
fwrite($ffp,"hoge");
fclose($ffp);

}
fclose($fp);





追記:pukiwikiは外部リクエストから作られるファイル名は[A-F0-9]+に拡張子を足した物にかぎってるみたいですね。これに引っかかる変態OSはたしかにまずなさそうだ。





0 件のコメント:

コメントを投稿