O que é injeção SQL? Como prevenir ataques SQLi
Publicados: 2023-09-15Os aplicativos da Web potencializam nossa experiência on-line todos os dias. Nós nos conectamos, interagimos, compramos e assistimos a vídeos engraçados de gatos – tudo isso usando aplicativos da web. Eles fornecem serviços empresariais vitais e armazenam dados confidenciais, mas quanto mais usamos algo, mais sujeito ele se torna a ataques.
Um ataque cibernético a ser observado em aplicativos que exploram vulnerabilidades em linguagem de consulta estruturada (SQL) é a injeção de SQL comum e perigosa.
O que é injeção de SQL?
A injeção de SQL (SQLi) é uma técnica prejudicial de injeção de código que os invasores cibernéticos usam para explorar vulnerabilidades em aplicativos da web. Eles aproveitam os pontos fracos para obter acesso não autorizado, adicionando uma sequência de códigos maliciosos a uma consulta ao banco de dados.
Os ataques de injeção de SQL levam ao acesso indevido aos dados, manipulação, roubo de identidade, perdas financeiras, danos à reputação e consequências legais. Os desenvolvedores e organizações precisam compreender seus riscos e implementar medidas completas de segurança. Ferramentas como software de firewall de aplicativos da web (WAF) e software de análise forense digital são projetadas para proteger contra ataques de injeção de SQL. As empresas também podem contar com pacotes abrangentes de segurança de sites para proteger seus aplicativos.
Leia esta folha de dicas de injeção de SQL para saber como os ataques SQL são executados com exemplos, suas variações e como evitar tais ataques.
Por que os ataques de injeção de SQL são perigosos?
A injeção de SQL está na lista dos 10 principais riscos de segurança de aplicativos da Web do Open Worldwide Application Security Project (OWASP) há anos. Somente em 2022, o OWASP encontrou mais de 274.000 ocorrências de alguma forma de injeção nos aplicativos testados; A injeção de SQL e o cross-site scripting (XSS) foram os mais comuns.
Os invasores podem usar injeções de SQL para causar:
- Erros em aplicações web ao modificar ou excluir informações de um banco de dados.
- Violações de dados se hackers obtiverem acesso não autorizado a dados confidenciais armazenados em bancos de dados, como informações pessoais, registros financeiros ou senhas.
- Sistemas comprometidos ao acessar sistemas adicionais não autorizados que usam os mesmos bancos de dados compartilhados. Isso permite que os invasores aumentem seus ataques para outros sistemas na mesma rede ou executem negação de serviço distribuída (DDoS).
Estas ações destrutivas prejudicam irrevogavelmente as empresas. As ofensas comprometem a privacidade e a integridade dos dados, levando à perda da confiança do cliente e da reputação comercial. Também acrescenta um encargo financeiro para a empresa que lida com as consequências.
Exemplos reais de ataque de injeção SQL
Já se passaram mais de duas décadas desde que a injeção de SQL entrou em cena pela primeira vez. Vinte anos depois, isso permanece notório, como evidenciado pelos seguintes incidentes proeminentes de injeção de SQL.
- Heartland Payments Systems: Em 2008, a Heartland Payments Systems sofreu o que foi uma das maiores violações de dados da história, expondo mais de 130 milhões de detalhes de cartões de crédito e débito através de um ataque SQLi. Heartland pagou milhões em multas.
- Yahoo : Em 2012, um ataque de injeção de SQL comprometeu quase 5 milhões de detalhes de contas de usuários do Yahoo, incluindo endereços de e-mail e senhas.
- Freepik: Hackers roubaram e-mails e senhas de 8,3 milhões de usuários do Freepik e Flaticon em 2020 durante um ataque de injeção de SQL contra o site Flaticon da empresa.
- WooCommerce: O popular plugin WordPress corrigiu uma vulnerabilidade de injeção de SQL que expôs 5 milhões de sites ao roubo de dados.
- BillQuick: Os cibercriminosos exploraram uma vulnerabilidade cega de SQL na popular plataforma de cobrança para espalhar ransomware.
- MOVEit: Em maio de 2023, a gangue de ransomware Cl0p usou uma vulnerabilidade de injeção de SQL na ferramenta de software de transferência gerenciada de arquivos MOVEit, afetando mais de 1.000 organizações e pelo menos 60 milhões de indivíduos, tornando-se a maior violação de dados do ano até agora.
Como funciona um ataque de injeção SQL?
Vejamos os conceitos básicos de bancos de dados e consultas SQL que usamos em aplicativos da web modernos. Isso nos ajudará a entender melhor o funcionamento interno da injeção de SQL.
Todos os sites usam bancos de dados relacionais, também chamados de bancos de dados SQL, para armazenar dados sobre seus usuários e aplicativos. Podem ser informações do usuário, credenciais de login, informações de pagamento ou qualquer outra coisa sobre a empresa. Veja um site de comércio eletrônico, por exemplo. Ele armazena dados de produtos, contas de usuários, dados de pedidos e informações de pagamento em seu banco de dados.
Os sites então pegam os dados desses bancos de dados e entregam conteúdo ou serviços específicos aos usuários. Esse processo acontece graças ao SQL, linguagem de programação padronizada utilizada para gerenciamento de bancos de dados. Sempre que você precisa obter algo de um aplicativo, por exemplo, seu histórico de compras, você está, na verdade, fazendo uma solicitação ao banco de dados usando consultas SQL, um comando que instrui um banco de dados a executar uma ação específica.
Na tentativa de simplificar as interações na Web, muitos sites permitem que os usuários insiram dados para fazer consultas SQL. Isso pode incluir termos de pesquisa, nomes de usuário ou detalhes de pagamento.
Considere o exemplo do site de comércio eletrônico. Uma consulta SQL simples para exibir seu histórico de pedidos do banco de dados com a tabela "pedidos" (o) e uma tabela "produtos" (p) será a seguinte:
SELECIONE o.order_id, o.order_date, p.product_name, p.price
A PARTIR DE pedidos o
JOIN produtos p ON o.product_id = p.product_id
ONDE o.user_id = 12345;
Este código SQL escolhe o ID do pedido e a data da tabela de pedidos, junto com o nome do produto e o preço da tabela de produtos para o ID DE USUÁRIO 12345 do banco de dados do site. Normalmente, o ID será baseado na entrada do usuário. Os problemas surgem quando a entrada não é verificada e controlada adequadamente. Os invasores exploram essa vulnerabilidade para realizar um ataque de injeção de SQL.
Veja como isso normalmente se desenrola.
- Identificação de campos de entrada vulneráveis: os invasores começam encontrando campos de entrada no aplicativo Web onde podem potencialmente injetar código malicioso. Eles enviam valores diferentes e veem como o aplicativo responde. para descobrir se. Se o aplicativo não validar ou higienizar adequadamente a entrada do usuário, o aplicativo processará sua entrada como código SQL. Esta vulnerabilidade potencial é usada para injeção de código.
- Injeção de código via entrada do usuário: Depois de entender como o aplicativo lida com a entrada, os invasores constroem uma carga útil, que é um código SQL malicioso que tira vantagem da vulnerabilidade. Isso inclui adicionar caracteres de controle SQL como aspas simples ('), aspas duplas (“) ou igual (=) para alterar a estrutura da consulta SQL. Usar esses caracteres de controle com comandos SQL comuns como SELECT e FROM permite que invasores acessem ou recuperem dados do servidor de banco de dados.
Eles então enviam entradas especialmente criadas junto com solicitações legítimas, enganando o aplicativo e fazendo-o tratar o código obscuro como uma parte legítima da consulta. - Execução: O banco de dados, sem saber do ataque, processa a consulta e executa o código injetado como se fosse uma solicitação legítima.
- Exploração: Dependendo da intenção do invasor, o código SQL injetado pode recuperar dados confidenciais, modificar ou excluir informações ou até mesmo conceder acesso não autorizado. Isso compromete a segurança do aplicativo, expondo potencialmente informações confidenciais.
Exemplo de injeção SQL
Considere um aplicativo da web que usa um parâmetro de URL para buscar detalhes do produto com base em um ID do produto, como este:
http://example.com/products?id=1
Um invasor pode tentar injetar código SQL malicioso para causar um erro e recuperar informações como esta: http://example.com/products?id=1' OR 1=1; –
Se o aplicativo não validar e limpar adequadamente a entrada do usuário, a consulta SQL poderá ser manipulada da seguinte forma:
SELECIONE * DOS produtos ONDE OU 1=1; - - ';
Nesse caso, a consulta original foi projetada para recuperar um produto com ID 1, mas a entrada do invasor modifica a consulta para retornar todos os produtos devido à adição de 1=1 e ao hífen duplo anexado (- -). Ele anula a aspa única de fechamento original e leva a consequências, exibindo todos os detalhes do produto ou revelando mensagens de erro que os invasores podem explorar.
33%
das vulnerabilidades críticas de aplicativos da web em 2022 foram devido a injeções de SQL.
Fonte: Statista
A prevalência generalizada de vulnerabilidades SQL e a atração do banco de dados de aplicativos da web com todos os seus dados críticos para os negócios tornam a injeção de SQL um dos ataques cibernéticos mais persistentes.
Fonte: Spiceworks
Tipos de ataques de injeção SQL
Existem três tipos principais de ataques de injeção de SQL com base em como os invasores recuperam informações ou interagem com o banco de dados:
- SQLi clássico ou em banda
- SQLi cego ou inferencial
- SQLi fora da banda
1. SQLi clássico ou em banda
In-band é o tipo mais comum de ataque de injeção SQL. O hacker clássico usa o mesmo canal de comunicação (in-band) para injetar código SQL malicioso e recuperar os resultados. As duas principais variações do SQLi em banda são:
SQLi em banda baseado em união
Este ataque utiliza o operador UNION SQL, usado para combinar dados do resultado de duas ou mais instruções SELECT. Ao fazer isso, os invasores podem recuperar dados de tabelas às quais não têm acesso direto.
SQLi em banda baseado em erros
Nesta técnica, um invasor aciona intencionalmente erros em uma consulta SQL para explorar as mensagens de erro retornadas pelo banco de dados. Os erros podem revelar informações valiosas sobre a estrutura do banco de dados, nomes de tabelas, nomes de colunas e, às vezes, os próprios dados. SQLi baseado em erros também pode ser executado como SQLi fora da banda.
2. SQLi inferencial (cego)
Em um SQLi cego, o invasor não pode ver diretamente os resultados do ataque. Em vez disso, eles inferem informações observando o comportamento do aplicativo ou mensagens de erro que respondem às suas consultas. Esse tipo de ataque consome muito tempo, pois os hackers precisam fazer uma série de consultas SQL para encontrar vulnerabilidades potenciais a serem exploradas. Duas variações do SQLi cego são:
SQLi cego baseado em tempo
Aqui, os invasores fazem perguntas que fazem o banco de dados atrasar sua resposta antes de reagir. Eles inferem informações sobre o banco de dados prestando atenção ao tempo de resposta.
SQLi cego booleano
Para SQLi cego booleano, os invasores aproveitam a maneira como um aplicativo responde a condições verdadeiras ou falsas em consultas SQL. Com base nas respostas da aplicação web, eles inferem informações sobre o banco de dados, mesmo que nenhum dado do banco de dados seja retornado.
3. SQLi fora da banda
Um ataque SQLi fora da banda faz com que o aplicativo envie dados para um endpoint remoto controlado pelos hackers. Um ataque como esse exige que os servidores SQL tenham determinados recursos, como a capacidade de iniciar solicitações de rede externa, como solicitações de protocolo de transferência de hipertexto (HTTP).
Como prevenir ataques de injeção de SQL: uma folha de dicas
Prevenir a injeção de SQL requer uma abordagem em várias camadas que envolva práticas de codificação segura e monitoramento contínuo. Aqui está uma folha de dicas com etapas essenciais para ajudar a mantê-lo protegido contra ataques de injeção de SQL.
Use declarações preparadas
A principal defesa contra ataques de injeção de SQL são instruções preparadas com consultas parametrizadas. As instruções preparadas garantem que as entradas do usuário sejam tratadas como dados, e não como código executável.
Os desenvolvedores compilam códigos SQL para consultas antecipadamente como modelos com espaços reservados para valores de entrada do usuário. No momento da execução da consulta, as instruções preparadas vinculam valores reais em vez de espaços reservados. Isso interrompe a execução de código malicioso.
As instruções preparadas são preferidas às instruções SQL dinâmicas. Eles escrevem consultas SQL durante o tempo de execução, o que os enfraquece contra ataques de injeção.
Declarações preparadas em linguagens de programação populares:
Aqui estão recomendações específicas de linguagem para usar instruções preparadas (consultas parametrizadas) em programação de banco de dados popular:
- Java Enterprise Edition (EE): use a classe PreparedStatement do pacote java.sql. Vincule parâmetros usando métodos como setString , setInt , etc.
- Python (SQLite3) : Use espaços reservados ( ? ) em consultas. Vincule parâmetros usando uma tupla ou lista .
- PHP: Use a extensão PHP Data Objects (PDO) . Utilize declarações preparadas com espaços reservados (:). Vincule parâmetros com bindValue ou bindParam .
- .NET : Use o objeto MySqlCommand . Vincule parâmetros usando Parameters.AddWithValue .
Outro método de prevenção de injeção de SQL é o uso de procedimentos armazenados ou um grupo de códigos SQL pré-compilados que podem ser usados repetidamente.
Pratique a validação de entrada
A validação de entrada envolve a verificação da entrada do usuário para garantir que ela atenda a critérios específicos antes do processamento. Uma lista de permissões, também conhecida como lista branca, é um aspecto fundamental da validação de entrada. Aqui, apenas valores ou padrões seguros e predefinidos são aceitos como parte de consultas SQL. Qualquer entrada que não corresponda aos critérios definidos será rejeitada. Isso evita ativamente a entrada de informações malignas ou inesperadas no sistema.
Use bibliotecas de mapeamento objeto-relacional
Bibliotecas de mapeamento objeto-relacional (ORM) são ferramentas valiosas para desenvolvedores que trabalham com bancos de dados relacionais. Eles permitem que os desenvolvedores interajam com bancos de dados usando a linguagem de programação de sua escolha, reduzindo assim a necessidade de escrever consultas SQL brutas. As bibliotecas ORM fornecem proteção integrada contra ataques de injeção de SQL.
Treine os desenvolvedores e as equipes de TI em práticas de codificação seguras. Certifique-se de fazer auditorias de segurança e testes de penetração regulares para encontrar vulnerabilidades.
Dica: ajude seus programadores e desenvolvedores a aprender codificação segura mais rapidamente com ferramentas de treinamento de código seguro.
Aplicar o princípio do menor privilégio
O princípio de privilégio mínimo fornece apenas aos usuários do banco de dados a permissão mínima necessária para realizar seu trabalho. Seguir este princípio reduz o impacto de possíveis ataques de injeção de SQL, ou qualquer ataque cibernético, nesse caso. Além disso, aplique um controle de acesso rigoroso ao seu banco de dados.
Implantar um firewall de aplicativo web (WAF)
Um WAF monitora o tráfego de entrada de aplicativos na rede e bloqueia tráfego potencialmente malicioso com base em uma lista de assinaturas de ataque conhecidas.
As 5 principais ferramentas de firewall de aplicativos da web (WAF):
- Firewall de Aplicativo Web do Azure
- AWS WAF
- Firewall de aplicativo da Web Imperva (WAF)
- Espectro Cloudflare
- Firewall de aplicativos da Web e proxy reverso da Symantec
* Acima estão as cinco principais soluções WAF do Summer 2023 Grid Report da G2.
Um WAF emprega regras predefinidas para detectar padrões suspeitos e anomalias no tráfego de entrada, como palavras-chave SQL e cargas maliciosas. Ele limpa e valida as entradas do usuário e bloqueia ou filtra solicitações prejudiciais. Isso ajuda a interromper consultas SQL perigosas à medida que elas entram no sistema.
Os WAFs modernos se adaptam a novos métodos de ataque usando aprendizado de máquina.
Outras ferramentas de segurança para evitar ataques de injeção de SQL
Além do WAF, diversas outras plataformas de segurança impedem ataques de injeção de SQL.
- Os scanners de vulnerabilidade procuram vulnerabilidades conhecidas e desconhecidas em aplicativos da web.
- As ferramentas de teste estático de segurança de aplicativos (SAST) e o software de análise de código estático encontram vulnerabilidades de segurança sem realmente executar o código.
- O software de teste dinâmico de segurança de aplicativos simula ataques a aplicativos em execução e identifica pontos fracos.
- Os sistemas de detecção e prevenção de intrusões e software de análise forense digital investigam anomalias e ataques a aplicações em tempo real.
Proteja suas fortalezas de dados
Os ataques de injeção de SQL representam uma grave ameaça à segurança de aplicativos da web. As empresas correm o risco de perder dados valiosos, a privacidade dos utilizadores e a sua boa reputação se os ataques forem bem sucedidos.
Embora nenhuma solução garanta segurança absoluta contra injeção de SQL, combinar as medidas preventivas de que falamos aqui reduz significativamente a chance de ataques. Os desenvolvedores web e administradores de banco de dados devem empregar defesas rigorosas e fortalecer seus aplicativos web contra exploração potencial.
Quer uma solução abrangente para proteger seu site? Explore o software de segurança da Web e como ele ajuda contra ataques cibernéticos que levam a violações de dados.