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.
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;
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' --;
Esse comando funciona devido aos caracteres especiais ('
, --
) e operadores lógicos (OR
). Aqui está o detalhamento:
'
: Fecha a string que contém o valor do id
.
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.
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 |
Para remover a aula com id = 1
(Aula 45), utilizamos o comando SQL DELETE
:
DELETE FROM aulas WHERE id = 1;
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) |