Tutorial de injeção de SQL: aprenda com o exemplo

⚡ Resumo Inteligente

A injeção de SQL é um ataque que envenena instruções SQL dinâmicas para burlar a autenticação ou expor dados, explorando vulnerabilidades em aplicações web que constroem consultas a partir de entradas de usuário não tratadas. Esta página mostra como o ataque funciona e como evitá-lo.

  • 💉 Definição: A injeção de SQL insere código SQL malicioso em uma consulta por meio de um campo de entrada não validado.
  • 🔓 Impacto: Um ataque bem-sucedido pode contornar logins e ler, modificar ou excluir registros.
  • 🧪 Exemplo: Uma condição sempre verdadeira, somada a um comentário, transforma uma verificação de login em uma forma de burlá-la.
  • 🛠️ Ferramentas: SQLMap e jSQL automatizam a detecção e a exploração de parâmetros injetáveis.
  • 🛡️ Prevenção: Consultas parametrizadas, validação de entrada e contas com privilégios mínimos reduzem a diferença.
  • 🤖 Vanguarda moderna: Os scanners e firewalls baseados em IA identificam padrões de injeção que as assinaturas fixas não detectam.

Tutorial de Injeção de SQL

O que é uma injeção SQL?

A injeção de SQL é um ataque que envenena instruções SQL dinâmicas para comentar partes específicas da instrução ou adicionar uma condição que será sempre verdadeira. Ela se aproveita de falhas de projeto em aplicações web mal desenvolvidas para explorar instruções SQL e executar código SQL malicioso.

Os dados são um dos componentes mais vitais dos sistemas de informação. Aplicações web baseadas em bancos de dados são utilizadas por organizações para obter dados de clientes. SQL é a sigla para Linguagem de consulta estruturadaÉ utilizado para recuperar e manipular dados no banco de dados.

Diagrama de como uma injeção de SQL manipula uma consulta de banco de dados dinâmica.

Como funciona um ataque de injeção de SQL?

Os tipos de ataques que podem ser realizados usando injeção de SQL variam dependendo do tipo de mecanismo de banco de dados. O ataque funciona em instruções SQL dinâmicas. Uma instrução dinâmica é uma instrução gerada em tempo de execução usando parâmetros passados ​​de um formulário da web ou de uma string de consulta de URI.

Exemplo de injeção SQL

Vamos considerar uma aplicação web simples com um formulário de login. O código HTML do formulário é mostrado abaixo.

<form action=‘index.php’ method="post">

<input type="email" name="email" required="required"/>

<input type="password" name="password"/>

<input type="checkbox" name="remember_me" value="Remember me"/>

<input type="submit" value="Submit"/>

</form>

AQUI,

  • O formulário acima aceita o endereço de e-mail e a senha e, em seguida, os envia para um PHP arquivo chamado index.php.
  • Possui a opção de armazenar a sessão de login em um cookie. Deduzimos isso a partir da caixa de seleção "lembrar-me". Utiliza o método POST para enviar dados. Isso significa que os valores não são exibidos na página. URL.

Suponhamos que a instrução no backend para verificar o ID do usuário seja a seguinte.

SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);

AQUI,

  • A instrução acima utiliza os valores do array $_POST[] diretamente, sem sanitizá-los.
  • A senha é criptografada usando o algoritmo MD5.

Vamos ilustrar um ataque de injeção de SQL usando SQL Fiddle. Abra o URL http://sqlfiddle.com/ no seu navegador. Você obterá a seguinte janela.

Observação: você terá que escrever as instruções SQL.

vazio SQL Fiddle janela pronta para o esquema e a consulta

Passo 1) Insira este código no painel esquerdo.

CREATE TABLE `users` (
  `id` INT NOT NULL AUTO_INCREMENT,
  `email` VARCHAR(45) NULL,
  `password` VARCHAR(45) NULL,
  PRIMARY KEY (`id`));
  
  
insert into users (email,password) values ('m@m.com',md5('abc'));

