Null 바이트 관련 이슈들

PHP 파일시스템 관련 작업을 위해 C 함수를 사용하므로, null 바이트를 아주 이상하게 처리할 수도 있습니다. C에서 null 바이트는 문자열의 끝을 나타내므로, 문자열이 null 바이트를 포함하면 null 바이트가 출현하기 전까지만 인식할 것입니다. 다음 예제는 이런 문제점을 설명하는 취약한 코드를 보여줍니다.:

Example #1 null 바이트에 취약한 스크립트

<?php
$file 
$_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
    
// file_exists 함수는 /home/wwwrun/../../etc/passwd 이 존재하는것으로 보고 true 를 리턴할 것입니다.
    
include '/home/wwwrun/'.$file.'.php';
    
// /etc/passwd 파일이 include 될것입니다.
}
?>

따라서, 파일시스템 작업에 사용되는 더렵혀진 문자열은 항상 올바른지 확인되어야만 합니다. 다음은, 이전 예제보다 향상된 버전입니다.:

Example #2 올바른 입력 확인

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

// Whitelisting possible values
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 add a note

User Contributed Notes 3 notes

up
10
Anonymous
5 years ago
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
up
5
J.D. Grimes
5 years ago
This issue has been fixed for file_exists(): https://bugs.php.net/bug.php?id=39863

It still exists for include|require(_once) as of this writing.
up
2
cornernote [at] gmail.com
4 years ago
clean input of null bytes:

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