Introducing G2.ai, the future of software buying.Try now

O que é Cross-Site Scripting? Como prevenir ataques XSS

28 de Julho de 2023
por Soundarya Jayaraman

Quando pensamos em ciberataques, pensamos em vazamentos de dados, vírus e malware, mas você já ouviu falar de cross-site scripting, também conhecido como ataques XSS? Provavelmente não. Mesmo sendo uma das ameaças mais notórias e comuns em aplicativos web que usamos hoje. Então, o que é isso?

Aplicativos web geralmente permitem que os usuários interajam com eles enviando dados através de formulários ou outros campos de entrada. Hackers podem explorar essa vulnerabilidade para injetar scripts maliciosos se o aplicativo não validar e sanitizar adequadamente essa entrada do usuário.

Ataques XSS representam riscos significativos, incluindo perda financeira, vazamentos de dados, sistemas comprometidos, reputações danificadas e consequências legais. Desenvolvedores e proprietários de sites devem implementar medidas de segurança robustas e configurar ferramentas como firewalls de aplicativos web e software de gerenciamento unificado de ameaças para prevenir vulnerabilidades XSS.

Como funciona o cross-site scripting (XSS)?

Vamos começar aprendendo sobre a política de mesma origem para entender como funcionam os ataques de cross-site scripting.

Política de mesma origem

A política de mesma origem é um mecanismo de segurança embutido nos navegadores web que previne o roubo de dados. Por exemplo, o conteúdo de um site recebe permissão para usar cookies e outros recursos no navegador web de um usuário. De acordo com a política de mesma origem, o conteúdo de qualquer URL com o mesmo identificador uniforme de recurso (URI), nome de host e número de porta também compartilha essas permissões. Se esses três atributos forem diferentes, o site precisa de permissão separada.

Quando a política de mesma origem não é rigorosamente aplicada usando medidas de segurança web como validação e sanitização da entrada do usuário, cria-se vulnerabilidades em aplicativos web.

Definição de validação e sanitização em segurança de aplicativos web

  • Validação é o processo de verificar e certificar que a entrada do usuário atende aos critérios esperados definidos pelo aplicativo. Envolve verificar o formato, comprimento, tipo e intervalo dos dados de entrada para prevenir que valores maliciosos ou não intencionais sejam aceitos.
    Por exemplo, se um aplicativo web espera uma entrada numérica para um campo específico, a validação garante que a entrada fornecida seja um número e que esteja dentro do intervalo permitido.
  • Sanitização ou codificação de saída é o processo de limpar ou modificar a entrada do usuário para remover qualquer conteúdo potencialmente prejudicial. Envolve aplicar técnicas de filtragem específicas para garantir que o conteúdo gerado pelo usuário seja tratado como texto simples e não executado como código pelos navegadores.

Ataques de cross-site scripting geralmente usam JavaScript, mas qualquer linguagem de programação do lado do cliente, como PHP, linguagem de marcação de hipertexto (HTML) e .NET, também funcionam.

A anatomia de um ataque de cross-site scripting

Vamos passar por um exemplo para entender como funciona um ataque XSS:

Digamos que há um aplicativo web com uma seção de comentários onde os usuários podem postar mensagens que são exibidas no site. No entanto, a seção de comentários do aplicativo tem uma vulnerabilidade que não valida ou sanitiza adequadamente a entrada do usuário antes de ser exibida.

Um atacante identifica isso e explora a falha injetando código JavaScript prejudicial em uma das seções de comentários das páginas web. Eles postam um comentário com o seguinte conteúdo:

<script>

alert('Este é um ataque malicioso de cross-site scripting (XSS), cuidado!');

</script>

Agora, em vez de tratar o código injetado como texto simples, o aplicativo desprotegido exibe o comentário no site sem a codificação ou validação adequada. Quando outros usuários visitam a página web que tem esse comentário, seus navegadores interpretam o código JavaScript injetado como parte do conteúdo do site e o executam.

