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';
}

?>
īŧ‹add a note

User Contributed Notes 2 notes

up
10
Anonymous Âļ
12 years ago
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
up
7
cornernote [at] gmail.com Âļ
11 years ago
clean input of null bytes:

<?php
$clean = str_replace(chr(0), '', $input);
?>