%00
es la versión codificada en URL de un carácter de byte nulo. En algunas aplicaciones, puede inyectar un byte nulo para terminar prematuramente una cadena. Un atacante puede aprovechar esto para cortar el final de una cadena que no puede controlar.
Aquí está el pseudocódigo para ver cómo se ve el código afectado:
print(readfile("./" + $name + ".txt"))
En este ejemplo, cualquier valor proporcionado por el usuario para $name
se agregaría automáticamente con una extensión .txt
, lo que le impedirá elegir nombres de archivo arbitrarios. Para poder seguir suministrando su propia ruta, puede utilizar el byte 0x00
para terminar la cadena inmediatamente después de la carga útil.
Por lo tanto, estas rutas serían tratadas por igual por el sistema afectado:
./../../../../../../../../windows/PFRO.log
./../../../../../../../../windows/PFRO.log%00.txt
Los errores de inyección de bytes nulos son comunes porque muchos lenguajes de nivel superior se basan en C, donde se usa un byte nulo para indicar el final de una cadena. Por ejemplo, aquí hay un ejemplo de un script PHP vulnerable, tomado de los documentos PHP :
<?php
$file = $_GET['file']; // "../../etc/passwdprint(readfile("./" + $name + ".txt"))
"
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
}
?>
También vea: Incrustar código nulo en OWASP.