Como resultado, uma caixa de alerta aparece, exibindo a mensagem, "Este é um ataque malicioso de cross-site scripting (XSS), cuidado!"

Se isso não fosse ruim o suficiente, as consequências do ataque poderiam ser muito mais graves, dependendo das intenções do cibercriminoso. Agentes de ameaça podem aproveitar o script executado para roubar informações sensíveis, redirecionar usuários para sites de phishing, registrar pressionamentos de teclas, capturar envios de formulários ou comprometer o sistema baixando e executando malware.

As consequências dos ataques de cross-site scripting (XSS)

Os atacantes podem usar ataques XSS para

  • Redirecionar usuários para um site prejudicial
  • Obter pressionamentos de teclas e acessar o histórico do navegador e conteúdos da área de transferência
  • Infectar o dispositivo do usuário com outro malware ou até mesmo assumir o controle do computador da vítima
  • Roubar o token de sessão de login do usuário, imitar um usuário legítimo e interagir com o aplicativo
  • Forçar o usuário a enviar solicitações controladas pelo atacante para o servidor web e lançar ataques de negação de serviço
  • Alterar o conteúdo de um aplicativo web e usá-lo para injetar anúncios maliciosos

Quer aprender mais sobre Firewalls de Aplicações Web (WAF)? Explore os produtos de Firewall de Aplicação Web (WAF).

Ataque XSS vs. CSRF vs. Injeção SQL

É fácil confundir XSS com injeção SQL e falsificação de solicitação entre sites (CSRF) porque todos os três exploram vulnerabilidades de aplicativos web. No entanto, são ameaças de segurança web distintas e variam em sua natureza e no tipo de ataques que geram.

  • Ataques XSS injetam códigos maliciosos em um site confiável e fazem com que o navegador web do usuário o execute inadvertidamente.
  • Falsificação de solicitação entre sites engana um usuário autorizado usando técnicas de engenharia social como phishing para fazer solicitações maliciosas em nome do usuário.
  • Ataques de injeção SQL injetam código SQL malicioso na camada de banco de dados de um aplicativo web para acessar dados que não deveriam ser exibidos.

XSS vs CRSF vs SQL injection

História dos ataques XSS

As vulnerabilidades XSS remontam aos primeiros dias da internet. À medida que as páginas web se tornaram mais interativas com o lançamento do JavaScript em 1995, os desenvolvedores começaram a aceitar a entrada do usuário através de formulários e outros elementos cooperativos nas páginas web.

No entanto, os desenvolvedores não validaram e sanitaram efetivamente a entrada do usuário e expuseram vulnerabilidades que os atacantes poderiam – e fizeram – explorar. Uma equipe de engenheiros de segurança da Microsoft cunhou pela primeira vez o termo "cross-site scripting" para esses ataques, e com o tempo, sua definição se expandiu para incluir outros tipos de ataques de injeção de código.

Antes de 2005, a maioria dos pesquisadores de segurança se concentrava em outras ameaças de segurança web como ataques de estouro de buffer, worms, botnets ou vírus. Isso foi até o infame worm Samy no MySpace infectar mais de um milhão de usuários em 24 horas usando um ataque XSS, demonstrando seu potencial de escala e impacto.

Após o golpe devastador, a comunidade de cibersegurança fez esforços louváveis para abordar as vulnerabilidades XSS. Mas mesmo assim, continua a ser uma ameaça persistente à segurança dos aplicativos web. Grandes sites como Orkut, Youtube, Yahoo Mail, eBay, Amazon, Twitter e Facebook enfrentaram ataques XSS ao longo dos anos.

3 principais tipos de ataques XSS com exemplos

Os ataques XSS são geralmente classificados em três categorias principais:

  • Ataques de cross-site scripting armazenados (persistentes)
  • Ataques de cross-site scripting refletidos (não persistentes)
  • Ataques XSS baseados em modelo de objeto de documento (DOM)