Passo 2) Clique em Criar Esquema.

Passo 3) Insira este código no painel direito.

select * from users;

Passo 4) Clique em Executar SQL. Você verá o seguinte resultado.

SQL Fiddle resultado mostrando o registro de usuário único retornado

Suponha que um usuário forneça admin@admin.sys e 1234 como senha. A instrução executada no banco de dados seria:

SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');

O código acima pode ser explorado comentando a parte da senha e adicionando uma condição que será sempre verdadeira. Suponhamos que um atacante forneça a seguinte entrada no campo de endereço de e-mail.

xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]

xxx para a senha.

A instrução dinâmica gerada será a seguinte.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');

AQUI,

  • xxx@xxx.xxx termina com uma aspa simples que completa a citação da string.
  • OR 1 = 1 LIMIT 1 é uma condição que sempre será verdadeira e limita os resultados retornados a apenas um registro.
  • — ' AND… é um comentário SQL que elimina a parte da senha.

Copie a instrução SQL acima e cole-a no seguinte campo: SQL Fiddle Execute o comando SQL na caixa de texto conforme mostrado abaixo.

SQL Fiddle retornando o registro após a execução da condição injetada

Atividade de hacking: SQL injeta um aplicativo da Web

Temos uma aplicação web simples em http://www.techpanda.org/ que é vulnerável a ataques de injeção de SQL apenas para fins de demonstração. O código HTML do formulário acima foi retirado da página de login. O aplicativo oferece segurança básica, como a higienização do campo de e-mail. Isso significa que o código acima não pode ser usado para burlar o login.

Para contornar isso, utilizamos o campo de senha. O diagrama abaixo mostra os passos a seguir.

Fluxograma dos passos para inserir o campo de senha no formulário de login.

Suponhamos que um atacante forneça a seguinte entrada.

  • Etapa 1: digite xxx@xxx.xxx como endereço de e-mail
  • Etapa 2: insira xxx') OU 1 = 1 — ]

Formulário de login com a string de injeção inserida no campo de senha.

  • Clique no botão Enviar.
  • Você será direcionado para o painel.

A instrução SQL gerada será a seguinte.

SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');

O diagrama abaixo ilustra como a declaração é gerada.

Análise detalhada de como a instrução SQL injetada é gerada.

AQUI,

  • A declaração pressupõe, de forma inteligente, o uso da criptografia MD5.
  • Completa as aspas simples e o parêntese de fechamento.
  • Acrescenta uma condição à declaração que será sempre verdadeira.

Em geral, um ataque bem-sucedido combina diversas técnicas como as mostradas acima.

Outros tipos de ataque de injeção SQL

Ataques de injeção de SQL podem causar mais danos do que apenas burlar os algoritmos de login. Alguns exemplos desses ataques incluem:

  • Excluindo dados
  • Atualizando dados
  • Inserindo dados
  • Executar comandos no servidor que podem baixar e instalar programas maliciosos, como cavalos de Tróia
  • Exportar dados valiosos, como detalhes de cartão de crédito, e-mail e senhas, para o servidor remoto do invasor
  • Obtenção de dados de login do usuário, etc.
  • Injeção SQL baseada em cookies
  • Injeção SQL baseada em erro
  • Injeção cega de SQL

A lista acima não é exaustiva; ela apenas dá uma ideia do que a injeção de SQL pode fazer.

Ferramentas de automação para injeção de SQL

No exemplo acima, utilizamos técnicas de ataque manual baseadas em nosso vasto conhecimento de SQL. Existem ferramentas automatizadas que podem ajudá-lo a executar os ataques de forma mais eficiente e no menor tempo possível. Essas ferramentas incluem:

Como prevenir ataques de injeção de SQL

