Como funciona o ataque de injeção SQL

Índice

Se listarmos as vulnerabilidades em aplicativos da web que tiveram o maior impacto devido ao grau de severidade que podem causar, sem dúvida encontraremos o Injeção SQL. Está vulnerabilidade pode até permitir que o invasor vá desde listar o conteúdo do banco de dados até obter acesso total ao servidorVamos ver em que consiste.

O fim injeção, refere-se a injetar ou anexar instruções SQL em uma consulta que o aplicativo executa no banco de dados, isso é realizado aproveitando qualquer entrada de dados que o aplicativo solicita direta ou indiretamente do usuário, nos referimos diretamente a campos, por exemplo de formulários onde o usuário insere certos dados, indiretamente eles podem ser parâmetros que são passados ​​via URL (GET). O objetivo de injetar instruções SQL na consulta é modificar a lógica dessa consulta ou o resultado que será retornado pelo banco de dados.

Esta é uma forma típica em que um nome de usuário e uma senha são solicitados para acessar uma área privada. O código do lado do servidor que forma a consulta seria algo como o seguinte:

 $ username = $ _POST ['username']; $ senha = $ _POST ['senha']; $ sql = "SELECT * FROM usuários WHERE username = '$ username' AND password = '$ password'"; 
Como podemos ver, primeiro são armazenados o nome de usuário e a senha inseridos nas variáveis ​​nome de usuário e senha respectivamente, depois esses valores são incluídos na consulta que será enviada ao banco de dados para verificar se o referido usuário existe. Suponha que em nosso exemplo o usuário insira como nome de usuário admin e senha pass123, quando o formulário for enviado, a consulta formada será a seguinte:
 SELECT * FROM users WHERE username = 'admin' AND password = 'pass123'
Como podemos ver, quando os dados de entrada são colocados, eles ficam entre aspas simples para representar que se trata de uma string de texto. Esta consulta será enviada ao banco de dados e retornará um resultado com os dados do referido usuário, caso exista, e será permitido o acesso à área privada, caso contrário retornará um resultado vazio e o acesso será negado.

Como mencionamos anteriormente, injeção SQL Consiste em anexar código SQL a uma consulta, e este formulário permite através dos campos de entrada, para que tenhamos uma aplicação vulnerável a injeção SQL.

Explorando vulnerabilidade
O objetivo de explorar esta vulnerabilidade é obter acesso à área privada sem saber o nome de usuário ou senha corretos e explorar a vulnerabilidade. Portanto, o que temos que conseguir é injetar código SQL para formar uma consulta que retorne um resultado válido.

Vamos ver como a consulta é formada se injetarmos o seguinte código SQL no campo de senha:

Quando a consulta for formada, será a seguinte:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' ou 1 = 1 # '
Importante atenção deve ser dada ao fato de que o código inserido está entre as aspas simples que encerram a senha, a aspa simples no início do código inserido é responsável por completar as aspas abertas na parte da senha = 'do consulta, desta forma obtemos temporariamente a seguinte consulta:
 SELECT * FROM users WHERE username = 'hacker' AND password = ''
Esta consulta no momento não retornará resultados, pois não existe tal usuário com essas credenciais, no entanto, vamos analisar o resto do código inserido:
 ou 1 = 1 #
A sentença ou 1 = 1 muda radicalmente a lógica da consulta, pois como sabemos em uma consulta formada pela condicional OU Ele retornará verdadeiro quando pelo menos uma das duas expressões for preenchida, no nosso caso a primeira expressão é nome de usuário = 'hacker' AND senha = '' , e o segundo ou 1 = 1 , o último é sempre verdadeiro, ou seja, 1 é sempre igual a 1, pois a consulta retornará um resultado válido.

Finalmente temos que nos livrar da aspa que fecha a frase, para isso podemos usar os comentários usados ​​em SQL: #, - (traço duplo), o bem /* */ . assim, a consulta completa é:

 SELECT * FROM users WHERE username = 'hacker' AND password = '' ou 1 = 1 # '
Tudo o que vier depois do # será considerado um comentário e não fará parte da consulta.

Para obter um resultado válido, existem muitas outras variações no código que podemos inserir, por exemplo:

wave wave wave wave wave