BLOG

Segurança em Aplicações Web – Entenda e Previna XSS e SQL Injection

Segurança em Aplicações Web – Entenda e Previna XSS  e SQL Injection
Redação CECyber

O ano era 2018 e a empresa British Airways enfrentava na pele os prejuízos de um ataque cross-site scripting (XSS), através de uma modificação no script para enviar dados do cliente para um servidor malicioso, que usava um nome de domínio semelhante ao da organização. O resultado foi a execução skimming de cartão de crédito em 380.000 transações de reserva antes que a violação fosse descoberta.

 

Os ataques XSS compõem a perigosa e persistente lista de injeções maliciosas para web, ameaçando a segurança e integridade dos sites e aplicações. Ao longo deste artigo, apresentaremos uma visão geral das vulnerabilidades XSS e SQL Injection, suas consequências, exemplos de ataques reais e, claro, dicas para detectar e prevenir essas falhas.

 

Continue lendo para descobrir.

O que são e como funcionam os ataques XSS?

Os ataques de Cross-Site Scripting (XSS) são um tipo de injeção em que o invasor injeta scripts maliciosos em sites legítimos, fazendo com que um aplicativo da web envie código malicioso – geralmente na forma de um script do lado do navegador – para um usuário final. Grande parte do sucesso e da “facilidade” desse tipo de ataque ocorre porque as falhas que permitem essas execuções são bem difundidas e podem ocorrer em qualquer lugar em que um aplicativo da web utilize a entrada de um usuário na saída gerada sem validá-la ou codificá-la.

 

Outro ponto de atenção é que, segundo a OWASP, o navegador do usuário final não tem como saber que o script não é confiável e o executará, pois entende que o script veio de uma fonte confiável. O script malicioso pode, então, acessar quaisquer cookies, tokens de sessão ou outras informações confidenciais mantidas pelo navegador e usadas com esse site. Preocupantemente, esses scripts podem até mesmo reescrever o conteúdo da página HTML.

 

Um exemplo de ataque XSS é a utilização do script em atributos, onde as tags serão usadas na execução, por exemplo: <body onload=alert(‘test1’)>ou outros atributos como: onmouseover, onerror.

ao passar o mouse

<b onmouseover=alert(‘Wufff!’)>click me!</b>

em caso de erro

<img src=”http://url.to.file.which/not.exist” onerror=alert(document.cookie);>

 

Os exemplos parecem simples e inofensivos, mas um hacker habilidoso pode utilizar esses tipos de comandos para direcionar o usuário para um outro site ou coletar dados do teclado sem que ele perceba. Imagine uma mensagem de alerta do seu banco aparecendo em sua tela solicitando seus dados de acesso? Em um ataque XSS isso é possível.

Tipos de ataques Cross-Site Scripting (XSS)

Conheça três tipos de ataques XSS classificados pelo OWASP:

 

Ataques XSS refletidos

São ataques em que o script injetado é refletido pelo servidor web, como em uma mensagem de erro, resultado de pesquisa ou qualquer outra resposta que inclua parte ou toda a entrada enviada ao servidor como parte da solicitação. Esses ataques são entregues às vítimas por outros meios, como uma mensagem de e-mail ou outro site.

 

Quando o usuário é enganado ao clicar em um link malicioso, enviar um formulário especialmente criado ou até mesmo navegar em um site, o código injetado é transmitido para o site vulnerável, que reflete o ataque de volta para o navegador do usuário. O navegador, então, executa o código porque ele acredita que veio de um servidor “confiável”.

 

Ataques XSS armazenados

Já os ataques armazenados são aqueles em que o script injetado é armazenado permanentemente nos servidores alvo, como em um banco de dados, fórum de mensagens, log de visitantes, campo de comentários, etc. A vítima, então, recupera o script do servidor quando solicita as informações armazenadas. O XSS armazenado também é algumas vezes chamado de XSS persistente ou tipo II.

 

Ataques XSS baseados em DOM

No XSS baseado em DOM, o script malicioso é executado diretamente no lado do cliente, manipulando a estrutura do DOM no navegador do usuário. Isso ocorre quando o JavaScript do próprio site vulnerável modifica o DOM com dados de entrada não validados, permitindo que o código malicioso seja injetado e executado. Como o ataque acontece inteiramente no navegador, ele não requer uma solicitação para o servidor, o que pode dificultar a detecção desse tipo de XSS.

Vejamos agora a tão popular SQL Injection.

SQL Injection: o que é e como funciona?

A injeção de SQL é uma vulnerabilidade de segurança que ocorre quando um invasor insere ou “injeta” o código SQL malicioso em uma consulta SQL por meio de uma entrada de dados fornecida por um usuário, como campos de formulário, URLs ou cabeçalhos HTTP.

 

Quando bem-sucedido, um exploit de injeção de SQL é capaz de ler dados confidenciais do banco de dados, modificar dados (Inserir/Atualizar/Excluir), executar operações de administração (como desligar o DBMS), recuperar o conteúdo de um determinado arquivo presente no sistema de arquivos do DBMS e, em alguns casos, emitir comandos para o sistema operacional.

 

Ao executar um ataque de injeção SQL o invasor pode falsificar identidades, causar problemas de rejeição e até assumir a posição de administrador do servidor de banco de dados.

 

Imagine uma aplicação que execute a seguinte consulta SQL para autenticar um usuário:

 

Imagine uma aplicação que execute a seguinte consulta SQL para autenticar um usuário:

 

Se a entrada fornecida pelo usuário for algo como:

 

Se a entrada fornecida pelo usuário for algo como:

 

O código SQL gerado se tornaria:

 

