Todo o conteúdo fornecido neste post destina-se exclusivamente a fins educacionais, de estudo e desenvolvimento profissional e pessoal. As informações aqui apresentadas são para serem utilizadas de forma ética e profissional, em conformidade com todas as leis e regulamentos aplicáveis.
Sobre
O phpinfo() é uma funcionalidade de depuração que imprime informações detalhadas sobre o sistema e a configuração do PHP.
A documentação oficial do PHP recomenda a criação de um arquivo que chame a função phpinfo() para testar se a instalação do PHP foi bem-sucedida. E acaba sendo um erro comum esquecer de remover este arquivo. As informações vazadas pela função phpinfo() incluem caminhos físicos, variáveis de ambiente e as configurações completas do PHP.
O phpinfo() também é uma ferramenta de depuração, pois consiste em todas as informações que um desenvolvedor deseja saber sobre um servidor. Se alguém fizer upload da função phpinfo() para seu arquivo webroot/index.php, poderá ver as configurações do servidor.
Riscos
Um invasor pode obter informações como:
- Versão exata do PHP.
- SO exato e sua versão.
- Detalhes da configuração do PHP.
- Opções de compilação PHP
- Extensões PHP
- Endereços IP internos.
- Variáveis de ambiente do servidor.
- Extensões PHP carregadas e suas configurações.
- Cabeçalhos HTTP
- phpinfo() Limite de memória
- phpinfo() Carregar tamanho máximo do arquivo
Essas informações podem ajudar um invasor a obter mais informações sobre o sistema. Depois de obter informações detalhadas, o invasor pode pesquisar vulnerabilidades conhecidas do sistema em análise. O invasor também pode usar essas informações durante a exploração de outras vulnerabilidades.
Encontrando php.info expostos em seus sistemas
Duas ferramentas que podem ser utilizadas é o famoso Nmap e Nikto, mas para esse post usarei um template do Nuclei.
- Download do Nuclei: https://github.com/projectdiscovery/nuclei
- Post aqui nesse blog sobre o Nuclei: https://jardel.tec.br/2023/06/20/descubra-o-poder-da-projectdiscovery-io/
- Template para procurar php.info expostos: https://github.com/projectdiscovery/nuclei-templates/blob/main/http/exposures/configs/phpinfo-files.yaml
Executando o template:
cat domains.txt | nuclei -t /home/jjardel/phpinfo-files.yaml
Explicação do comadno:
- cat domains.txt: O comando cat é usado para exibir o conteúdo do arquivo domains.txt no terminal. Ele lê o conteúdo do arquivo e imprime diretamente no terminal. Aqui, ele está sendo usado para mostrar o conteúdo dos domínios contidos no arquivo domains.txt.
- | (pipe): O caractere | é conhecido como pipe. Ele é usado para redirecionar a saída de um comando para a entrada de outro. No caso do seu comando, ele redireciona a saída do cat, que é a lista de domínios do arquivo domains.txt, para o nuclei.
- nuclei -t /home/jjardel/phpinfo-files.yaml: Este é o comando nuclei. Ele é usado para realizar a varredura de vulnerabilidades em alvos da web. Aqui, -t é usado para especificar o modelo de teste YAML que será usado pelo nuclei.
Resultado:
Ao contrário do que o template informa, essa vulnerabilidade pode ser tanto low, medium ou critical (como são definidas os resultados no Nuclei). Tudo vai depender do arquivo de configuração e quais informações podem ser encontradas nele.
Dados expostos
Após a fase de recon, é ir realizar a verificação dos endpoints encontrados. E em um dos endereços, achei informações interessantes sobre o ambiente.
E mais algumas dezenas de informações interessantes estavam expostas devido a essa falha.
Mitigação
1- Remoção do arquivo: Se você não precisa mais do arquivo phpinfo.php, a maneira mais simples de desabilitar o acesso é deletando o arquivo completamente do servidor.
2- Bloqueio por configuração do servidor web: Você pode configurar o seu servidor web (como Apache ou Nginx) para negar o acesso ao arquivo phpinfo.php
Apache (.htaccess ou configuração do VirtualHost):
<Files "phpinfo.php">
Require all denied
</Files>
Nginx (dentro do bloco server):
location = /phpinfo.php {
deny all;
}
3- Renomear o arquivo: Você pode renomear o arquivo phpinfo.php para algo que não seja facilmente adivinhado pelos usuários. Por exemplo, você pode renomear o arquivo para lord_of_the_rings_aragorn_zidane_pamonha_palmeiras_batatinhafrita123.php. No entanto, esta é uma medida pouco segura, pois ainda é possível que os usuários adivinhem o novo nome.
Finalizando
De uma maneira simples e rápida, é fácil encontrar esse tipo de configuração em milhares de servidores.
- Você como profissional de Cybersegurança, deve ter uma postura de sempre imaginar todos os vetores de ataque que podem ser utilizados contra seu ambiente. E um ponto importante, que vou abordar em outro post é ter um bom inventário de ativos, pois você sabendo o que tem no ambiente, fica mais simples definir planos de busca e mitigação de vulnerabilidades.
- Você como bug hunter, tem uma chance de achar algum endpoint interessante para verificar e conseguir alguma recompensa.
- Você como estudante, aprendeu que algo básico como uma configuração do php.info feita de maneira errada, pode deixar vazar informações importantes do ambiente.