SQL Injection — Payloads, Bypass e Prevenção
SQL Injection ocorre quando entrada do usuário é concatenada diretamente em queries SQL sem sanitização. O banco de dados executa o payload do atacante como parte da query legítima.
Como a vulnerabilidade surge
// VULNERÁVEL — concatenação direta
$id = $_GET['id'];
$query = "SELECT * FROM users WHERE id = $id";
Entrada 1 OR 1=1 retorna todos os registros. Entrada 1; DROP TABLE users-- pode destruir dados.
Tipos de SQL Injection
In-band (clássico): resultado visível na resposta HTTP.
Blind (cego): sem saída direta. Atacante infere dados por diferenças de comportamento.
- Boolean-based:
1 AND 1=1vs1 AND 1=2— página muda ou não. - Time-based:
1; WAITFOR DELAY '0:0:5'--— atraso confirma execução.
Out-of-band: dados exfiltrados via DNS ou HTTP para servidor externo.
Exemplo didático — Bypass de login
-- Query original
SELECT * FROM users WHERE email='INPUT' AND password='INPUT'
-- Payload no campo email (ambiente de teste)
' OR '1'='1' --
-- Query resultante
SELECT * FROM users WHERE email='' OR '1'='1' --' AND password='...'
-- Retorna todos os usuários; autenticação bypassada
Blind SQLi por tempo (ambiente fictício: example.com)
GET /item?id=1%3B+IF(1%3D1)+WAITFOR+DELAY+'0%3A0%3A3'--
Resposta demora 3 segundos → confirma injeção e banco SQL Server.
Prevenção — Prepared Statements
// SEGURO — parâmetro separado da query
$stmt = $pdo->prepare("SELECT * FROM users WHERE id = :id");
$stmt->execute([':id' => $id]);
$user = $stmt->fetch();
# Python com psycopg2
cursor.execute("SELECT * FROM users WHERE email = %s", (email,))
// Java JDBC
PreparedStatement stmt = conn.prepareStatement(
"SELECT * FROM users WHERE id = ?"
);
stmt.setInt(1, userId);
Defesas em camadas
- ORM com binding: Eloquent, Hibernate, SQLAlchemy por padrão usam parâmetros.
- WAF: bloqueia padrões conhecidos (não substitui prepared statements).
- Princípio do menor privilégio: conta do banco só com SELECT onde suficiente.
- Validação de entrada: rejeite tipos inesperados antes mesmo da query.
- Logs e alertas: monitore queries com padrões suspeitos (
UNION,--,OR 1=1).
Ferramentas de detecção (uso autorizado)
sqlmap é referência em testes de penetração autorizados. Em ambientes próprios ou com permissão escrita do cliente, aponta vetores que ferramentas manuais podem perder.
Nunca execute contra sistemas sem autorização formal por escrito.