EXPLICAÇÃO DE INJEÇÃO DE SQL
Introdução
Olá a todos! É @gHost. Hoje, vou orientá-lo em uma explicação detalhada sobre a arte da SQL Injection. O SQL Injection é um ataque extremamente fácil de executar, portanto, a maioria das pessoas assiste a alguns tutoriais online em que um cara faz um ataque em 7 minutos no Kali Linux. Só porque você faz isso, isso não faz de você um hacker blackhat ou um especialista em SQLi. Acredite em mim, cometi o mesmo erro de seguir tutoriais aleatórios sem dominar os fundamentos. Para realizar ataques SQL avançados, você precisa ter um conhecimento intermediário para avançado em SQL.
Este será um tópico longo, então posso imaginar as pessoas respondendo dizendo que copiei/colei isso, o que é compreensível. O guia que estou escrevendo é uma versão resumida do livro de 500 páginas de Justin Clarke, SQL Injection Attacks & Defense. Todos os códigos e imagens usados neste tópico são de seu livro. No entanto, o tópico é escrito por mim. Nem uma única frase é copiada do referido livro. Se você quiser checar, fique à vontade. Terei o maior prazer em lhe enviar o livro. Então, com isso fora do caminho, vamos começar.
O que é SQL Injection?
SQL Injection é uma vulnerabilidade que ocorre quando um invasor é capaz de influenciar consultas SQL para fins mal-intencionados enquanto passa para o banco de dados de back-end. O invasor é capaz de influenciar o que é repassado com o front-end e o back-end do banco de dados. Ao fazer isso, ele pode obter dados extremamente confidenciais, como nomes de usuário, senhas, locais, e-mails, IPs, etc., e também despejar todo o banco de dados do site. Embora a maioria dos sites use criptografia para armazenar as senhas de seus usuários, com mais equipamentos de alta tecnologia com enorme poder computacional tornando-se cada vez mais disponíveis ao público, com o equipamento certo ou terceirizando o processo de quebra de hash, um hacker é capaz de quebrar uma senha muito forte dentro de algumas semanas, no máximo.
Arquitetura de aplicativo da Web
Antes de atacar um site, devemos entender como o site funciona e aprender mais sobre sua arquitetura. Informações prévias sobre o alvo são extremamente cruciais em qualquer ataque, o mesmo vale para SQL Injection.
Existem dois tipos principais de sites. Sites estáticos e sites dinâmicos. Um site estático é um site codificado apenas usando HTML, CSS ou Javascript. Enquanto isso, um site dinâmico com um site que usa um banco de dados para armazenar e recuperar dados para tornar o site mais interativo. Wix, Wordpress, etc, são construtores de sites dinâmicos, enquanto GatsbyJS, Jekyll são usados para gerar sites estáticos.
No SQL Injection, nos concentramos em sites dinâmicos ou baseados em banco de dados. O tipo mais comum de site de unidade de banco de dados é uma loja de comércio eletrônico. Em um site como este, informações essenciais como ID do cliente, ID do produto, preços, endereço, número de telefone, etc., são armazenadas no banco de dados do site.
Por exemplo, digamos que John se inscreve em uma conta em X.com, uma loja de comércio eletrônico. Ao se cadastrar, ele fornece informações como nome completo, endereço, telefone etc. Todas essas informações serão armazenadas na tabela de clientes do site. Quando John deseja comprar um par de óculos de sol, ele busca por Óculos de sol no site e localiza todos os itens relacionados à consulta, neste caso, óculos de sol da tabela de óculos de sol no banco de dados de produtos. É assim que um banco de dados opera em um site dinâmico. Solicitando consultas e fazendo atualizações no banco de dados.
Aqui está um exemplo de script PHP que mostra como a entrada do usuário é passada para uma instrução SQL criada dinamicamente.
// conecta ao banco de dados
$conn = mysql_connect("localhost","username","password");
// constrói dinamicamente a instrução sql com a entrada
$query = "SELECT * FROM Products WHERE Price < '$_GET["val"]' " .
"PEDIR POR Descrição do Produto";
// executa a consulta no banco de dados
$result = mysql_query($query);
// iterar através do conjunto de registros
while($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
// exibir os resultados para o navegador
echo "Description : {$row['ProductDescription']} <br>" .
"ID do produto :
}
O exemplo acima mostra como a instrução SQL criada pelo script PHP. No caso acima, o extrato retornará todos os produtos nos bancos de dados do site com valor inferior a US$ 100.
Um aplicativo da Web tem principalmente três camadas.
Camada de apresentação: o mecanismo de renderização. (Exemplo: navegador da Web)
Camada Lógica: Linguagens de programação (C#, ASP, .NET, PHP)
Camada de armazenamento: um sistema de gerenciamento de banco de dados (MySQL, Oracle, Microsoft SQL Server)
Figura 01: Uma arquitetura simples de três camadas
[Imagem: 1.PNG]
A camada de apresentação, também conhecida como front-end, é o que o usuário vê. Ele exibe várias informações relacionadas à navegação, como preços, produtos disponíveis, descontos, etc. A camada lógica atua como uma camada separada e lida com a funcionalidade de aplicativos da Web, realizando processamento de alto nível. A camada de armazenamento ou back-end é onde todos os dados são armazenados e recuperados. Essa camada é independente da apresentação e da camada lógica.
Arquitetura complexa de aplicativos da Web
A principal desvantagem de usar um modelo de três camadas é que ele não é escalável. Por esse motivo, partindo de um conceito de escalabilidade e manutenibilidade, foi criado o paradigma de desenvolvimento de aplicações n-tier. Dentro deste paradigma, foi construída uma solução de quatro camadas onde foi adicionado um elemento especial chamado Application Server que o modelo de três camadas não possuía. Um servidor de aplicativos é um servidor cuja função principal é hospedar interfaces de programação de aplicativos (APIs) para expor a lógica operacional e o processo para uso por outros aplicativos.
Figura 02: Uma arquitetura de quatro camadas
[Imagem: 2.PNG]
Na figura acima, o navegador da web envia uma solicitação específica para a camada intermediária que é a lógica e, em seguida, a lógica chama a API do servidor de aplicativos e executa a solicitação adicionando ou recuperando dados do banco de dados. Isso é o que acontece simplesmente em um modelo de quatro camadas.
Mergulhando fundo nos ataques de injeção de SQL
SQL Injection é um ataque em que o código SQL malicioso é injetado no aplicativo, mais comumente os parâmetros de entrada que são passados para os servidores de backup para execução. Devido à natureza diversa do SQL, um invasor pode codificar códigos maliciosos de várias maneiras. Principalmente e mais comumente, inserção direta de código em parâmetros concatenados com comandos SQL na técnica utilizada. No entanto, um ataque menos direto seria injetar código malicioso na string que é enviada para ser armazenada no banco de dados e, uma vez armazenada, para ser executada. Um invasor é capaz de modificar instruções SQL onde recebe os mesmos direitos que o usuário do aplicativo.
Vou explicar isso usando o exemplo anterior. (produtos inferiores a $ 100)
http://www.victimwebsite.com/products.php?val=100
Veremos agora como você pode injetar seus próprios comandos SQL inserindo-os no parâmetro de entrada, o que pode ser feito anexando a string 'OR '1' = '1 na URL.
http://www.victimwebsite.com/products/su...hp?val=100 ' OR '1' = '1
Quando você executar esta URL, o script PHP será executado e retornará todos os produtos que estão no banco de dados ignorando seus preços. Isso acontece porque modificamos e alteramos a lógica da consulta.
Esta é a consulta criada:
SELECT *
FROM ProductsTbl
WHERE Price < '100,00' OR '1'='1'
ORDER BY ProductDescription;
Este exemplo de como um invasor pode manipular uma instrução SQL e obter acesso a dados que não deveriam ser acessíveis a ninguém.
Sistemas de gerenciamento de conteúdo (CMS)
Um sistema de gerenciamento de conteúdo é basicamente um aplicativo da Web usado para gerenciar e publicar conteúdo em um site sem ter nenhum tipo de conhecimento de codificação.
Acessando o aplicativo CMS:
http://www.victimwebsite.com/cms/login. … sword=pass
Para acessar a funcionalidade de um CMS, é necessário que você faça login com credenciais válidas; caso contrário, ocorreria um erro de login.
// conecta ao banco de dados
$conn = mysql_connect("localhost","username","password");
// construa dinamicamente a instrução sql com a entrada
$query = "SELECT userid FROM CMSUsers WHERE user = '$_GET["user"]' " .
"E senha = '$_GET["senha"]'";
// verifica quantas linhas foram retornadas do banco de dados
$rowcount = mysql_num_rows($result);
// se uma linha for retornada, então as credenciais devem ser válidas, então
// encaminhe o usuário para as páginas de administração
if ($rowcount != 0){ header("Location: admin.php");}
// se for uma linha não for retornado, as credenciais devem ser inválidas
senão { die('Nome de usuário ou senha incorretos, tente novamente.')}
Aqui está a instrução SQL que o script PHP constrói e executa:
SELECT userid
FROM CMSUsers
WHERE user = 'root' AND senha = 'passa';
Semelhante ao que fizemos anteriormente, podemos modificar a lógica da consulta para que possamos obter todos os userids.
http://www.victimwebsite.com/cms/login. … root&' OR '1' = '1
Esta é a query que será construída e executada:
SELECT userid
FROM CMSUsers
WHERE user = 'root' AND password = 'pass' OR '1'='1';
Se o banco de dados retornar mais de zero registros, isso significa que nossa lógica está correta e nosso script deu acesso ao script admin.php.