Stored XSS vs Reflected XSS vs DOM-based XSS

1. Ataques XSS armazenados (persistentes)

O cross-site scripting armazenado ou persistente ocorre quando um script malicioso é armazenado permanentemente no servidor do aplicativo web alvo e apresentado aos usuários que acessam uma página específica. Geralmente acontece quando a entrada do usuário não é devidamente validada e sanitizada antes do armazenamento.

O script prejudicial é executado automaticamente quando outros usuários carregam a página injetada. Como a carga útil é armazenada pelo servidor web e depois incorporada em uma página HTML fornecida ao usuário, isso é chamado de ataque XSS armazenado.

O exemplo mais comum de ataque XSS armazenado são códigos HTML não sanitizados que são postados como mensagens em fóruns online, registros de visitantes ou campos de comentários. Qualquer usuário que clique na página onde o comentário aparece é afetado pelo ataque, sem precisar rolar até a seção de comentários ou mesmo clicar nela.

Exemplo recente de ataque XSS armazenado

Em fevereiro de 2023, a equipe de segurança do WordPress descobriu que atacantes haviam explorado uma vulnerabilidade XSS armazenada em um dos plugins do WordPress chamado “Beautiful Cookie Consent” que tinha mais de 40.000 instalações. Pesquisadores descobriram que hackers poderiam adicionar JavaScript inseguro a um site usando o cookie para redirecionar usuários.

2. Ataques XSS refletidos (não persistentes)

Os desenvolvedores de aplicativos têm que ficar atentos a esses com mais frequência. Em um ataque XSS refletido, um usuário fornece uma entrada para um aplicativo, e então, o ataque não persistente faz com que scripts do lado do servidor usem esses dados imediatamente. Os scripts utilizam essa informação para mostrar ao usuário uma página web, mas a entrada não foi devidamente sanitizada.

É chamado de ataque de cross-site scripting refletido porque o servidor ecoa imediatamente a carga maliciosa como uma resposta a uma solicitação HTTP da vítima desavisada.

Por exemplo, um aplicativo web confiável chamado mybank.com tem um recurso de pesquisa. Ele exibe a consulta de pesquisa dos usuários na página de resultados sem validação adequada e codificação de saída. Um atacante poderia construir o seguinte URL malicioso para explorar essa vulnerabilidade:

https://mybank.com/search?q=<script>alert(‘/*script prejudicial roubando sessão do usuário’);</script>

O atacante então entregará esse URL de aparência legítima aos usuários via e-mail ou outros sites neutros. Pensando que é do site do banco, um dos usuários clica no link criado, e o script do hacker é executado, e a vítima não percebe.

Exemplo recente de ataque XSS refletido

Em maio de 2023, pesquisadores encontraram vulnerabilidades XSS refletidas severas em dois dos plugins WordPress mais comuns usados para criar campos personalizados em sites WordPress. Os atacantes poderiam potencialmente explorar essa instabilidade para fazer um ataque de escalonamento de privilégios enganando os usuários privilegiados a clicar em um caminho de URL malicioso.

3. Ataques XSS baseados em DOM

Os ataques XSS baseados em DOM foram definidos pela primeira vez pelo pesquisador de segurança de aplicativos web Amit Klein em 2005. O modo de objeto de documento é a representação orientada a objetos de uma página web que suporta conteúdo dinâmico. Os ataques XSS baseados em DOM acontecem quando hackers aproveitam vulnerabilidades do DOM. A página web não muda, mas o código do lado do cliente com a carga prejudicial no DOM é executado no navegador do usuário.

Os ataques XSS baseados em DOM ocorrem inteiramente no lado do cliente, em contraste com os ataques XSS armazenados e refletidos, que acontecem devido a pontos fracos no lado do servidor.

Exemplo recente de ataque XSS baseado em DOM

