Um exemplo prático de vulnerabilidade em PHP

Um exemplo prático de vulnerabilidade em PHP

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.

About the Author

Jeferson da Luz é formado em Análise de Sistemas, especialista em Redes de Computadores. Estudioso do mercado financeiro.