Al lado de PHP se interpreta, la versión < = a PHP 5.3.4 es vulnerable a un ataque que comúnmente se llama inyección de bytes nulos .
Para declarar una cadena en php, utiliza $var = "hey" , que es equivalente en C a char tab[4]="hey" . Observe que declaramos una matriz de caracteres de 4 bytes, mientras que solo queremos almacenar 3 caracteres. Esto se debe a que el compilador inserta automáticamente el carácter de byte nulo. Tu cadena final es entonces heytab
%00 es un puntero que apunta al primer carácter de su cadena. Su computadora leerá desde el primer carácter al carácter de byte nulo (0 en hexadecimal) representado por readfile("pages/$path/index.html"); .
$tmp=pages/pathFromVariable/index.html es la representación del carácter de byte nulo en PHP.
Cuando llamas a una función con una cadena, como pages/pathFromVariable/index.html$tmp=pages/pathFromVariable%00/index.html , tu cadena se almacena en una variable. Llamémoslo pages/pathFromVariablepages/pathFromVariable/index.html%code% que en realidad se almacenará en la memoria como %code%
Ahora, si inyecta un byte nulo al final de su entrada, puede borrar el final de la cadena. por ejemplo, si %code% se almacenará como %code% , lo que resultará en la lectura del archivo %code% ! Pown!
Lo siento si esto es un poco confuso, esta es mi primera explicación "técnica".