« ファイルシステムのセキュリティ
データベースのセキュリティ »

Null バイト関連の問題

PHP はファイルシステム関連の操作に C 言語の関数を使用しているので、 null バイトの処理を予期せぬかたちで行うことがあります。 C 言語では null バイトは文字列の終端を表すので、 null バイトを含む文字列があった場合に null バイト以降の内容は文字列として処理されません。 以下に、この問題に関する脆弱性を含むコード例を示します。

例1 null バイトに対して脆弱なスクリプト

<?php
$file = $_GET['file']; // ここで "../../etc/passwd\0" が渡されたとします

if (file_exists('/home/wwwrun/' . $file . '.php')) {
    // file_exists は true を返します。これは、ファイル /home/wwwrun/../../etc/passwd が存在するからです
    include '/home/wwwrun/'.$file.'.php';

    // ファイル /etc/passwd がインクルードされてしまいます

}

?>

したがって、ファイルシステム操作で使用する「汚染された」文字列は、 つねに適切に検証しなければなりません。 先ほどの例を改良したものを示します。

例2 入力を適切に検証する例

<?php
$file = $_GET['file'];

// 値として与えられる可能性のある、有効な値の一覧を作成します
switch ($file) {
    case 'main':
    case 'foo':
    case 'bar':
        include '/home/wwwrun/include/' . $file . '.php';
        break;
    default:
        include '/home/wwwrun/include/main.php';
}

?>
関連キーワード:
バイト   home   wwwrun   関連   問題   ファイルシステム   セキュリティ   passwd   case   操作   言語   exists   検証   main   データベース   予期   終端   脆弱性   コード   脆弱   スクリプト   インクルード   汚染   改良   可能性
関連する関数・ページ:
security.filesystem   security   function.dio-read   function.dio-write   security.sessions   phar.fileformat.manifestfile