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

Pocket

ディレクトリトラバーサルとは文字列../やヌルバイトをクエリ文字に混ぜて想定していないファイルを開くディレクトリ遡り攻撃。

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

readfile($_DIR . $_GET['name'] . '.dat');

クエリとして?name=../somefile.txt%00を送信する。../により$_DIRで設定したファイルの1つ上の階層のディレクトリに遡られる。
そしてバイナリセーフでないreadfile関数
がヌルバイト%00を文字列の終端と判断する。よって$_DIRの1つ上の階層のsomefile.txtが読み込まれる。

ディレクトリトラバーサルの対策

ホワイトリスト法

if(!in_array($_GET['file'],$filelist){
    exit;
} else {
    readfile($_DIR . $_GET['file']);
}

filelistは許可する文字列。

basename関数によるサニタイズ

readfile($_DIR . basename($_GET['file']));

遡りのない不正ファイル指定には無効。

ブラックリスト法

if(strstr($_GET['file'],'..')) {
    exit;
} else {
    readfile($_DIR . $_GET['file']);
}

遡りのない不正ファイル指定には無効。

open_basedir制限

open_basedir制限をつけることによりPHPがオープンできるファイルを特定のディレクトリツリーに制限する。

open_basedirはphp.iniに記述する方法とhtaccessに記述する方法がある。
詳しくはhttp://php.s3.to/man/features.safe-mode.html
を参照。

コメント

No comments yet.

コメントの投稿

改行と段落タグは自動で挿入されます。
メールアドレスは表示されません。