Hoje vamos apresentar uma vulnerabilidade, causada por um falha de programação em um site feito em PHP. O objetivo deste tópico é apenas didático, para alertar sobre boas práticas de segurança em programação, e que nenhum conteúdo do site foi alterado. Vale salientar, que o administrador do site já foi avisado do problema, e que o mesmo já foi corrigido. Nomes de arquivos e variáveis foram modificados para preservar a privacidade do programador.
Nenhum animal silvestre foi maltratado durante a confecção deste artigo =P
Em meados de 2008, eu estava buscando um tema para finalizar a minha pós na área de redes de computadores. O amigo e professor Hermano Pereira sugeriu realizar uma pesquisa sobre o OWASP, sugerindo que por eu trabalhar com programação e com redes, seria interessante apresentar os problemas que as falhas de programação podem trazer para os servidores. O OWASP é um projeto que reúne profissionais do mundo inteiro, alertando e buscando soluções para vulnerabilidade em sistemas Web. Durante a pesquisa, resolvi mudar o tema do TCC, mas os ensinamentos da pesquisa que realizei foram bastante válidos.
Dias atrás, visitando um site sobre mercado financeiro, visualizei um link que realiza o download de um gráfico em formato PNG. Na url, percebi que era passado o nome do arquivo por parâmetro.
http://…/baixar.php?arquivo=arquivo.png
Aí começa a falha. Passando por parâmetro o nome do arquivo, o servidor força o download do arquivo físico dentro do servidor, sem nenhum tipo de validação. Isto permite baixar qualquer arquivo que esteja no servidor, certo ? Vamos testar, tentando baixar o próprio arquivo de download
http://…/baixar.php?arquivo=baixar.php
Vejamos, conseguimos baixar o próprio arquivo que realiza o download…O código é mais ou menos este.
$arquivo = $_REQUEST["arquivo"];
$fp = fopen("$arquivo", "r");
fpassthru($fp);
fclose($fp);
Agora analisando, se conseguimos baixar o próprio arquivo de download, podemos baixar quaisquer outros arquivos…Então vamos tentar baixar o arquivo index.php. O arquivo index.php está a dois níveis acima do arquivo que realiza o download, então vamos adicionar ‘../../’
http://…/baixar.php?arquivo=../../index.php
Conseguimos novamente. Dentro deste arquivo, tem algo parecido com isto
include("config.inc.php");
include("main.php");
Agora vamos para o o config.inc.php. Fatalmente terá o arquivo com login e senha do banco de dados…
http://…/baixar.php?arquivo=../../config.inc.php
Veja só o que conseguimos…
define(DB_HOST,'mysql.trossoapilao.com.br'); define(DB_NAME,'angelolopes'); define(DB_USER,'val'); define(DB_PASS,'silbocadelagarto');
Verificando as documentações da OWASP, acredito que esta falha seja uma falha A4 – Insecure Direct Object Reference (Me corrijam se eu estiver errado). Graças a Deus eu sou uma pessoa bondosa, e resolvi avisar o proprietário do site, antes que algum elemento mau intencionado fizesse qualquer coisa…
Se o servidor não estiver corretamente configurado, com chroot por exemplo, será possível chegar na raiz no sistema, e realizar o download dos arquivos passwd e shadow, localizado em “/ etc / passwd” e “/ etc / shadow” em servidores linux.
Durante a pesquisa, para melhor confecção deste post, encontrei um artigo em pdf muito interesssante, demonstrando como funciona o ataque A4. Para visualizar o artigo, clique aqui
O artigo apresenta uma falha em servidores Windows, onde é possível executar comandos remotamente. Vale a pena baixar e conferir.

Tudo certo que você avisou o dono do site, mas de qualquer forma é recomendável que não publique os dados que encontrou sem os mascarar…
O correto seria colocar nomes de exemplo como ‘db.dominio’, ‘nome’ e ‘password’ em vez da informação que recolheu. Tambem deveria dizer no texto que os dados apresentados não são os reais, e que você substitui por motivo se segurança.
De resto parabéns e bom trabalho
As informações ali mostradas são “fakes”…