if (file_exists(realpath($_GET['teste'] . ".php"))){
echo 'OK';
}
else{
echo 'Fail';
}
Aparentemente esta verificação é bastante segura né?
Infelizmente não. O PHP usa o padrão de strings usado em C (aquelas terminadas com ‘\0’), o que gera um problema bastante conhecido chamado de Null Byte issue [1].
O que acontece se seu $_GET[‘teste’], aparentemente seguro, tiver um ‘\0’?
Sua função realpath vai verificar apenas o $_GET[‘teste’] e nem vai saber que existe um “.php”
Faça o teste:
http://localhost/labs/teste.php?teste=/etc/passwd%00
(%00 é o código hexadecimal aceito pelos browsers para o \0)
E o resultado:
OK
One Comment