Em novembro de 2022, o pesquisador de segurança Justin Steven, encontrou uma vulnerabilidade em um widget de marketing fornecido pela Gartner que poderia levar a ataques XSS baseados em DOM. Qualquer site que usasse o widget poderia ser usado para executar código JavaScript arbitrário no navegador de um usuário usando essa vulnerabilidade por cibercriminosos.

Outros tipos de ataques XSS

Além das três principais categorias de ataques XSS mencionadas acima, várias outras variações de ataques XSS exploram vulnerabilidades específicas.

Self-XSS

O self-cross-site scripting é mais um ataque de engenharia social em que o intruso engana o usuário para colar um JavaScript ruim em seu próprio navegador por si mesmo. Eles geralmente atraem as vítimas postando uma mensagem que diz que o usuário poderá receber alguma recompensa copiando e executando determinado código. Na realidade, o código permite que o atacante sequestre a conta da vítima.

Mutation XSS

O Mutation XSS ou mXSS é possível devido a uma vulnerabilidade na propriedade DOM chamada innerHTML e a forma como o código HTML é analisado ao entregar conteúdo dinâmico. Hackers injetam códigos maliciosos especialmente elaborados que parecem seguros, mas se transformam e se tornam vetores de ataque XSS no navegador.

Blind XSS

Uma variante dos ataques XSS persistentes, os ataques de cross-site scripting cegos resultam em cargas maliciosas sendo armazenadas em um servidor de aplicativo web apenas para serem executadas pelo usuário do backend ou pelo administrador do aplicativo.

7 medidas preventivas contra ataques XSS

As vulnerabilidades continuam a existir em muitos de nossos aplicativos web, mas os pesquisadores propuseram várias soluções para XSS, desde análise estática simples até mecanismos de proteção em tempo de execução complexos. Algumas delas são discutidas aqui.

1. Frameworks web e bibliotecas de codificação segura

Frameworks web modernos e bibliotecas de codificação segura fornecem uma maneira padrão de desenvolver e implantar aplicativos web na internet sem falhas de design e implementação relacionadas à segurança. Um desenvolvedor pode não ter todos os recursos para implementar adequadamente recursos de segurança ao construir um aplicativo do zero. Trabalhar com bibliotecas de codificação segura e ferramentas de framework web ajuda a evitar quaisquer lacunas de segurança ou erros no código.

2. Validação de entrada e codificação de saída

A validação de entrada e a codificação de saída são técnicas de defesa chave contra ataques XSS. A validação de entrada garante que o conteúdo gerado pelo usuário esteja no formato esperado e rejeita ou neutraliza qualquer dado que não corresponda aos critérios.

A codificação de saída sanitiza quaisquer caracteres especiais na entrada gerada pelo usuário desconhecido para que sejam interpretados como texto simples. Isso confirma que o navegador web não registra a entrada do usuário como marcação ou código JavaScript sob quaisquer circunstâncias. Ambas as técnicas previnem vulnerabilidades de segurança que o XSS pode explorar.

3. Sanitização de HTML

Vários desenvolvedores de aplicativos web usam editores do tipo "o que você vê é o que você obtém" (WYSIWYG) para criar conteúdo de texto e vídeo para suas páginas web em linguagem HTML. Nesses casos, torna-se importante sanitizar os códigos HTML para proteger contra ataques XSS.

A sanitização de HTML permite tags HTML básicas como <b>, <i>, <u>, <em>, e <strong>. Ao mesmo tempo, remove tags mais avançadas como <script>, <object>, <embed>, e <link> que podem ser usadas para injetar códigos maliciosos.

A Open Source Foundation for Application Security (OWASP), uma comunidade de segurança líder, recomenda o uso de DOMPurify para sanitização de HTML.

4. Segurança de cookies

Como o XSS e outros ciberataques visam cookies web, é importante implementar a segurança adequada de cookies. Você pode fazer isso usando atributos de cookies como a flag "secure" e "HttpOnly" para afirmar que os cookies são transmitidos apenas por meio de uma conexão segura.

