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