Uma organização pode adotar a política a seguir para se proteger contra ataques de injeção de SQL.

  • Nunca se deve confiar na entrada do usuário. – Deve sempre ser higienizado antes de ser usado em instruções SQL dinâmicas.
  • Procedimentos armazenados – Essas opções podem encapsular as instruções SQL e tratar todas as entradas como parâmetros.
  • Declarações preparadas – As instruções preparadas funcionam criando primeiro a instrução SQL e, em seguida, tratando todos os dados do usuário enviados como parâmetros. Isso não afeta a sintaxe da instrução SQL.
  • Expressões regulares – Essas ferramentas podem ser usadas para detectar códigos potencialmente prejudiciais e removê-los antes da execução das instruções SQL.
  • direitos de acesso do usuário à conexão do banco de dados – somente os direitos de acesso necessários devem ser concedidos às contas utilizadas para conectar ao banco de dados. Isso pode ajudar a reduzir o que as instruções SQL podem executar no servidor.
  • As mensagens de erro Essas mensagens não devem revelar informações confidenciais nem onde exatamente ocorreu um erro. Mensagens de erro personalizadas simples, como "Desculpe, estamos enfrentando problemas técnicos. A equipe técnica já foi contatada. Tente novamente mais tarde", podem ser usadas em vez de exibir as instruções SQL que causaram o erro.

Atividade de hacking: use Havij para injeção de SQL

Neste cenário prático, utilizamos o programa Havij Advanced SQL Injection para analisar um site em busca de vulnerabilidades.

Nota: Havij é um site antigo e sem manutenção. Windows A ferramenta SQLMap acima é o padrão atual de código aberto.

Observação: seu programa antivírus pode sinalizá-lo devido à sua natureza. Você deve adicioná-lo à lista de exclusões ou pausar sua instalação. programa antivírus.

A imagem abaixo mostra a janela principal do Havij.

Janela principal da ferramenta de injeção SQL Havij

A ferramenta acima pode ser usada para avaliar a vulnerabilidade de um site ou aplicativo.

Perguntas Frequentes

Somente com a permissão por escrito do proprietário do site. Testar um aplicativo que não lhe pertence é ilegal, de acordo com leis como a Lei de Fraude e Abuso de Computadores dos EUA. Os escopos dos programas de recompensa por bugs definem o que é permitido.

Sim. No OWASP Top 10:2025, a vulnerabilidade de injeção de SQL ocupa a posição A05, e os testes ainda encontram injeções em praticamente todos os aplicativos. Com milhares de novas vulnerabilidades de injeção de SQL por ano, ela continua sendo um dos principais riscos da web.

MD5 é um algoritmo de hash rápido, não de criptografia, e atacantes o quebram rapidamente com tabelas rainbow e GPUs. Use um algoritmo lento e com salt, como bcrypt ou Argon2, para senhas.

Qualquer banco de dados consultado por meio de SQL construído dinamicamente — MySQL, PostgreSQL, Microsoft SQL Server, Oracle e SQLiteO problema reside na forma como a aplicação concatena a entrada do usuário em consultas, e não no mecanismo do banco de dados.

Firewalls e scanners com inteligência artificial aprendem padrões de tráfego normais e, em seguida, sinalizam entradas anômalas, como condições ou comentários injetados, em tempo real. Modelos de aprendizado de máquina detectam payloads ofuscados que assinaturas fixas não identificam.

Assistentes de IA como Copiloto do GitHub Podem sugerir consultas parametrizadas e validação de entrada, mas também reproduzem padrões inseguros. Trate cada sugestão como um rascunho e utilize um analisador de segurança para revisá-la.

A injeção de SQL visa o banco de dados injetando SQL em consultas do lado do servidor. O cross-site scripting (XSS) visa outros usuários injetando scripts que são executados em seus navegadores. Um expõe dados; o outro sequestra sessões.

Um ORM (mapeador objeto-relacional) constrói consultas a partir de objetos de código com parametrização por padrão, prevenindo a maioria das injeções de SQL. No entanto, não é infalível — consultas brutas e métodos inseguros ainda podem vazar código, portanto a validação continua sendo importante.

Resuma esta postagem com: