Introdução
Quando tratamos de aplicações web é inegável a quantidade de vulnerabilidades que podem existir. Presente desde a OWASP TOP TEN 2007 a vulnerabilidade de Cross-Site Scripting (XSS) está entre as falhas mais comuns, tanto pela sua facilidade de exploração como pelo seu impacto significativo para a segurança das aplicações vulneráveis.
Após 14 anos esse tipo de vulnerabilidade ainda é evidenciada na OWASP TOP TEN 2021 compondo a categoria A3-Injection.
Como funciona "Cross-Site Scripting"?
Na programação, um script é uma série de instruções que informam a um programa o que fazer. No cenário de uma aplicação web, uma vez que a ela não realiza o tratamento das informações enviadas para o servidor um agente malicioso pode injetar scripts próprios que alteram o comportamento do site. Vale salientar que o navegador não sabe diferenciar qual é o código legitimo do código malicioso.
Desse modo a vulnerabilidade de XSS difere de outros ataques da Web uma vez que não tem como alvo direto o aplicativo comprometido e sim os usuários que realizam o uso da solução infectada. Utilizando da injeção de códigos Javascript na página, um invasor pode contornar a política de mesma origem, que é projetada para separar sites diferentes uns dos outros, além da possibilidade de acesso aos cookies, tokens de sessão e outras informações confidenciais armazenadas pelo navegador para uso no site.
O que é JavaScript?
JavaScript é uma linguagem de programação que permite implementar itens complexos em páginas web uma vez que a página da web apenas mostra a informação estática. Quando a aplicação exibe mapas interativos, gráficos 2D/3D, animações, dentre outros recursos semalhantes pode ter certeza que o JavaScript está envolvido. Utilizando da lógica do cupcake é a terceira camada do bolo nas tecnologias padrões da web, das quais HTML e CSS compõem as primeiras camadas.
- HTML é a linguagem de marcação utilizada para estruturar e dar significado para o conteúdo web. Definindo parágrafos, cabeçalhos, tabelas de conteúdo, ou inserindo imagens e vídeos na página.
- CSS é a linguagem de regras de estilo utilizada para aplicar estilo ao conteúdo HTML. Definindo cores de fundo e fontes, e posicionando o conteúdo em múltiplas colunas.
- JavaScript é a linguagem de programação que permite criar conteúdo que se atualiza dinamicamente, controlar múltimídias, imagens animadas dentre outras ações.
Exemplo de código vulnerável a XSS
<?php $search = $_GET['q']; echo "No results were found for " . $search; ?>
Acima é possível notar um trecho de código vulneravel a XSS, uma vez que não existe a validação do parâmetro q
recebido via GET.
Impacto do XSS
- Redirecionar usuários para sites maliciosos;
- Capturar as teclas digitadas pelos usuários;
- Acessar o histórico do navegador dos usuários e o conteúdo da área de transferência;
- Executar exploits baseados em navegador da Web (por exemplo, travar o navegador);
- Obter as informações de cookies do usuário;
- Roubar o token de sessão de login, permitindo que o invasor interaja com o aplicativo como a vítima sem ter posse de sua credencial;
- Forçar o usuário a enviar solicitações controladas pelo invasor a um servidor;
- Mudar o conteúdo de uma página;
- Enganar a vítima para que divulgue sua senha para o aplicativo ou outros aplicativos;
- Infectar a vítima com outro código malicioso usando uma vulnerabilidade no próprio navegador da Web, possivelmente assumindo o computador da vítima.
Tipos de ataque
Existem três tipos de ataques Cross-Site Script, e apesar de terem semelhanças entre si seu nível de abrangência e periculosidade são bem diferentes. São eles:
XSS Reflected (XSS Refletido)
XSS refletido é a forma mais comum e mais simples dos três ataques de XSS. Ele é o mais fácil de executar e o mais fácil para ser detectado. Na verdade, é o único tipo que pode ser identificado.
Também conhecido como ataque não persistente exige que as vítimas cliquem em links maliciosos já preparados com o script do atacante. O navegador da vítima envia a solicitação carregada para o servidor do site e ela é “refletida” para a vítima por meio de uma página infectada.
O hacker não precisa violar o site em si, apenas convencer as vítimas a clicar em links infectados. Tornando o ataque uma mistura de engenharia social e sorte.
Um exemplo muito comum desse tipo de ataque são nos campos de busca de sites, onde um usuário informa alguma informação para a pesquisa e essa informação será exibida na página, caso a aplicação não faça o tratamento correto desse dado inserido, um atacante poderá adicionar um Javascript nesse campo de busca ocorrendo a execução desse código.
XSS Stored (XSS Armazenado)
O XSS armazenado supera a limitação dos ataques de XSS refletido, que necessitam ser iniciados ativamente toda vez por meio de um link malicioso. O XSS armazenado permite que o atacante injete permanentemente scripts direto no site, infectando cada usuário que o acessa. Por isso, ele também é conhecido como ataque persistente de XSS.
Imagine que uma aba de contato/comentários de um site não faça o tratamento correto das mensagens inseridas pelos usuários. Caso um atacante insira um código malicioso nesses comentários, esse código será salvo e executado no navegador de todos que acessarem a página.
Os ataques de XSS armazenado são mais complexos do que os refletidos, uma vez que o atacante precisa identificar um site com:
- Tráfego suficiente para valer o ataque;
- Uma vulnerabilidade de segurança que possa ser aproveitada por ataques de XSS armazenado.
Uma vez identificando o cenário perfeito um cibercriminoso será capaz de afetar um número muito maior de vítimas. Qualquer pessoa que visualize um site infectado receberá os scripts maliciosos no navegador e, quando o script é executado, os caracteres que o compõem não são mostrados em texto plano na página compilada. Por esse motivo, o XSS armazenado é quase impossível de detectar. Não há sinais de alerta que levantam suspeitas.
XSS DOM Based (XSS Baseado em DOM)
O XSS baseado em DOM (Document Object Model, ou “modelo de objeto de documento”) se consolida quando o agente malicioso modifica a interação entre o navegador e os sites que o usuário acessa, alterando a maneira que a vítima reage aos dados que são enviados. Enquanto os ataques de XSS refletido e armazenado afetam o HTML do lado do servidor, os ataques XSS baseados em DOM ignoram isso e se concentram exclusivamente na atividade do navegador.
Uma vez que um cibercriminoso consegue interceptar o processo em que o JavaScript do lado do cliente transmite seus dados ao aplicativo Web, ele poderá alterar a maneira que o aplicativo funciona no seu navegador.
Como se proteger (Cliente)
- Desativar os scripts em páginas em que eles não são necessários ou desativá-los completamente;
- Evitar clicar em links de e-mails ou postagens suspeitas em painéis de mensagens;
- Acessar sites diretamente digitando o URL em seu navegador, em vez de por meio de uma fonte ou link de terceiros;
- Manter o software atualizado para se beneficiar das últimas correções de bugs e patches de segurança. Atualizar regularmente o software reduzirá significativamente as vulnerabilidades que deixam um site ou aplicativo vulneráveis a ataques de XSS;
- Fazer a auditoria de aplicativos para determinar quais são necessários e quais raramente são usados.
Como se proteger (Servidor)
Os ataques que estão atrelados a categoria A03:2021-Injection acontecem por uma não sanitização das informações que são enviadas para o servidor, tanto referente a entrada de dados pelos usuários quanto no retorno destes dados no servidor. Existem inúmeras formas de tratar a entrada e saída de informações, a OWASP sugere bibliotecas que provém a sanitização de códigos HTML para linguagens PHP http://htmlpurifier.org/, JavaScript https://github.com/ecto/bleach e Python https://pypi.org/project/bleach/.
Outras formas de prevenção:
- Nunca utilize eval();
- Adicione cabeçalhos de segurança contra XSS
X-XSS-Protection: 1; mode=block
Ativa a proteção no navegadorX-Content-Type-Options: nosniff
Evita que código JavaScript seja inserido em imagens ou atributos de elementos.Content-Security-Policy: script-src
O mais importante, que evita praticamente toda entrada XSS em potencial.
- Adicione as flags HttpOnly e Secure nos cookie de sessão