Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
Como o PHP usa funções em C para operações relacionadas ao sistema de arquivos, ele pode lidar com bytes nulos de maneira inesperada. Como bytes nulos denotam fim de string em C, strings que os contém não serão consideradas de forma inteira, mas apenas até que um byte nulo ocorra. O seguinte exemplo mostra um código vulnerável que demonstra esse problema:
Exemplo #1 Script vulnerável a bytes nulos
<?php
$file = $_GET['file']; // "../../etc/passwd\0"
if (file_exists('/home/wwwrun/' . $file. '.php')) {
// file_exists retornará true porque o arquivo /home/wwwrun/../../etc/passwd existe
include '/home/wwwrun/' . $file . '.php';
// o arquivo /etc/passwd será incluído
}
?>
Portanto, qualquer string comprometida que é usada em uma operação de sistema de arquivos deve sempre ser validada corretamente. Aqui está uma versão melhorada do exemplo anterior:
Exemplo #2 Validando entrada corretamente
<?php
$file = $_GET['file'];
// Autorizando valores possíveis
switch ($file) {
case 'main':
case 'foo':
case 'bar':
include '/home/wwwrun/include/' . $file . '.php';
break;
default:
include '/home/wwwrun/include/main.php';
}
?>
Looks like this issue was fixed in PHP 5.3 https://bugs.php.net/bug.php?id=39863
clean input of null bytes:
<?php
$clean = str_replace(chr(0), '', $input);
?>