Explorar Vulnerabilidades de Injeção SQL no Nmap

Beginner

Introdução

Bem-vindo a este laboratório interativo! Nosso foco são as vulnerabilidades de injeção SQL - um risco prevalente e sério para aplicações web. Em termos simples, ataques de injeção SQL ocorrem quando uma aplicação recebe dados que não foram devidamente verificados ou codificados, e esses dados são incluídos em uma consulta SQL. Essa brecha pode permitir que cibercriminosos executem comandos SQL prejudiciais, o que pode levar ao acesso não autorizado a dados confidenciais ou permitir que eles realizem outras ações nocivas.

O objetivo deste laboratório é duplo. Em primeiro lugar, pretendemos desmistificar os conceitos básicos das vulnerabilidades de injeção SQL, dividindo-os em partes compreensíveis. Em segundo lugar, fornecemos prática prática para ajudá-lo a aprender como explorar essas vulnerabilidades, não com intenção maliciosa, mas para melhor compreendê-las e preveni-las. Essa abordagem prática irá equipá-lo com o conhecimento e as habilidades para proteger suas aplicações contra tais ameaças.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível intermediário com uma taxa de conclusão de 75%. Recebeu uma taxa de avaliações positivas de 97% dos estudantes.

Configurar o Ambiente do Laboratório

Nesta seção, vamos guiá-lo pelo processo de configuração de um ambiente de laboratório onde você pode praticar ataques de injeção SQL.

  1. Baixar a Imagem Docker do DVWA:
    A imagem Docker do DVWA está disponível no Docker Hub. Você pode baixá-la usando o seguinte comando:

    docker pull vulnerables/web-dvwa
  2. Executar o Container Docker do DVWA:
    Após baixar a imagem, você pode executá-la com o seguinte comando:

    docker run -d -p 80:80 --name dvwa vulnerables/web-dvwa

    Este comando iniciará um novo container e mapeará a porta 80 no container para a porta 80 na sua máquina host.

A etapa acima prepara o ambiente necessário para o laboratório. Após a conclusão da configuração, inicie o navegador Firefox em sua área de trabalho e insira a seguinte URL: http://localhost.

Após um breve momento, você se encontrará na página de login. As credenciais padrão são as seguintes: nome de usuário - "admin" e senha - "password".

Você será recebido pela página web do DVWA (Damn Vulnerable Web Application). Clique no botão "Create/Reset Database" para gerar um novo banco de dados para a aplicação.

Nota Importante: Para o propósito deste laboratório, definiremos o nível de segurança como "low" (baixo). Este ajuste torna as vulnerabilidades de injeção SQL mais evidentes. Para fazer isso, selecione "low" no menu suspenso "Security Level" (Nível de Segurança) e, em seguida, clique no botão "Submit" (Enviar).

Identificar o Ponto de Injeção SQL

Neste módulo, vamos descobrir a presença de uma vulnerabilidade de injeção SQL em uma aplicação.

No menu do lado esquerdo da aplicação, você encontrará um link rotulado como "SQL Injection" (Injeção SQL). Clique neste link para navegar para a página de Injeção SQL. Aqui, você encontrará um formulário solicitando um ID de usuário.

Passo 2: Inserir um ID de Usuário de Exemplo

Vamos tentar inserir um ID de usuário para ver o que acontece.

Exemplo de Entrada:

1

Digite "1" no formulário e clique no botão "Submit" (Enviar). A saída deve exibir detalhes sobre um usuário com o ID 1.

Passo 3: Inspecionar o Código-Fonte

Ao clicar no botão "View Source" (Ver Código-Fonte), você pode inspecionar o código-fonte da página. Você deve ver algo semelhante ao seguinte código PHP:

$id = $_GET['id'];
$sql = "SELECT first_name, last_name FROM users WHERE user_id = '$id';";
$result = mysqli_query($conn, $sql);

Este código revela que a aplicação constrói uma consulta SQL concatenando a entrada do usuário diretamente com a instrução SQL. Este é um erro comum que pode potencialmente criar vulnerabilidades de injeção SQL.

Passo 4: Confirmar a Vulnerabilidade de Injeção SQL

