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".