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

  1. Post muito útil, Danilo.

    Acredito que a maneira mais simples de contornar esse problema seja o uso de trim() ou rtrim(), que retiram, entre outros caracteres, o byte NULL.

    Posted on 24-Aug-07 at 2:32 pm | Permalink

Post a Comment

Your email is never published nor shared. Required fields are marked *
*
*