Blog / Tutorial

Injeção SQL para iniciantes: exemplos e prevenção

HackerDNA Team

12 min de leitura

jan. 17, 2026

Última atualização: fev. 06, 2026

Injeção SQL é uma das vulnerabilidades de aplicações web mais antigas e perigosas. Apesar de ser bem compreendida há mais de duas décadas, ela permanece no Top 10 OWASP porque desenvolvedores continuam cometendo os mesmos erros ao lidar com entrada de usuário.

Este tutorial de injeção SQL percorre exatamente como esses ataques funcionam, os diferentes tipos que você precisa conhecer e as técnicas específicas para preveni-los em suas aplicações. Seja você aprendendo teste de penetração ou construindo aplicações seguras em 2026, entender SQLi é fundamental.

TL;DR - O que é injeção SQL?

Injeção SQL ocorre quando atacantes inserem código SQL malicioso nas consultas de aplicação através de campos de entrada do usuário. Isso pode permitir que eles leiam dados sensíveis, modifiquem ou excluam registros, e às vezes executem comandos do sistema no servidor de banco de dados.

O que é injeção SQL?

Injeção SQL (SQLi) é uma técnica de injeção de código que explora vulnerabilidades em aplicações que constroem consultas SQL usando entrada de usuário não sanitizada. Quando uma aplicação concatena diretamente entrada de usuário em consultas de banco de dados, atacantes podem manipular a estrutura da consulta para acessar dados não autorizados ou realizar operações maliciosas.

Por que isso importa: Um ataque de injeção SQL bem-sucedido pode expor todo o seu banco de dados, incluindo nomes de usuário, senhas, números de cartão de crédito e informações pessoais. Em casos graves, atacantes podem obter controle completo do servidor de banco de dados.

Considere um formulário de login simples que verifica credenciais contra um banco de dados:

-- Construção de consulta vulnerável em PHP
$query = "SELECT * FROM users WHERE username = '" . $_POST['username'] . "' AND password = '" . $_POST['password'] . "'";

Se um usuário entrar admin como nome de usuário e ' OR '1'='1 como senha, a consulta resultante se torna:

SELECT * FROM users WHERE username = 'admin' AND password = '' OR '1'='1'

Como '1'='1' é sempre verdadeiro, esta consulta retorna todos os usuários, efetivamente contornando a autenticação completamente.

Como funcionam os ataques de injeção SQL

