Material introdutório de SQL Injection
Uma aula prática sobre SQL Injection usando o laboratório da PortSwigger
A Injeção SQL é uma vulnerabilidade de aplicação web que ocorre quando entradas fornecidas por usuários não são devidamente tratadas antes de serem usadas em consultas ao banco de dados.
Quando a aplicação concatena dados arbitrários diretamente em uma consulta, ela pode falhar em distinguir entre o que é dado inserido pelo usuário e o que é sintaxe SQL.
Quando o encapsulamento de uma string é quebrado por caracteres especiais, o banco de dados pode executar uma instrução modificada com os privilégios da própria aplicação.
Dado
Algo que o usuário envia: categoria, busca, nome, ID, filtro.
Comando
A estrutura SQL interpretada pelo banco: condições, operadores, comentários.
Falha
A aplicação mistura essas duas coisas.
Resumo: SQLi aparece quando a aplicação não separa bem dado e comando.
Em um cenário clássico de formulário de login, a consulta original no código fonte geralmente possui uma estrutura parecida com esta:
SELECT * FROM users WHERE username = '$_POST["username"]' AND password = '$_POST["password"]'
Se uma entrada malformada for inserida no campo de usuário, a instrução resultante pode fazer com que parte da verificação seja ignorada.
O ponto importante não é o payload em si. O problema é a aplicação montar uma consulta juntando texto do usuário com a estrutura do SQL.
A exploração costuma ser dividida pelo modo como a informação retorna para quem está testando a aplicação.
In-band
O teste e o retorno dos dados acontecem pelo mesmo canal da aplicação. Exemplos: erro visível ou retorno direto na página.
Blind
A aplicação não mostra diretamente o resultado. A inferência acontece por diferença de conteúdo, resposta ou tempo.
Out-of-band
Os dados são retornados por outro canal, como DNS ou HTTP externo. É menos comum em labs iniciais.
Dentro dessas categorias, aparecem técnicas como exploração baseada em erro, exploração baseada em UNION, inferência booleana e inferência baseada em tempo.
O laboratório usado na aula é:
Lab: SQL injection vulnerability in WHERE clause allowing retrieval of hidden data Nível: Apprentice Plataforma: PortSwigger Web Security Academy
Neste lab, a vulnerabilidade está no filtro de categoria de produtos.
Quando o usuário seleciona uma categoria, a aplicação executa uma consulta semelhante a esta:
SELECT * FROM products WHERE category = 'Gifts' AND released = 1
O trecho released = 1 indica que a aplicação tenta mostrar apenas produtos publicados.
https://portswigger.net/web-security/sql-injection/lab-retrieve-hidden-data
1
Abrir o lab da PortSwigger.
2
Clicar em Access the lab.
3
Testar o filtro de categorias normalmente.
4
Observar a URL e a resposta da página.
Antes de tentar resolver, observe o comportamento normal da aplicação. A página muda quando você troca a categoria? A URL muda? Existe algum parâmetro que parece controlar o filtro?
Pergunta para a turma: esse parâmetro parece ser só um valor de texto ou pode alterar a lógica da query?
A ideia de usar o Burp aqui é simples: ver a requisição de forma mais clara, identificar o parâmetro que representa a categoria e testar pequenas mudanças no valor enviado.
Categoria
A entrada escolhe quais produtos aparecem.
Released
A aplicação tenta esconder produtos não publicados.
Teste
A pergunta é: dá para mudar essa lógica?
A consulta tem duas partes importantes na cláusula WHERE: uma ligada à categoria e outra ligada ao estado de publicação do produto.
A exploração do lab consiste em entender se a entrada da categoria consegue interferir nessa lógica.
A exploração manual é importante porque ajuda a validar a vulnerabilidade e entender o comportamento da aplicação antes de qualquer automação.
A busca por pontos de injeção envolve testar entradas controladas pelo usuário, como parâmetros GET, parâmetros POST, cookies e cabeçalhos HTTP.
Alguns sinais comuns de comportamento vulnerável são:
- erro inesperado ao inserir caracteres especiais;
- mudança na quantidade de itens exibidos;
- diferença entre condições verdadeiras e falsas;
- alteração no tempo de resposta;
- mensagens de erro que revelam detalhes do banco.
Aspas
Podem quebrar o encapsulamento de strings e revelar erro de sintaxe.
Lógica
Condições booleanas ajudam a observar se a resposta muda.
Ambiente isolado para prática
Inicie uma instância temporária ao final da aula para praticar o conteúdo com segurança.