Null 바이트 관련 이슈들

PHP는 파일 시스템 관련 작업에 기본 C 함수를 사용하기 때문에 예상치 못한 방식으로 null 바이트를 처리할 수 있습니다. 널(null) 바이트는 C에서 문자열의 끝을 나타내므로 이를 포함하는 문자열은 완전히 고려되지 않고 널(null) 바이트가 발생할 때까지만 고려됩니다. 다음 예는 이 문제를 보여주는 취약한 코드를 보여줍니다.

예제 #1 널(null) 바이트에 취약한 스크립트

                  
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/'.$file.'.php')) {
    // file_exists will return true as the file /home/wwwrun/../../etc/passwd exists
    include '/home/wwwrun/'.$file.'.php';
    // the file /etc/passwd will be included
}
?>
                  
                

따라서 파일 시스템 작업에 사용되는 모든 오염된 문자열은 항상 적절하게 유효성을 검사해야 합니다. 다음은 이전 예제의 더 나은 버전입니다.

예제 #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';
}
?>