Tutorial de injeção de SQL: aprenda com o exemplo
⚡ Resumo Inteligente
A injeção de SQL é um ataque que envenena instruções SQL dinâmicas para burlar a autenticação ou expor dados, explorando vulnerabilidades em aplicações web que constroem consultas a partir de entradas de usuário não tratadas. Esta página mostra como o ataque funciona e como evitá-lo.

O que é uma injeção SQL?
A injeção de SQL é um ataque que envenena instruções SQL dinâmicas para comentar partes específicas da instrução ou adicionar uma condição que será sempre verdadeira. Ela se aproveita de falhas de projeto em aplicações web mal desenvolvidas para explorar instruções SQL e executar código SQL malicioso.
Os dados são um dos componentes mais vitais dos sistemas de informação. Aplicações web baseadas em bancos de dados são utilizadas por organizações para obter dados de clientes. SQL é a sigla para Linguagem de consulta estruturadaÉ utilizado para recuperar e manipular dados no banco de dados.
Como funciona um ataque de injeção de SQL?
Os tipos de ataques que podem ser realizados usando injeção de SQL variam dependendo do tipo de mecanismo de banco de dados. O ataque funciona em instruções SQL dinâmicas. Uma instrução dinâmica é uma instrução gerada em tempo de execução usando parâmetros passados de um formulário da web ou de uma string de consulta de URI.
Exemplo de injeção SQL
Vamos considerar uma aplicação web simples com um formulário de login. O código HTML do formulário é mostrado abaixo.
<form action=‘index.php’ method="post"> <input type="email" name="email" required="required"/> <input type="password" name="password"/> <input type="checkbox" name="remember_me" value="Remember me"/> <input type="submit" value="Submit"/> </form>
AQUI,
- O formulário acima aceita o endereço de e-mail e a senha e, em seguida, os envia para um PHP arquivo chamado index.php.
- Possui a opção de armazenar a sessão de login em um cookie. Deduzimos isso a partir da caixa de seleção "lembrar-me". Utiliza o método POST para enviar dados. Isso significa que os valores não são exibidos na página. URL.
Suponhamos que a instrução no backend para verificar o ID do usuário seja a seguinte.
SELECT * FROM users WHERE email = $_POST['email'] AND password = md5($_POST['password']);
AQUI,
- A instrução acima utiliza os valores do array $_POST[] diretamente, sem sanitizá-los.
- A senha é criptografada usando o algoritmo MD5.
Vamos ilustrar um ataque de injeção de SQL usando SQL Fiddle. Abra o URL http://sqlfiddle.com/ no seu navegador. Você obterá a seguinte janela.
Observação: você terá que escrever as instruções SQL.
Passo 1) Insira este código no painel esquerdo.
CREATE TABLE `users` ( `id` INT NOT NULL AUTO_INCREMENT, `email` VARCHAR(45) NULL, `password` VARCHAR(45) NULL, PRIMARY KEY (`id`)); insert into users (email,password) values ('m@m.com',md5('abc'));
Passo 2) Clique em Criar Esquema.
Passo 3) Insira este código no painel direito.
select * from users;
Passo 4) Clique em Executar SQL. Você verá o seguinte resultado.
Suponha que um usuário forneça admin@admin.sys e 1234 como senha. A instrução executada no banco de dados seria:
SELECT * FROM users WHERE email = 'admin@admin.sys' AND password = md5('1234');
O código acima pode ser explorado comentando a parte da senha e adicionando uma condição que será sempre verdadeira. Suponhamos que um atacante forneça a seguinte entrada no campo de endereço de e-mail.
xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ]
xxx para a senha.
A instrução dinâmica gerada será a seguinte.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' OR 1 = 1 LIMIT 1 -- ' ] AND password = md5('1234');
AQUI,
- xxx@xxx.xxx termina com uma aspa simples que completa a citação da string.
OR 1 = 1LIMIT 1 é uma condição que sempre será verdadeira e limita os resultados retornados a apenas um registro.- — ' AND… é um comentário SQL que elimina a parte da senha.
Copie a instrução SQL acima e cole-a no seguinte campo: SQL Fiddle Execute o comando SQL na caixa de texto conforme mostrado abaixo.
Atividade de hacking: SQL injeta um aplicativo da Web
Temos uma aplicação web simples em http://www.techpanda.org/ que é vulnerável a ataques de injeção de SQL apenas para fins de demonstração. O código HTML do formulário acima foi retirado da página de login. O aplicativo oferece segurança básica, como a higienização do campo de e-mail. Isso significa que o código acima não pode ser usado para burlar o login.
Para contornar isso, utilizamos o campo de senha. O diagrama abaixo mostra os passos a seguir.
Suponhamos que um atacante forneça a seguinte entrada.
- Etapa 1: digite xxx@xxx.xxx como endereço de e-mail
- Etapa 2: insira xxx') OU 1 = 1 — ]
- Clique no botão Enviar.
- Você será direcionado para o painel.
A instrução SQL gerada será a seguinte.
SELECT * FROM users WHERE email = 'xxx@xxx.xxx' AND password = md5('xxx') OR 1 = 1 -- ]');
O diagrama abaixo ilustra como a declaração é gerada.
AQUI,
- A declaração pressupõe, de forma inteligente, o uso da criptografia MD5.
- Completa as aspas simples e o parêntese de fechamento.
- Acrescenta uma condição à declaração que será sempre verdadeira.
Em geral, um ataque bem-sucedido combina diversas técnicas como as mostradas acima.
Outros tipos de ataque de injeção SQL
Ataques de injeção de SQL podem causar mais danos do que apenas burlar os algoritmos de login. Alguns exemplos desses ataques incluem:
- Excluindo dados
- Atualizando dados
- Inserindo dados
- Executar comandos no servidor que podem baixar e instalar programas maliciosos, como cavalos de Tróia
- Exportar dados valiosos, como detalhes de cartão de crédito, e-mail e senhas, para o servidor remoto do invasor
- Obtenção de dados de login do usuário, etc.
- Injeção SQL baseada em cookies
- Injeção SQL baseada em erro
- Injeção cega de SQL
A lista acima não é exaustiva; ela apenas dá uma ideia do que a injeção de SQL pode fazer.
Ferramentas de automação para injeção de SQL
No exemplo acima, utilizamos técnicas de ataque manual baseadas em nosso vasto conhecimento de SQL. Existem ferramentas automatizadas que podem ajudá-lo a executar os ataques de forma mais eficiente e no menor tempo possível. Essas ferramentas incluem:
- Mapa SQL – http://sqlmap.org/
- Injeção jSQL – https://www.kali.org/tools/jsql/
Como prevenir ataques de injeção de SQL
Uma organização pode adotar a política a seguir para se proteger contra ataques de injeção de SQL.
- Nunca se deve confiar na entrada do usuário. – Deve sempre ser higienizado antes de ser usado em instruções SQL dinâmicas.
- Procedimentos armazenados – Essas opções podem encapsular as instruções SQL e tratar todas as entradas como parâmetros.
- Declarações preparadas – As instruções preparadas funcionam criando primeiro a instrução SQL e, em seguida, tratando todos os dados do usuário enviados como parâmetros. Isso não afeta a sintaxe da instrução SQL.
- Expressões regulares – Essas ferramentas podem ser usadas para detectar códigos potencialmente prejudiciais e removê-los antes da execução das instruções SQL.
- direitos de acesso do usuário à conexão do banco de dados – somente os direitos de acesso necessários devem ser concedidos às contas utilizadas para conectar ao banco de dados. Isso pode ajudar a reduzir o que as instruções SQL podem executar no servidor.
- As mensagens de erro Essas mensagens não devem revelar informações confidenciais nem onde exatamente ocorreu um erro. Mensagens de erro personalizadas simples, como "Desculpe, estamos enfrentando problemas técnicos. A equipe técnica já foi contatada. Tente novamente mais tarde", podem ser usadas em vez de exibir as instruções SQL que causaram o erro.
Atividade de hacking: use Havij para injeção de SQL
Neste cenário prático, utilizamos o programa Havij Advanced SQL Injection para analisar um site em busca de vulnerabilidades.
Nota: Havij é um site antigo e sem manutenção. Windows A ferramenta SQLMap acima é o padrão atual de código aberto.
Observação: seu programa antivírus pode sinalizá-lo devido à sua natureza. Você deve adicioná-lo à lista de exclusões ou pausar sua instalação. programa antivírus.
A imagem abaixo mostra a janela principal do Havij.
A ferramenta acima pode ser usada para avaliar a vulnerabilidade de um site ou aplicativo.