Para verificar a existência de uma vulnerabilidade de injeção SQL, vamos tentar injetar uma aspa simples (') após o valor "1". Insira o seguinte no formulário:

1'

Se você vir uma mensagem de erro do banco de dados, isso significa que a aplicação é de fato vulnerável a ataques de injeção SQL. Este é um passo fundamental na identificação e, subsequentemente, no tratamento de tais vulnerabilidades.

Determinar o Tipo de Injeção SQL e o Tipo de Banco de Dados

Nesta seção, vamos guiá-lo pelo processo de identificação do tipo de vulnerabilidade de injeção SQL e do tipo de banco de dados que está sendo usado por uma determinada aplicação.

Nosso primeiro objetivo é determinar o número de colunas que estão sendo retornadas pela consulta SQL original. Para conseguir isso, empregaremos a cláusula ORDER BY.

Código de Exemplo:

1' ORDER BY 1#
1' ORDER BY 2#
1' ORDER BY 3#

Por favor, insira as instruções SQL acima uma por uma no formulário. Se a aplicação se comportar como esperado, as duas primeiras consultas serão executadas sem erros, enquanto a terceira resultará em uma falha. Essa falha indica que a consulta SQL original está retornando duas colunas.

Em seguida, podemos usar o operador UNION para extrair dados adicionais do banco de dados.

Código de Exemplo:

1' UNION SELECT version(), @@version_compile_os#

Esta instrução SQL buscará a versão do banco de dados e a versão do sistema operacional em que ele está sendo executado.

Após executar esta consulta, a saída deve exibir as informações sobre a versão do banco de dados e o sistema operacional.

Recuperar o Nome do Banco de Dados

Nesta lição, vamos guiá-lo pelo processo de recuperação do nome de um banco de dados que uma aplicação está usando. Esta é uma habilidade essencial, especialmente quando você está tentando entender a estrutura e organização de um banco de dados.

Código de Exemplo:

1' UNION SELECT database(), user()#

A consulta SQL acima é um exemplo de uma técnica chamada "SQL Injection" (Injeção SQL). É uma técnica de injeção de código que os invasores usam para explorar uma vulnerabilidade de segurança que ocorre na camada de banco de dados de uma aplicação. Esta consulta específica recupera o nome do banco de dados atual e o usuário que está executando a consulta.

Aqui está o que está acontecendo:

  • 1' UNION: Esta é a primeira parte da injeção SQL. A parte 1' serve para completar a consulta que a aplicação provavelmente está executando. A palavra-chave UNION é usada para combinar os resultados de duas ou mais instruções SELECT sem retornar nenhuma linha duplicada.
  • SELECT database(), user()#: Esta parte da consulta é o payload que você está injetando. A função database() recupera o nome do banco de dados atual, e a função user() recupera o nome do usuário que está executando a consulta.

Após enviar a consulta, você deve esperar ver o nome do banco de dados e as informações do usuário na saída. Esta informação pode ser essencial para entender melhor a estrutura do banco de dados e os privilégios do usuário no contexto da aplicação.

Lembre-se, entender essas técnicas não apenas ajuda a explorar vulnerabilidades, mas também a criar aplicações seguras, sabendo contra o que se defender.

Recuperar Nomes de Tabelas

Nesta lição, daremos um passo adiante para explorar mais sobre a estrutura do banco de dados, recuperando os nomes das tabelas nele contidas. Entender a estrutura da tabela é crucial ao tentar extrair ou manipular dados em um banco de dados.

Código de Exemplo:

1' UNION SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa'#

A consulta SQL acima continua a utilizar a técnica de SQL Injection (Injeção SQL). Desta vez, ela é usada para recuperar os nomes das tabelas no banco de dados e seus respectivos esquemas de banco de dados.

Aqui está a análise:

  • 1' UNION: Como explicado anteriormente, esta parte tem como objetivo completar a consulta provável da aplicação e combiná-la com nosso payload injetado.
  • SELECT table_name, table_schema FROM information_schema.tables WHERE table_schema = 'dvwa': Esta parte da consulta é nosso payload injetado. Ele recupera os nomes das tabelas e seus respectivos esquemas de banco de dados da tabela do sistema information_schema.tables, especificamente para o esquema 'dvwa'.

A information_schema.tables é uma tabela do sistema que contém informações sobre todas as tabelas no banco de dados. O table_schema se refere ao nome do banco de dados do qual a tabela faz parte, e table_name é o nome da tabela.

Após enviar a consulta, você deve esperar ver os nomes das tabelas e seus respectivos esquemas de banco de dados na saída. Esta informação pode fornecer um roteiro para exploração ou exploração adicional do banco de dados.

Como sempre, lembre-se que entender essas técnicas é essencial não apenas para explorar vulnerabilidades, mas também para criar aplicações seguras, entendendo contra o que se defender.

Recuperar Nomes de Colunas e Dados

Nesta lição, vamos nos aprofundar na estrutura do banco de dados, recuperando os nomes das colunas de uma tabela específica. Com este conhecimento, podemos então extrair dados potencialmente sensíveis da tabela.

Código de Exemplo:

1' UNION SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users'#

A consulta SQL acima usa SQL Injection para recuperar os nomes das colunas da tabela 'users'. Ela concatena esses nomes de colunas em uma única string para facilitar a visualização.

Aqui está a análise:

  • 1' UNION: Como explicado anteriormente, esta parte tem como objetivo completar a consulta provável da aplicação e combiná-la com nosso payload injetado.
  • SELECT 1, group_concat(column_name) FROM information_schema.columns WHERE table_name = 'users': Esta parte da consulta é nosso payload injetado. Ele recupera os nomes das colunas da tabela 'users' e os concatena em uma única string usando a função group_concat.

Após enviar a consulta, você deve esperar ver os nomes das colunas na saída.

Agora que temos os nomes das colunas, podemos recuperar dados sensíveis da tabela 'users'.

Código de Exemplo:

1' UNION SELECT user, password FROM users#

Esta consulta SQL usa SQL Injection para recuperar as colunas 'user' e 'password' da tabela 'users'.

Após enviar a consulta, você deve esperar ver os nomes de usuário e senhas hash na saída. Esta informação pode ser extremamente sensível, e entender como ela pode ser extraída é essencial tanto para explorar vulnerabilidades quanto para se defender contra tais ataques.

Lembre-se, o objetivo de entender essas técnicas é duplo: identificar potenciais vulnerabilidades e construir aplicações mais seguras.

Resumo

Neste laboratório, você aprendeu sobre as vulnerabilidades de SQL Injection (Injeção SQL) e como explorá-las através da prática. Você configurou uma aplicação web vulnerável, identificou o ponto de SQL Injection, determinou o tipo de SQL Injection e o tipo de banco de dados, e recuperou informações sensíveis do banco de dados explorando a vulnerabilidade de SQL Injection.

Ao completar este laboratório, você adquiriu experiência prática em entender e explorar as vulnerabilidades de SQL Injection, que estão entre as vulnerabilidades de aplicações web mais comuns e perigosas. Este conhecimento o ajudará a identificar e mitigar tais vulnerabilidades em cenários do mundo real, aprimorando suas habilidades de segurança de aplicações web.