5. Política de segurança de conteúdo (CSP)

A CSP é uma camada adicional de defesa para proprietários de sites contra XSS e outras ameaças cibernéticas como clickjacking e ataques de injeção de código. Ela define e restringe as fontes de onde os navegadores web podem carregar conteúdo, como scripts, folhas de estilo ou imagens, e os URLs de onde podem ser carregados. A CSP impede que códigos maliciosos sejam executados especificando fontes confiáveis e bloqueando ou limitando o conteúdo.

6. Testes de segurança

Testes de segurança regulares, incluindo varredura de vulnerabilidades e testes de penetração, classificam e abordam vulnerabilidades XSS. Revisões de código manuais, scanners de vulnerabilidade, e ferramentas de teste de software com automação podem fazer parte de sua rotina para detectar fraquezas potenciais e medir a eficácia das técnicas preventivas contra XSS.

Explore as 5 melhores ferramentas de teste de penetração e veja quais melhor atendem às suas necessidades!

7. Firewalls de aplicativos web (WAF)

Os WAFs são o software de cibersegurança mais comum para proteger aplicativos web contra XSS e injeções SQL. Eles monitoram e filtram o tráfego de entrada e empregam análise para bloquear quaisquer solicitações anormais ao aplicativo e negar a injeção de scripts maliciosos.

Top 5 ferramentas de firewall de aplicativos web (WAF):

*Acima estão as cinco principais soluções WAF do Relatório Grid® de Verão de 2023 da G2.

Software de segurança como plataformas de gerenciamento unificado de ameaças (UTM) também protege efetivamente contra ataques XSS integrando múltiplos recursos de segurança.

Clique para conversar com o Monty AI da G2

Cross-site scripting: Perguntas frequentes (FAQs)

1. O que é cross-site scripting?

Cross-site scripting (XSS) ataca vulnerabilidades de segurança de aplicativos web que permitem que hackers injetem scripts maliciosos em páginas web. Esses scripts roubam informações sensíveis, manipulam interações do usuário ou entregam malware.

2. Qual linguagem é usada em ataques de cross-site scripting?

Qualquer linguagem de programação do lado do cliente, como Javascript, HTML, VBScript ou Flash, pode ser usada para escrever códigos maliciosos em ataques de cross-site scripting. Mas Javascript e HTML são os mais comumente usados para ataques XSS.

3. Quais são os três tipos de ataques de cross-site scripting?

Três tipos principais de XSS são XSS armazenado, XSS refletido e XSS baseado em DOM.

4. Qual é a diferença entre XSS e CSRF?

XSS injeta e executa scripts maliciosos no navegador de um usuário, enquanto CSRF se concentra em explorar a confiança colocada na sessão autenticada de um usuário para realizar ações não autorizadas em seu nome.

5. Qual é a diferença entre XSS e injeção SQL?

Os ataques XSS têm como alvo os usuários do site. A injeção SQL se concentra nos mecanismos de armazenamento e recuperação de dados do site.

Defendendo o reino digital

Hoje, o mundo funciona com aplicativos. O cross-site scripting continua sendo uma vulnerabilidade de segurança perigosa. Ele expõe os usuários da web a acesso remoto, roubo de dados e perdas monetárias. Mas com a conscientização e medidas preventivas adequadas, seu impacto pode ser mitigado se você puder ajudar a criar uma web mais segura se implementar as medidas preventivas compartilhadas aqui.

Quer escrever códigos mais seguros? Aprenda sobre software de treinamento de código seguro e como ele ajuda desenvolvedores e programadores.

Soundarya Jayaraman
SJ

Soundarya Jayaraman

Soundarya Jayaraman is a Content Marketing Specialist at G2, focusing on cybersecurity. Formerly a reporter, Soundarya now covers the evolving cybersecurity landscape, how it affects businesses and individuals, and how technology can help. You can find her extensive writings on cloud security and zero-day attacks. When not writing, you can find her painting or reading.