O código SQL gerado se tornaria:

 

Neste caso, o condicional OR ‘1’=’1′ sempre será verdadeiro, permitindo que o invasor obtenha acesso sem fornecer credenciais corretas.

 

Assim como os exemplos de XSS, estes exemplos parecem simples, porém, com um ataque de Injeção de código SQL, um hacker pode roubar dados confidenciais, invadir sistemas, alterar ou até mesmo excluir dados. Seria muito grave o prejuízo para uma empresa que teve seus lançamentos de pedidos alterados e dados de clientes roubados.

Tipos de ataques de injeção SQL

Injeção SQL cega

Esse é um tipo de ataque de injeção de SQL que faz perguntas verdadeiras ou falsas ao banco de dados e determina a resposta com base na resposta do aplicativo. É frequentemente usado quando o aplicativo da web é configurado para mostrar mensagens de erro genéricas, mas não mitigou o código vulnerável à injeção de SQL.

 

Injeção de ORM

A sigla ORM significa Object Relational Mapping (ORM) e define um ataque que utiliza SQL Injection contra um modelo de objeto de acesso a dados gerado por ORM. No sentido do teste, esse ataque é virtualmente idêntico a um ataque de SQL Injection. No entanto, a vulnerabilidade de injeção existe no código gerado pela camada ORM.

Quais são as consequências dos ataques XSS e injeção SQL?

De maneira prática, além roubar e modificar dados, ataques como XSS e de injeção SQL ameaçam a segurança das aplicações, podendo causar sérios problemas, como:

  • Modificação do conteúdo de uma página ou site, levando-o a realizar ações indesejadas, como clicar em links ou fornecer dados.
  • Destruição do banco de dados, através da execução de comandos de DROP, eliminando tabelas inteiras ou até o banco de dados completo, o que pode causar uma interrupção massiva no serviço.
  • Exfiltração de credenciais, utilizando-as para escalar seus privilégios no sistema e obtendo acesso administrativo a outras partes da aplicação.

Freepik & eBay: ameaças de códigos na vida real

A empresa British Airways não foi a única vítima de vulnerabilidades em aplicações web. Em 2020, o famoso site de banco de imagens Freepik, sofreu um ataque de injeção SQL contra o site, onde os invasores roubaram e-mails e hashes de senhas de 8,3 milhões de usuários.

 

Já o ataque a eBay foi alvo de uma vulnerabilidade XSS grave entre 2015 e 2016. Isso aconteceu porque o site usava um parâmetro “url” que redirecionava os usuários para diferentes páginas na plataforma, mas o valor do parâmetro não era validado, o que permitia aos invasores a injeção de código malicioso em uma página.

 

O resultado da exploração da vulnerabilidade permitiu que invasores obtivessem acesso total às contas de vendedores do eBay, vendessem produtos com desconto e roubassem detalhes de pagamento.

Como prevenir ataques XSS e injeção SQL: boas práticas de codificação e ferramentas

Apesar das dificuldades e dos danos causados por essas ameaças, existem caminhos e boas práticas para detectar e preveni-las. Deixaremos a seguir alguns delas:

Boas práticas para prevenir XSS

Para evitar ataques de Cross-Site Scripting (XSS), é essencial sanitizar e validar as saídas. A sanitização “limpa” os dados antes de serem exibidos no HTML, convertendo caracteres especiais para evitar a execução de scripts maliciosos. Combinada com a validação das entradas, essa prática assegura que apenas conteúdos esperados sejam processados, reduzindo riscos de execução de código não autorizado.

 

Escape de saída (Output Encoding): qualquer dado não confiável que seja renderizado no HTML deve ser corretamente “escapado”. Para HTML, você deve transformar caracteres especiais (como <, >, “, ‘) em suas entidades HTML.

A ferramenta OWASP Java Encoder pode ajudar.

 

Validação das entradas do usuário: verifique se os dados estão no formato esperado (ex: strings, números etc.) e remova qualquer conteúdo malicioso. Bibliotecas como DOMPurify podem ser usadas para sanitizar conteúdo HTML e prevenir XSS em frameworks de JavaScript como React e Angular.

Boas práticas para prevenir injeção SQL

Uma defesa consistente contra SQL Injection começa com a sanitização e a validação das entradas. Ao garantir que os dados inseridos sigam o formato esperado e não contenham comandos maliciosos, reduz-se o risco de manipulação das consultas SQL. Esta abordagem, combinada com o uso de prepared statements, torna a aplicação mais resistente a ataques, ao bloquear tentativas de injeção de código diretamente no banco de dados.

 

Utilizar prepared statements (consultas parametrizadas): evite construir consultas SQL concatenando strings diretamente. Utilize prepared statements com bindings de parâmetros.

 

Minimize privilégios do usuário de banco de dados: o usuário da aplicação que interage com o banco de dados deve ter os menores privilégios possíveis. Por exemplo, usuários que realizam apenas consultas não devem ter permissões de escrita.

 

A ferramenta SQLMap pode ajudar no processo de detecção e exploração de falhas de injeção SQL. Temos um artigo completo com mais práticas e dicas para garantir a segurança das suas aplicações. Clique aqui para acessar.

 

Vulnerabilidades como a injeção de SQL e o cross-site scripting (XSS) continuam a ameaçar a segurança de dados e informações. É fundamental que desenvolvedores e profissionais de segurança se mantenham vigilantes, implementando medidas de proteção e utilizando frameworks seguros para garantir a integridade dos sites, domínios e dados das organizações.

 

Para conhecer outros temas relevantes da segurança cibernética, acesse os nossos outros artigos, clicando aqui.

Rolar para cima