Modificando Query com SQL Injection
Revisão: SQL Injection
Na aula anterior (aula 45), vimos o que é SQL Injection e como funciona. Relembrando, SQL Injection é um ataque onde o atacante injeta código SQL malicioso em uma consulta através de uma entrada vulnerável.
Exemplos de URLs e Consultas
Vamos usar o exemplo do site https://netcattest.com/busca/1. Se você altera o URL para /2 ou /3, ele vai retornar outros dados de outras páginas. Isso mostra que está sendo realizada uma pesquisa no banco de dados.
Vamos imaginar que a tabela no banco de dados é chamada aulas e tem as seguintes colunas:
| id | aula | nome | 
Uma consulta para buscar uma aula específica poderia ser assim:
SELECT * FROM aulas WHERE id = 1;
Se alterarmos o URL para https://netcattest.com/busca/2, a consulta seria:
SELECT * FROM aulas WHERE id = 2;
Pensamento de um Atacante
Agora vem o pensamento de um atacante: e se o valor não for um número? E se for uma letra, um símbolo ou até mesmo outro comando SQL para manipular a consulta?
Por exemplo, o atacante pode alterar o URL para https://netcattest.com/busca/46 e injetar o seguinte código:
id=1' OR '1'='1--
A consulta resultante seria:
SELECT * FROM aulas WHERE id = 1 OR '1'='1' --;
Por Que Funciona?
Esse comando funciona devido aos caracteres especiais (', --) e operadores lógicos (OR). Aqui está o detalhamento:
- 
': Fecha a string que contém o valor doid.
- 
OR '1'='1': Sempre verdadeiro, forçando o banco de dados a retornar todas as linhas da tabela.
- 
--: Comentário em SQL, que ignora o restante da consulta original.
Tabelas de Exemplo
Vamos criar um exemplo de tabela aulas:
| id | aula | nome | 
|---|---|---|
| 1 | 45 | SQL Injection | 
| 2 | 46 | Modificando Query SQL Injection | 
| 3 | 47 | Back-End por trás do SQL Injection | 
E aqui está a consulta que um atacante poderia usar para manipular o resultado:
SELECT * FROM aulas WHERE id = 1 OR '1'='1' --;
Isso retornaria todas as aulas, independentemente do valor de id.
Claro! Vamos utilizar a tabela aulas com as colunas id, aula e nome que definimos anteriormente:
Tabela aulas:
| id | aula | nome | 
|---|---|---|
| 1 | 45 | SQL Injection | 
| 2 | 46 | Modificando Query SQL Injection | 
| 3 | 47 | Back-End por trás do SQL Injection | 
Remover uma Aula (Aula 45)
Para remover a aula com id = 1 (Aula 45), utilizamos o comando SQL DELETE:
DELETE FROM aulas WHERE id = 1;
Adicionar uma Nova Aula (Aula 47)
Para adicionar uma nova aula (Aula 47), utilizamos o comando SQL INSERT:
INSERT INTO aulas (id, aula, nome) 
VALUES (4, 47, 'oi');
Assim, os comandos completos são:
| -- Remover a aula com id = 1 (Aula 45) -- Adicionar uma nova aula (Aula 47) |