Site do IBGE possui falha de segurança

O IBGE colocou no ar uma página onde podem ser acompanhados os resultados do Censo 2010. Os resultados podem ser vistos por estado e por cidade.

Veja por exemplo os resultados do estado do Paraná. Agora clique no nome de um município. Abrirá uma pop-up com os detalhes referentes ao município. Veja os resultados da cidade de Medianeira (PR), por exemplo. Muito louvável a iniciativa, é claro. Mas, nem tudo são flores. Existe um perigo oculto.

A página que exibe os resultados de um município aceita 5 parâmetros pela URL (como pode ser visto aqui): Nome, CODMUN, ESTPOP, ESTDOM e NomeUE. O problema está justamente no primeiro parâmetro: Nome. Nele é passado o nome do município que estamos visualizando. Mas o estagiário que criou essa página usando a linguagem de programação PHP esqueceu de um detalhe: deve-se sempre tratar os parâmetros passados para um script antes de usá-los. Mas nessa página do IBGE isso não é feito, o estagiário simplesmente colocou esse código na página:

echo $_GET["Nome"];

Ou seja, qualquer valor que for passado para o parâmetro Nome será incorporado a página. Esse tipo de vulnerabilidade é conhecido como cross-site scripting (XSS), que segundo a Wikipédia:

É um tipo de vulnerabilidade do sistema de segurança de um computador, encontrado normalmente em aplicações web que ativam ataques maliciosos ao injetarem client-side script dentro das páginas web vistas por outros usuários. Um script de exploração de vulnerabilidade cross-site pode ser usado pelos atacantes para escapar aos controles de acesso que usam a mesma política de origem.

O cross-site scripting afeta muitos sites, como aconteceu recentemente com o Twitter (veja mais detalhes). Veja o que é possível fazer na página do IBGE afetada pela falha:

Site do Censo 2010 após injeção de HTML
Site do Censo 2010 após injeção de HTML

Tentei usar também o temido iframe mas felizmente não foi possível. Bom, e como resolver esse furo de segurança? Simplesmente substituir o código PHP mostrado anteriormente por esse aqui:

echo filter_var($_GET["Nome"], FILTER_SANITIZE_STRING);

A função filter_var irá filtrar o parâmetro usando o filtro FILTER_SANITIZE_STRING, que irá remover tags que estiverem presentes no parâmetros. Existem também outras maneiras de se tratar um parâmetro (veja nos Links relacionados). Enviei um e-mail para o IBGE alertando da falha.

Não é incomum sites do governo possuírem brechas de segurança. Já aconteceu com o site da Receita Federal e do Ministério da Defesa e muitos outros. A pergunta que fica no ar é: como um projeto com orçamento de R$ 1,7 bilhão (sendo R$ 200 milhões em tecnologia) pode ter esse tipo de falha?

Clebersander Rech
Clebersander Rech (Cleber)
Analista de Sistemas
Curitiba, PR, Brasil