Tutorial de injeção de SQL: aprenda com o exemplo

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.

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.

Injeção de SQL

Como funciona a injeção de 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.

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 email endereço e senha, 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 da verificação de Remember_mebox. 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

SELECIONE * DOS usuários ONDE email = $_POST['email'] AND senha = md5($_POST['senha']);

AQUI,

  • A instrução acima usa os valores do array $_POST[] 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ê receberá o seguintewing 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

selecione * dos usuários;

Passo 4) Clique em Executar SQL. Você verá o seguintewing resultar

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

SELECIONE * DOS usuários ONDE email = 'admin@admin.sys' AND senha = 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 o seguintewing entrada no email campo de endereço.

xxx@xxx.xxx' OU 1 = 1 LIMITE 1 - ' ]

xxx para a senha.

A instrução dinâmica gerada será a seguinte.

SELECIONE * DOS usuários ONDE email = 'xxx@xxx.xxx' OR 1 = 1 LIMITE 1 — ' ] AND senha = md5('1234');

AQUI,

  • xxx@xxx.xxx termina com uma aspa simples que completa a aspa da string
  • OR 1 = 1 LIMITE 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 em SQL FiddleRun SQL Text box como 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 email campo. 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 o seguintewing entrada

  • Etapa 1: digite xxx@xxx.xxx como email endereço
  • 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

SELECIONE * DOS usuários ONDE email = 'xxx@xxx.xxx' AND senha = 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
  • Exportando dados valiosos, como dados de cartão de créditotailsemaile senhas para o servidor remoto do invasor
  • Obtendo login do usuário details etc.

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 o seguintewing política 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-se 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.

Observação: 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.
Guru99 é patrocinado pela Invicti
Invictos

A Invicti, desenvolvedora da tecnologia Proof Based Scanning, patrocinou o projeto Guru99 para ajudar a aumentar a conscientização sobre segurança de aplicações web e permitir que mais desenvolvedores aprendam como escrever código seguro