Skip to content

PHP e Null Bytes issues

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

[1] http://en.wikipedia.org/wiki/Null_character

One Comment