Tutorial de injeção de SQL: como aprender com exemplo

O que é uma injeção SQL?

SQL Injection é um ataque que envenena instruções SQL dinâmicas para comentar certas partes da instrução ou anexar uma condição que sempre será verdadeira. Ele aproveita as falhas de design em aplicativos da Web mal projetados para explorar instruções SQL para executar código SQL malicioso.

Os dados são um dos componentes mais vitais dos sistemas de informação. Aplicativos da web baseados em banco de dados são usados ​​pela organização para obter dados dos clientes. SQL é a sigla para Structured Query Language. É usado para recuperar e manipular dados no banco de dados.

Injeção de SQL

Como funciona o ataque de injeção SQL?

Os tipos de ataques que podem ser executados usando injeção 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 de senha de um formulário da web ou string de consulta URI.

Exemplo de injeção SQL

Vamos considerar uma aplicação web simples com um formulário de login. O código do formulário HTML é 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 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 da caixa de seleção Remember_me. Ele usa o método post para enviar dados. Isso significa que os valores não são exibidos na URL.

Vamos supor 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 declaração acima usa os valores do $_POST[] array diretamente sem higienizá-los.
  • A senha é criptografada usando o algoritmo MD5.

Ilustraremos o ataque de injeção SQL usando sqlfiddle. Abra o URL http://sqlfiddle.com/ no seu navegador. Você obterá a seguinte janela.

Nota: você terá que escrever as instruções SQL

Injeção de SQL funciona

Passo 1) Digite 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) Digite este código no painel direito

select * from users;

Passo 4) Clique em Executar SQL. Você verá o seguinte resultado

Injeção de SQL funciona

Suponha que o usuário forneça admin@admin.sys e 1234 como a senha. A instrução a ser 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 anexando uma condição que sempre será verdadeira. Suponhamos que um invasor 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 aspa da string
  • OR 1 = 1 LIMIT 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 SQL FiddleExecute a caixa de texto SQL conforme mostrado abaixo

Injeção de SQL funciona

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 SQL Injection apenas para fins de demonstração. O código do formulário HTML acima foi retirado da página de login. O aplicativo oferece segurança básica, como higienizar o campo de e-mail. Isso significa que nosso código acima não pode ser usado para ignorar o login.

Para contornar isso, podemos explorar o campo de senha. O diagrama abaixo mostra as etapas que você deve seguir

SQL injetar um aplicativo da Web

Suponhamos que um invasor forneça a seguinte entrada

  • Etapa 1: digite xxx@xxx.xxx como endereço de e-mail
  • Etapa 2: insira xxx') OU 1 = 1 — ]

SQL injetar um aplicativo da Web

  • 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 que a instrução foi gerada.

SQL injetar um aplicativo da Web

AQUI,

  • A declaração assume de forma inteligente que a criptografia MD5 é usada
  • Completa a aspa simples e o colchete de fechamento
  • Acrescenta uma condição à afirmação que sempre será verdadeira

Em geral, um ataque de injeção SQL bem-sucedido tenta diversas técnicas diferentes, como as demonstradas acima, para realizar um ataque bem-sucedido.

Outros tipos de ataque de injeção SQL

As injeções de SQL podem causar mais danos do que apenas passar os algoritmos de login. Alguns dos 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
  • Obtendo detalhes 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; apenas dá uma ideia do que SQL Injection

Ferramentas de automação para injeção de SQL

No exemplo acima, usamos técnicas de ataque manual baseadas em nosso vasto conhecimento de SQL. Existem ferramentas automatizadas que podem ajudá-lo a realizar os ataques com mais eficiência e no menor tempo possível. Essas ferramentas incluem

Como se prevenir contra 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.

  • A entrada do usuário nunca deve ser confiável – Ele sempre deve ser limpo antes de ser usado em instruções SQL dinâmicas.
  • Procedimentos armazenados - estes podem encapsular as instruções SQL e tratar todas as entradas como parâmetros.
  • Declarações preparadas – instruções preparadas para funcionarem, criando primeiro a instrução SQL e depois tratando todos os dados do usuário enviados como parâmetros. Isso não afeta a sintaxe da instrução SQL.
  • Expressões regulares - eles podem ser usados ​​para detectar códigos potencialmente prejudiciais e removê-los antes de executar as instruções SQL.
  • Direitos de acesso do usuário de conexão de banco de dados – apenas os direitos de acesso necessários devem ser concedidos às contas usadas para conectar ao banco de dados. Isso pode ajudar a reduzir o que as instruções SQL podem executar no servidor.
  • Mensagens de erro - estes não devem revelar informações confidenciais e onde exatamente ocorreu um erro. Mensagens de erro personalizadas simples, como “Desculpe, estamos enfrentando erros técnicos. A equipe técnica foi contatada. Tente novamente mais tarde” pode ser usado 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, usaremos o programa Havij Advanced SQL Injection para verificar vulnerabilidades em um site.

Nota: seu programa antivírus pode sinalizá-lo devido à sua natureza. Você deve adicioná-lo à lista de exclusões ou pausar seu software antivírus.

A imagem abaixo mostra a janela principal do Havij

Use Havij para injeção SQL

A ferramenta acima pode ser usada para avaliar a vulnerabilidade de um site/aplicativo.

Resumo

  • SQL Injection é um tipo de ataque que explora instruções SQL incorretas
  • A injeção de SQL pode ser usada para ignorar algoritmos de login, recuperar, inserir, atualizar e excluir dados.
  • As ferramentas de injeção de SQL incluem SQLMap, SQLPing e SQLSmack, etc.
  • Uma boa política de segurança ao escrever instruções SQL pode ajudar a reduzir ataques de injeção de SQL.