Sep 10, 2022 | web

Cross-Site Scripting (XSS)

Kirito

Hacker

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 navegador
    • X-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

Support us

Hacking Force is a community focused on spreading knowledge about technology and cyber security, offering a way for people to rise. We are grateful for being supported by people with the same point of view. If you indentify with it, then consider joining us.

contact@hackingforce.com.br

Principal Sponsors

nowcy

Blog Hacking Force © 2024