Responsive image

Introdução:

Cross-site Scripting é um tipo de vulnerabilidade existente em aplicações web. Para explorar essa vulnerabilidade, de modo geral, é preciso inserir scripts maliciosos em campos de texto não tratados. Esse ataque faz com que o script seja executado no client-side sem permissão do usuário e, muitas vezes, sem seu conhecimento.

A fundação OWASP (Open Web Application Security Project) elaborou um ranking com 10 categorias de vulnerabilidades mais recorrentes atualmente, como um esforço para apoiar a prevenção de riscos de segurança em sites (OWASP, 2017). É possível notar que algumas das vulnerabilidades citadas pela OWASP, apesar de serem bem conhecidas, continuam sendo uma grande dor de cabeça para os desenvolvedores nos dias de hoje, e o problema não está relacionado à dificuldade em conter esse tipo de ataque, mas sim na falta de atenção para construir aplicações seguras: as aplicações estão cada vez mais complexas e os prazos de entrega têm se tornado cada vez mais apertados. Isso faz com que o programador foque no desenvolvimento das funcionalidades e negligencie aspectos de segurança.

Perfil do ataque:

  1. Dados são inseridos em uma aplicação web por uma fonte não confiável, geralmente por uma requisição web.
  2. Os dados são incluídos em conteúdo dinâmico que é enviado ao usuário sem que seja devidamente validado.

O conteúdo malicioso, apesar de muitas vezes ser um código JavaScript, pode também assumir a forma de HTML, Flash ou qualquer outro tipo de código que pode ser executado pelo navegador. O mais comum é que o atacante redirecione o usuário para uma página na qual ele possui controle, e envie para si os dados de cookies e da sessão. Segue abaixo um exemplo didático de como um ataque pode explorar uma vulnerabilidade XSS.

Exemplo de ataque XSS

Figura 1: Exemplo de ataque do tipo XSS

Execução do código resultante do ataque

Figura 2: Execução do código JS resultante do ataque

Apesar de parecer algo simples, ainda hoje existem sites que sofrem com essa vulnerabilidade. Um exemplo recente ocorreu no site do Supremo Tribunal Federal em maio de 2020, quando um hacker brasileiro conseguiu rodar Minecraft, um jogo sandbox de sobrevivência, diretamente nos servidores do STF, após mais de um ano sem que a falha fosse corrigida (a matéria completa pode ser encontrada aqui).

Como se prevenir do Cross-site Scripting:

Para evitar a ocorrência de ataques de XSS, o básico que pode ser aplicado aos seus campos de inserção de dados, é a validação dos dados recebidos, ou seja, a exibição de dados de um usuário deve ser sempre sanitizada, para que o navegador entenda que o conteúdo a ser exibido é apenas um texto, e não algo a ser executado por ele.

Segundo a W3 Schools [W3], em um exemplo utilizando PHP, podemos utilizar a função nativa htmlspecialchars, que valida uma string e converte todo o código HTML/CSS/JS para que seja interpretado pelo PHP como texto comum.

Para simplificar, duas regras podem ser seguidas:

  1. Nunca insira dados enviados pelo usuário em alguma seção do documento HTML, seja ela um comentário, div ou script.
  2. Se for realmente necessário inserir algum dado enviado pelo usuário, SEMPRE trate os caracteres maliciosos, tais como "<", ">" , ";" , e assim por diante. O real problema desse método é que, em certos casos, é impossível que esse dado se torne 100% seguro mesmo após tratá-lo.

A Figura 3 apresenta um exemplo de sanitização de dados. No PHP, a função htmlspecialchars() faz com que as tags HTML de uma string sejam tratadas como texto pelo navegador.

Uso da função htmlspecialchars() para evitar a execução de códigos informados pelo usuário

Figura 3: Uso da função htmlspecialchars() para evitar a execução de códigos informados pelo usuário

Resultado do código sanitizado

Figura 4: Resultado da execução de código após sanitização de dados

Demonstração:

Para um exemplo mais didático sobre o funcionamento do XSS, acesse essa página e teste o Cross-site Scripting em um ambiente controlado.

Referências:

OWASP. Cross site scripting prevention cheat sheet. Disponível em: <https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html> Acesso em: 27 jun. 2020

OWASP. Cross site scripting (xss). 2020. Disponível em: <https://: owasp.org/www-community/attacks/xss/> Acesso em: 27 jun. 2020

OWASP, T. Top 10-2017. The Ten Most Critical Web Application Security Risks. OWASP™ Foundation. The free and open software security community. URL:https://www.owasp.org/index.php/Top_10-2017_Top_10,2017.

W3schools.com. n.d. PHP Form Validation. [online] Disponível em: <http://www.w3schools.com/php/php_form_validation.asp> Acesso em: 14 ago. 2020.