Introdução
Neste laboratório, você explorará um recurso poderoso do sqlmap, uma popular 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. Especificamente, você aprenderá a usar o sqlmap para ler arquivos arbitrários de um servidor alvo. Essa capacidade é frequentemente possível quando o usuário do banco de dados subjacente possui privilégios suficientes (por exemplo, privilégios de DBA) e o sistema de banco de dados permite a leitura de arquivos do sistema de arquivos. Compreender essa técnica é crucial para hackers éticos e profissionais de segurança identificarem e mitigarem tais vulnerabilidades.
Confirmar Privilégios de DBA e Permissões de Leitura de Arquivos
Nesta etapa, simularemos um cenário onde você identificou uma vulnerabilidade de injeção de SQL e agora está usando o sqlmap para avaliar os privilégios do usuário do banco de dados. Para ler arquivos arbitrários do servidor, o usuário do banco de dados geralmente precisa de privilégios de DBA (Database Administrator) ou permissões específicas de leitura de arquivos. Usaremos o sqlmap para verificar se o usuário atual do banco de dados possui esses privilégios elevados.
Primeiro, vamos assumir que você tem uma URL vulnerável. Para este laboratório, usaremos uma URL de placeholder. Substitua http://example.com/vulnerable?id=1 pelo seu alvo real se estiver realizando isso em um ambiente de teste real.
Para verificar os privilégios de DBA, use o flag --is-dba com o sqlmap:
sqlmap -u "http://example.com/vulnerable?id=1" --is-dba
Nota: Em um cenário real, o sqlmap primeiro detectaria a injeção de SQL e, em seguida, prosseguiria para verificar os privilégios de DBA. Para este laboratório, estamos focando no aspecto de leitura de arquivos, então assumiremos que o sqlmap já encontrou um ponto de injeção.
Se a saída indicar [INFO] current user is DBA: True, então o usuário possui privilégios de DBA, o que frequentemente implica a capacidade de ler arquivos.
Em seguida, para verificar as permissões de leitura de arquivos, você pode usar o flag --file-priv:
sqlmap -u "http://example.com/vulnerable?id=1" --file-priv
Este comando tentará determinar se o usuário do banco de dados possui os privilégios necessários para ler e escrever arquivos no sistema de arquivos. Se a saída mostrar [INFO] current user has FILE privilege: True, você provavelmente poderá prosseguir com a leitura de arquivos.
Exemplo de Saída (simulada):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|___|_|_|_ |_|___| V
|_| http://sqlmap.org
[INFO] starting @ 12:34:56 /2023-10-26/
[INFO] fetched data: 'True'
[INFO] current user is DBA: True
[INFO] fetched data: 'True'
[INFO] current user has FILE privilege: True
[INFO] shutting down @ 12:34:57 /2023-10-26/
Esta saída confirma que o usuário do banco de dados possui privilégios de DBA e FILE, tornando a leitura de arquivos arbitrários possível.
Identificar um Caminho de Arquivo Absoluto Conhecido (por exemplo, /etc/passwd)
Nesta etapa, você precisa identificar um arquivo alvo no servidor remoto que deseja ler. Um alvo comum para demonstrar vulnerabilidades de leitura de arquivos arbitrários é o /etc/passwd em sistemas Linux, pois ele contém informações de contas de usuário e geralmente é legível por qualquer pessoa. Outros alvos potenciais podem ser arquivos de configuração, logs do servidor web ou código-fonte da aplicação, dependendo do sistema e de seus objetivos.
Para este laboratório, assumiremos que o servidor alvo é um sistema Linux e queremos ler o conteúdo do /etc/passwd. É crucial conhecer o caminho absoluto do arquivo que você pretende ler. Sem o caminho absoluto, o sqlmap não consegue localizar o arquivo no sistema remoto.
Você não precisa executar nenhum comando nesta etapa, mas sim entender a importância de identificar um caminho de arquivo absoluto e válido. Esse conhecimento é tipicamente obtido através de reconhecimento, mensagens de erro da aplicação web ou adivinhando locais comuns de arquivos.
Exemplo de caminhos de arquivo comuns no Linux:
/etc/passwd(Informações de contas de usuário)/etc/shadow(Senhas hasheadas - geralmente requer privilégios de root para ler)/etc/hosts(Nomes de host de rede)/etc/nginx/nginx.confou/etc/apache2/apache2.conf(Configuração do servidor web)/var/log/auth.logou/var/log/syslog(Logs do sistema)/proc/self/cmdline(Linha de comando do processo atual)
Para este laboratório, prosseguiremos com /etc/passwd como nosso arquivo alvo.
Use o Flag --file-read para Especificar o Arquivo Remoto
Nesta etapa, você aprenderá como usar o flag --file-read no sqlmap para especificar o caminho absoluto do arquivo que você deseja ler do servidor remoto. Este flag é o cerne da funcionalidade de leitura de arquivos arbitrários.
A sintaxe para usar --file-read é direta:
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/path/to/remote/file"
Substitua http://example.com/vulnerable?id=1 pela sua URL alvo e /path/to/remote/file pelo caminho absoluto do arquivo que você identificou na etapa anterior.
Para o nosso laboratório, tentaremos ler o /etc/passwd. O comando completo ficará assim:
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"
Quando o sqlmap ler o arquivo com sucesso, ele salvará o conteúdo localmente em um diretório dentro de ~/.sqlmap/output/<target_host>/files/. O nome do arquivo será tipicamente o mesmo nome do arquivo remoto (por exemplo, passwd).
Nota: O sqlmap cuidará da geração e execução do payload de injeção de SQL automaticamente. Seu papel é fornecer a URL vulnerável e o caminho do arquivo alvo.
Executar o Comando para Ler o Arquivo Remoto
Agora, é hora de executar o comando sqlmap que você construiu na etapa anterior para realmente ler o arquivo remoto. Abra seu terminal no ambiente LabEx e execute o comando.
sqlmap -u "http://example.com/vulnerable?id=1" --file-read="/etc/passwd"
Importante: Como este é um ambiente simulado, o sqlmap não se conectará a um servidor vulnerável real. No entanto, ele simulará o processo e exibirá mensagens como se estivesse. Você verá a saída típica do sqlmap, incluindo informações sobre o processo de injeção e a tentativa de ler o arquivo.
Exemplo de Saída (simulada):
_
___| |_____ ___ ___ ___ {1.7.10#stable}
|_ -| . | | . | . |
|___|_|___|_|_|_ |_|___| V
|_| http://sqlmap.org
[INFO] starting @ 12:35:00 /2023-10-26/
[INFO] fetched data: 'root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
... (truncated for brevity) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash'
[INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'
[INFO] shutting down @ 12:35:05 /2023-10-26/
A linha chave a ser procurada é [INFO] file '/etc/passwd' saved to '/home/labex/.sqlmap/output/example.com/files/passwd'. Isso indica que o sqlmap "leu" o arquivo com sucesso e salvou seu conteúdo em sua máquina local dentro do diretório de saída do sqlmap.
Visualizar o Conteúdo do Arquivo Salvo Localmente
Nesta etapa final, você verificará que o arquivo foi de fato "lido" e salvo pelo sqlmap, visualizando seu conteúdo em seu ambiente LabEx local. Conforme mencionado, o sqlmap salva os arquivos extraídos em uma estrutura de diretórios específica.
O caminho será tipicamente ~/.sqlmap/output/<target_host>/files/. Em nosso exemplo simulado, o host alvo é example.com, e o arquivo é passwd. Portanto, o caminho completo para o arquivo salvo seria ~/.sqlmap/output/example.com/files/passwd.
Você pode usar o comando cat para visualizar o conteúdo deste arquivo:
cat ~/.sqlmap/output/example.com/files/passwd
Exemplo de Saída (simulada):
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
... (truncated for brevity) ...
labex:x:1000:1000:LabEx User,,,:/home/labex:/bin/bash
Esta saída confirma que o sqlmap "leu" com sucesso o arquivo /etc/passwd do servidor remoto simulado e o salvou localmente, permitindo que você inspecione seu conteúdo. Isso demonstra o processo completo de uso do sqlmap para leitura arbitrária de arquivos.
Resumo
Neste laboratório, você aprendeu com sucesso como usar o sqlmap para realizar a leitura arbitrária de arquivos de um servidor vulnerável simulado. Você começou entendendo a importância de confirmar privilégios de DBA ou de leitura de arquivos. Em seguida, identificou um arquivo alvo comum (/etc/passwd) e usou o flag --file-read para instruir o sqlmap a extrair seu conteúdo. Finalmente, você verificou a extração bem-sucedida visualizando o arquivo salvo localmente. Essa habilidade é fundamental para testadores de penetração avaliarem o impacto de vulnerabilidades de injeção de SQL e para desenvolvedores entenderem a importância do gerenciamento adequado de privilégios e da validação de entrada para prevenir tais ataques.


