Estoy tratando de entender cómo los ataques de inyección de bytes nulos en el código PHP solían funcionar antes de ser parcheados en PHP 5.3.4. Tengo una página HTML de muestra que es una versión algo modificada de lo que se muestra aquí :
<?php
var_dump($_GET);
echo '<br>';
$file = $_GET['file'];
$path = '/var/www/' . $file . '.php';
echo $path;
if (file_exists($path)) {
echo "file exists!";
include $path;
}
?>
Este código se ejecuta en un sistema Ubuntu 12.04 que ejecuta PHP 5.2.17. Espero que una URL como http://localhost/?file=../../../etc/passwd%00
funcione, pero en cambio veo %code%
impreso literalmente en la cadena:
array(1) { ["file"]=> string(21) "../../../etc/passwd<?php
var_dump($_GET);
echo '<br>';
$file = $_GET['file'];
$path = '/var/www/' . $file . '.php';
echo $path;
if (file_exists($path)) {
echo "file exists!";
include $path;
}
?>
" }
/var/www/../../../etc/passwdarray(1) { ["file"]=> string(21) "../../../etc/passwd%pre%" }
/var/www/../../../etc/passwd%pre%.php
.php
¿Qué estoy haciendo mal? ¿Cómo puedo hacer que los ataques de inyección de bytes nulos funcionen en mi máquina local?