Entender a mecânica da injeção SQL ajuda você a identificar código vulnerável e criar defesas eficazes. Aqui está o fluxo típico de ataque:

  1. Identificar pontos de injeção Atacante encontra campos de entrada que interagem com o banco de dados: formulários de login, caixas de pesquisa, parâmetros de URL
  2. Testar vulnerabilidade Inserir caracteres especiais como aspas simples (') para ver se causam erros de banco de dados
  3. Determinar estrutura do banco de dados Usar mensagens de erro ou técnicas como UNION SELECT para descobrir nomes de tabelas e colunas
  4. Extrair ou manipular dados Criar payloads para extrair dados sensíveis, modificar registros ou escalar privilégios
  5. Manter acesso (avançado) Em alguns casos, atacantes criam backdoors ou executam comandos do sistema

O papel da entrada do usuário

A injeção SQL explora a confiança que aplicações depositam na entrada do usuário. Qualquer dado que flui de usuários para consultas SQL é um vetor potencial de ataque:

  • 1 Campos de formulário: Credenciais de login, consultas de pesquisa, dados de registro
  • 2 Parâmetros de URL: IDs de produto, números de página, opções de filtro
  • 3 Cabeçalhos HTTP: User-Agent, Referer, valores de Cookie
  • 4 Campos ocultos: Tokens de formulário, IDs de usuário, quantidades de produto

Tipos de injeção SQL

Ataques de injeção SQL se dividem em três categorias principais baseadas em como os atacantes recuperam informações do banco de dados:

SQLi In-Band

O atacante usa o mesmo canal de comunicação para lançar o ataque e recuperar resultados. Este é o mais comum e mais fácil de explorar.

Subtipos: Baseado em erro, Baseado em UNION

SQLi Cego

A aplicação não exibe erros de banco de dados ou resultados de consulta. Atacantes inferem informações observando o comportamento da aplicação ou tempos de resposta.

Subtipos: Baseado em booleano, Baseado em tempo

SQLi Out-of-Band

Os dados são exfiltrados através de um canal diferente, como requisições DNS ou HTTP para um servidor controlado pelo atacante. Requer recursos específicos do banco de dados.

Exemplo: Exfiltração DNS via xp_dirtree

Injeção SQL baseada em erro

SQLi baseada em erro depende de mensagens de erro do banco de dados para extrair informações. Quando relatórios de erro verbosos estão habilitados, atacantes podem criar consultas que revelam a estrutura do banco de dados:

-- Entrada que dispara um erro informativo
' AND 1=CONVERT(int, (SELECT TOP 1 table_name FROM information_schema.tables))--

O banco de dados tenta converter um nome de tabela para inteiro, o que falha e expõe o nome da tabela na mensagem de erro.

Injeção SQL baseada em UNION

Ataques baseados em UNION usam a instrução UNION SELECT para combinar resultados de múltiplas consultas. O atacante primeiro determina o número de colunas, depois extrai dados:

-- Passo 1: Encontrar contagem de colunas usando ORDER BY
' ORDER BY 1--
' ORDER BY 2--
' ORDER BY 3--  (erro aqui significa 2 colunas)

-- Passo 2: Extrair dados usando UNION
' UNION SELECT username, password FROM users--

Injeção SQL cega baseada em booleano

Quando mensagens de erro são suprimidas, atacantes fazem perguntas verdadeiro/falso e observam como a aplicação responde:

-- Se a página carregar normalmente, primeiro caractere da senha é 'a' ou posterior
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin') > 'a'--

-- Reduzir caractere por caractere
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin') = 's'--

Injeção SQL cega baseada em tempo

Quando até diferenças booleanas não são visíveis, atacantes usam funções de sleep do banco de dados para inferir resultados baseados no tempo de resposta:

-- Se a resposta leva 5 segundos, a condição é verdadeira
' AND IF(1=1, SLEEP(5), 0)--

-- Extrair dados um caractere por vez
' AND IF((SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='s', SLEEP(5), 0)--

Exemplos comuns de ataques de injeção SQL

Vamos examinar cenários práticos de injeção SQL que você pode encontrar durante testes de penetração ou avaliações de segurança.

Bypass de autenticação

O ataque clássico "admin sem senha" usa lógica booleana para contornar verificação de login:

Nome de usuário: admin'--
Senha: qualquer coisa

-- Consulta resultante:
SELECT * FROM users WHERE username = 'admin'--' AND password = 'qualquer coisa'
-- Tudo depois de -- é tratado como comentário

O que acontece: Os caracteres de comentário (--) fazem com que a verificação de senha seja completamente ignorada. A consulta retorna o usuário admin independentemente da senha inserida.

Extração de dados com UNION

Suponha que uma página de produto use esta URL: product.php?id=5. Um atacante pode extrair dados de outras tabelas:

-- Consulta original
SELECT name, price, description FROM products WHERE id = 5

-- URL maliciosa: product.php?id=5 UNION SELECT username, password, email FROM users--
-- Resultados exibem credenciais de usuário em vez de informações do produto

Fingerprinting de banco de dados

Identificar o tipo de banco de dados ajuda atacantes a escolher payloads apropriados:

-- MySQL: Retorna versão como "8.0.32"
' UNION SELECT @@version, NULL, NULL--

-- SQL Server: Retorna informações de versão
' UNION SELECT @@version, NULL, NULL--

-- PostgreSQL
' UNION SELECT version(), NULL, NULL--

-- Oracle
' UNION SELECT banner FROM v$version WHERE rownum=1--

Lendo arquivos do sistema (MySQL)

Em servidores MySQL mal configurados, atacantes podem ler arquivos do sistema de arquivos:

-- Ler /etc/passwd no Linux
' UNION SELECT LOAD_FILE('/etc/passwd'), NULL, NULL--

Nota de segurança: Configurações modernas do MySQL restringem LOAD_FILE() e outras operações de arquivo por padrão. No entanto, sistemas legados ou servidores mal configurados ainda podem ser vulneráveis.

Como detectar vulnerabilidades de injeção SQL

Encontrar injeção SQL requer testes sistemáticos de todos os pontos de entrada do usuário. Aqui estão as técnicas principais:

Checklist de testes manuais

  • 1 Teste de aspas simples: Entre ' e procure por erros de banco de dados ou comportamento inesperado
  • 2 Condições booleanas: Compare respostas a 1=1 (verdadeiro) vs 1=2 (falso)
  • 3 Atrasos de tempo: Injete SLEEP(5) e meça diferenças no tempo de resposta
  • 4 Concatenação de string: Teste se test é igual a te'+'st (SQL Server) ou te'||'st (Oracle)

Ferramentas automatizadas

Várias ferramentas automatizam detecção e exploração de injeção SQL:

SQLMap

A ferramenta de injeção SQL de código aberto mais popular. Detecta e explora automaticamente vulnerabilidades SQLi em todos os principais sistemas de banco de dados. Aprenda o básico em nossa folha de referência SQLMap.

Burp Suite

Plataforma profissional de teste de segurança web com scanner de injeção SQL integrado. Excelente para interceptar requisições e testar manualmente pontos de injeção.

Exemplo de comando SQLMap para testar um parâmetro de URL:

# Scan básico SQLMap
sqlmap -u "http://target.example/product.php?id=5" --dbs

# Opções explicadas:
# -u: URL alvo com parâmetro injetável
# --dbs: Enumerar bancos de dados disponíveis

Como prevenir injeção SQL

Prevenir injeção SQL requer uma abordagem de defesa em profundidade. Nenhuma técnica única é infalível, então implemente múltiplas camadas de proteção.

1. Use consultas parametrizadas (instruções preparadas)

Consultas parametrizadas separam código SQL de dados do usuário, tornando injeção impossível. Esta é a defesa mais eficaz:

// VULNERÁVEL - Concatenação de string
$query = "SELECT * FROM users WHERE username = '" . $username . "'";

// SEGURO - Consulta parametrizada (PHP PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);

Aqui está o equivalente em outras linguagens:

# Python com SQLite
cursor.execute("SELECT * FROM users WHERE username = ?", (username,))

// Java com JDBC
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE username = ?");
stmt.setString(1, username);

// Node.js com mysql2
connection.execute("SELECT * FROM users WHERE username = ?", [username]);

Por que isso funciona: O banco de dados trata entrada de usuário como dados, nunca como código SQL executável. Mesmo se alguém entrar ' OR '1'='1, ele procura por um usuário com esse nome de usuário literal.

2. Use procedimentos armazenados corretamente

Procedimentos armazenados podem fornecer proteção quando implementados adequadamente, mas não são automaticamente seguros. Evite SQL dinâmico dentro de procedimentos:

-- Procedimento armazenado VULNERÁVEL
CREATE PROCEDURE GetUser(@username VARCHAR(50))
AS
  EXEC('SELECT * FROM users WHERE username = ''' + @username + '''')

-- Procedimento armazenado SEGURO
CREATE PROCEDURE GetUser(@username VARCHAR(50))
AS
  SELECT * FROM users WHERE username = @username

3. Validação e sanitização de entrada

Embora não seja uma defesa completa, validação de entrada adiciona outra camada de segurança:

  • A Validação por whitelist: Aceite apenas caracteres esperados (alfanuméricos para nomes de usuário)
  • B Verificação de tipo: Garanta que parâmetros numéricos sejam realmente números
  • C Limites de comprimento: Restrinja comprimento de entrada aos máximos esperados
// Validar que ID é numérico antes do uso
if (!is_numeric($_GET['id'])) {
    die("ID de produto inválido");
}
$id = (int) $_GET['id'];

4. Aplique o princípio do menor privilégio

Contas de banco de dados usadas por aplicações web devem ter permissões mínimas:

  • Crie contas separadas para operações de leitura e escrita
  • Nunca use contas de administrador de banco de dados para aplicações web
  • Restrinja acesso a tabelas do sistema e procedimentos armazenados sensíveis
  • Desabilite funções perigosas como xp_cmdshell no SQL Server

5. Use Web Application Firewalls (WAF)

WAFs podem bloquear padrões comuns de injeção SQL como uma camada adicional, mas não devem ser sua defesa primária. Atacantes frequentemente encontram contornos para regras WAF.

Prioridade de defesa: Sempre implemente consultas parametrizadas primeiro. Considere WAFs e validação de entrada como medidas suplementares, não substitutas.

Considerações legais e éticas

Testes de injeção SQL devem ser realizados apenas em sistemas que você possui ou tem autorização escrita explícita para testar. Acesso não autorizado a banco de dados é uma ofensa criminal na maioria das jurisdições.

Antes de testar qualquer sistema:

  • Obtenha permissão escrita do proprietário do sistema
  • Defina claramente o escopo dos testes
  • Documente todas as atividades para responsabilização
  • Reporte vulnerabilidades através de canais apropriados
  • Nunca acesse, modifique ou exfiltre dados reais de usuário

Para aprendizado e prática, sempre use aplicações intencionalmente vulneráveis ou ambientes de laboratório autorizados.

Pratique injeção SQL com segurança

A melhor maneira de entender injeção SQL é prática hands-on em ambientes seguros e legais. Aqui estão recursos projetados especificamente para aprendizado:

Laboratório de injeção SQL

Pratique técnicas de injeção SQL do básico ao avançado em um ambiente controlado. Perfeito para iniciantes começando sua jornada de segurança.

Laboratório de injeção NoSQL

Aprenda como ataques de injeção se aplicam ao MongoDB e outros bancos de dados NoSQL com sintaxe e técnicas diferentes.

Para aprendizado abrangente, o curso de injeção SQL cobre teoria, detecção, exploração e prevenção em profundidade. Combine com treinamento de ferramentas da folha de referência SQLMap para construir habilidades práticas.

Outras plataformas de prática

  • DVWA (Damn Vulnerable Web Application): Aplicação de prática clássica com múltiplos níveis de dificuldade
  • SQLi-labs: Coleção focada de desafios de injeção SQL
  • PortSwigger Web Security Academy: Labs gratuitos dos criadores do Burp Suite

Perguntas frequentes

Injeção SQL ainda é relevante em 2026?

Sim. Apesar de ser uma vulnerabilidade bem conhecida, injeção SQL aparece consistentemente no Top 10 OWASP. Aplicações legadas, erros de desenvolvedor e uso incorreto de ORM a mantêm prevalente. Frameworks modernos ajudam, mas configurações incorretas ainda ocorrem.

Injeção SQL pode afetar bancos de dados NoSQL?

Bancos de dados NoSQL como MongoDB não são vulneráveis à injeção SQL tradicional, mas têm suas próprias vulnerabilidades de injeção. Injeção NoSQL explora operadores de consulta e estruturas JSON. Saiba mais no laboratório de injeção NoSQL.

ORMs previnem injeção SQL?

Quando usados corretamente, ORMs (Object-Relational Mappers) como Hibernate, Django ORM e ActiveRecord usam consultas parametrizadas por padrão. No entanto, métodos de consulta raw e uso incorreto ainda podem introduzir vulnerabilidades. Sempre revise consultas geradas por ORM durante avaliações de segurança.

Qual é a diferença entre SQLi e XSS?

Injeção SQL visa o servidor de banco de dados manipulando consultas SQL, enquanto XSS (Cross-Site Scripting) visa usuários injetando JavaScript malicioso em páginas web. Ambos são ataques de injeção, mas com alvos e impactos diferentes. Veja nosso guia XSS vs CSRF para mais sobre ataques do lado do cliente.

Como reportar vulnerabilidades de injeção SQL?

Se você descobrir uma vulnerabilidade, verifique se a organização tem um programa de bug bounty ou contato de segurança. Reporte através de canais oficiais, forneça etapas claras de reprodução e dê tempo razoável para correções antes de qualquer divulgação pública. Nunca explore vulnerabilidades para ganho pessoal.

Resumo: Dominando injeção SQL

Injeção SQL permanece uma das vulnerabilidades de aplicações web mais impactantes. Entender como esses ataques funcionam é essencial seja você protegendo aplicações ou conduzindo testes de penetração autorizados.

Pontos-chave deste tutorial de injeção SQL:

  • SQLi explora construção de consulta insegura: Entrada de usuário diretamente concatenada em instruções SQL cria vulnerabilidades
  • Três tipos principais existem: In-band (baseado em erro/union), cego (baseado em booleano/tempo) e out-of-band
  • Consultas parametrizadas são a defesa primária: Elas separam código de dados, tornando injeção impossível
  • Defesa em profundidade importa: Combine instruções preparadas com validação de entrada, menor privilégio e WAFs
  • Pratique legalmente: Teste apenas sistemas que você possui ou tem permissão explícita para avaliar

Ler sobre injeção SQL é apenas o primeiro passo. Verdadeiro entendimento vem de prática hands-on, vendo como diferentes payloads se comportam e aprendendo a criar consultas que extraem informações específicas.

Pronto para praticar injeção SQL na prática? Comece com o laboratório de injeção SQL para desafios guiados, depois explore o curso de injeção SQL abrangente para técnicas em profundidade. Domine a ferramenta essencial de teste com a folha de referência SQLMap para automatizar detecção e exploração em todos os principais sistemas de banco de dados.

Pronto para colocar isso em prática?

Pare de ler, comece a hackear. Ganhe experiência prática com mais de 170 labs de cibersegurança reais.

Comece a Hackear Grátis
Junte-se a 5.000+ hackers aprendendo cibersegurança com labs práticos. Criar Conta