Aula 45 | SQL Injection

Aula 45 | SQL Injection

SQL Injection

O que é SQL Injection?

SQL Injection é um tipo de ataque onde o atacante injeta código SQL malicioso em uma consulta através de uma entrada vulnerável.

Esse ataque pode permitir ao atacante manipular o banco de dados, como modificar a Tabela X ou atualizar a Tabela Y.

Como Funciona?

Muitos bancos de dados utilizam SQL (Structured Query Language) para gerenciar e consultar os dados. O atacante injeta código SQL em um campo vulnerável, o que permite executar consultas indesejadas no banco de dados. Por exemplo, um campo de busca vulnerável em um site pode ser explorado para realizar uma consulta maliciosa.

Exemplo Prático

Considere o exemplo do site netcattest.com/busca. Toda vez que alguém pesquisa por uma aula, é feita uma consulta para retornar o conteúdo. Se o campo de pesquisa for vulnerável, o atacante pode injetar código SQL para manipular o banco de dados.

SELECT * FROM aulas WHERE aula = '45';

Se o atacante injetar ' OR '1'='1'; --, a consulta se transforma em:

SELECT * FROM aulas WHERE aula = '' OR '1'='1'; --';

Isso faz com que todas as linhas da tabela aulas sejam retornadas, independentemente do número da aula.

Tabela de Exemplo:

Tabela aulas:

id aula nome
1 45 SQL Injection
2 46 Modificando Query SQL Injection

Estrutura do Back-end e Banco de Dados

Na aula 15, falamos sobre as camadas de um sistema. O banco de dados está localizado na camada 3, junto com o back-end, e sua função é armazenar informações que se relacionam entre si. O back-end utiliza linguagens de programação como PHP ou Java para se comunicar com o banco de dados.

 

Exemplos de Tabelas e Comandos SQL

Tabela clientes:

id nome endereço cidade idade
1 Martins Rua A, 123 São Paulo 30
2 Maria Av. B, 456 Rio 25
3 Daniel Rua C, 789 New York 35
4 Ana Av. D, 012 New York 28
 

Comandos SQL de Exemplo:

  • SELECT:

    SELECT aula, nome FROM aulas WHERE aula = '45';
    
  • UNION: Utilizado para unir o resultado de 2 ou mais consultas.

    SELECT nome, endereço FROM clientes 
    WHERE cidade = 'São Paulo' UNION SELECT nome, endereço FROM clientes
    WHERE cidade = 'Rio';
  • DISTINCT: Retorna apenas valores únicos.

    SELECT DISTINCT cidade FROM clientes;
    
  • UNION ALL: Retorna resultados com repetições e é mais rápido que o UNION normal.

    SELECT nome, endereço FROM clientes 
    WHERE cidade = 'São Paulo' UNION ALL SELECT nome, endereço FROM clientes
    WHERE cidade = 'Rio';
  • OR: Retorna registros que atendem a pelo menos uma das condições.

    SELECT nome, endereço FROM clientes WHERE 
    cidade = 'New York' OR idade = 30;
  • AND: Todas as condições devem ser satisfeitas.

    SELECT nome, endereço FROM clientes WHERE 
    cidade = 'New York' AND idade > 30;
 
Elemento SQL Tipo
SELECT Verbo (Comando SQL)
FROM Cláusula
WHERE Cláusula
AND Operador Lógico
OR Operador Lógico
UNION Operador de Conjunto
UNION ALL Operador de Conjunto
DISTINCT Modificador
ORDER BY Cláusula
GROUP BY Cláusula
HAVING Cláusula
JOIN Cláusula
LEFT JOIN Cláusula
RIGHT JOIN Cláusula
FULL JOIN Cláusula
ON Cláusula
LIKE Operador
IN Operador
BETWEEN Operador
NOT Operador Lógico
EXISTS Operador
CASE Modificador
LIMIT Cláusula
OFFSET Cláusula

Sintaxe geral de uma consulta SQL

SELECT [MODIFICADOR] coluna1, coluna2, ...
FROM tabela
[JOIN outra_tabela ON condição]
WHERE condição
[AND | OR condição]
GROUP BY coluna
HAVING condição
ORDER BY coluna [ASC | DESC]
LIMIT quantidade
OFFSET quantidade;
Elemento Descrição
SELECT Seleciona dados da tabela.
MODIFICADOR DISTINCT (remove duplicados), TOP (limita a quantidade de registros em alguns bancos de dados).
FROM Especifica a tabela de onde os dados serão selecionados.
JOIN Permite combinar dados de múltiplas tabelas (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL JOIN).
ON Define a condição para a junção de tabelas no JOIN.
WHERE Filtra os resultados da consulta com base em uma condição.
Operadores Lógicos AND, OR, NOT (usados no WHERE para combinar condições).
GROUP BY Agrupa registros com base em uma coluna.
HAVING Filtra os grupos de registros após o GROUP BY.
ORDER BY Ordena os resultados (ASC = crescente, DESC = decrescente).
LIMIT Define o número máximo de registros retornados.
OFFSET Define um deslocamento no conjunto de resultados.

Exemplo de uma consulta SQL Completa

SELECT DISTINCT nome, idade, salario
FROM funcionarios
LEFT JOIN departamentos ON funcionarios.dept_id = departamentos.id
WHERE idade > 30 AND salario > 3000
GROUP BY departamento
HAVING COUNT(*) > 5
ORDER BY salario DESC
LIMIT 10
OFFSET 5;

O que essa consulta faz?

  • Seleciona os nomes, idades e salários dos funcionários. Utiliza DISTINCT para evitar duplicatas.
  • Faz um LEFT JOIN com a tabela departamentos com base no dept_id.
  • Filtra os funcionários com mais de 30 anos e salário superior a 3000.
  • Agrupa os dados por departamento.
  • Filtra apenas grupos com mais de 5 funcionários (HAVING).
  • Ordena os resultados pelo salário em ordem decrescente.
  • Retorna 10 resultados, começando a partir do 6º (OFFSET 5).

 

Sugestões de Aulas

Aula 46 | Modificiando Query SQL Injection

Ver Aula

Aula 44 | Defender do XSS

Ver Aula

Aula 99 | Protocolo IRC

Ver Aula