PHP-FPM é apresentado como uma alternativa superior ao PHP FastCGI padrão, oferecendo recursos que são particularmente benéficos para sites com alto tráfego. Ele opera através de um processo mestre que supervisiona um conjunto de processos de trabalho. Para um pedido de script PHP, é o servidor web que inicia uma conexão proxy FastCGI com o serviço PHP-FPM. Este serviço tem a capacidade de receber pedidos tanto através de portas de rede no servidor quanto de sockets Unix.
Apesar do papel intermediário da conexão proxy, o PHP-FPM precisa estar operacional na mesma máquina que o servidor web. A conexão que ele usa, embora baseada em proxy, difere das conexões proxy convencionais. Ao receber um pedido, um trabalhador disponível do PHP-FPM o processa—executando o script PHP e, em seguida, encaminhando os resultados de volta para o servidor web. Após um trabalhador concluir o processamento de um pedido, ele se torna disponível novamente para pedidos futuros.
Mas o que é CGI e FastCGI?
CGI
Normalmente, páginas web, arquivos e todos os documentos que são transferidos do servidor web para o navegador são armazenados em um diretório público específico, como home/user/public_html. Quando o navegador solicita determinado conteúdo, o servidor verifica este diretório e envia o arquivo necessário para o navegador.
Se CGI estiver instalado no servidor, o diretório específico cgi-bin também é adicionado lá, por exemplo, home/user/public_html/cgi-bin. Scripts CGI são armazenados neste diretório. Cada arquivo no diretório é tratado como um programa executável. Ao acessar um script do diretório, o servidor envia um pedido para a aplicação responsável por este script, em vez de enviar o conteúdo do arquivo para o navegador. Após o processamento dos dados de entrada ser concluído, a aplicação envia os dados de saída para o servidor web, que encaminha os dados para o cliente HTTP.
Por exemplo, quando o script CGI http://mysitename.com/cgi-bin/file.pl é acessado, o servidor executará a aplicação Perl apropriada através do CGI. Os dados gerados pela execução do script serão enviados pela aplicação para o servidor web. O servidor, por sua vez, transferirá os dados para o navegador. Se o servidor não tivesse CGI, o navegador teria exibido o código do arquivo .pl em si. (explicação de aqui)
FastCGI
FastCGI é uma tecnologia web mais nova, uma versão aprimorada do CGI, pois a funcionalidade principal permanece a mesma.
A necessidade de desenvolver o FastCGI surgiu devido ao rápido desenvolvimento e complexidade das aplicações, bem como para abordar as deficiências de escalabilidade da tecnologia CGI. Para atender a esses requisitos, Open Market introduziu FastCGI – uma versão de alto desempenho da tecnologia CGI com capacidades aprimoradas.
disable_functions bypass
É possível executar código PHP abusando do FastCGI e evitando as limitações de disable_functions.
Via Gopherus
Não tenho certeza se isso está funcionando em versões modernas, porque tentei uma vez e não executou nada. Por favor, se você tiver mais informações sobre isso, entre em contato comigo via [grupo do telegram PEASS & HackTricks aqui](https://t.me/peass), ou twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Usando Gopherus, você pode gerar um payload para enviar ao listener FastCGI e executar comandos arbitrários:
Fazendo o upload e acessando este script, a exploração será enviada para o FastCGI (desabilitando disable_functions) e os comandos especificados serão executados.
Exploit PHP
Não tenho certeza se isso está funcionando em versões modernas, porque tentei uma vez e não consegui executar nada. Na verdade, consegui ver que phpinfo() da execução do FastCGI indicava que disable_functions estava vazio, mas o PHP (de alguma forma) ainda estava me impedindo de executar qualquer função previamente desabilitada. Por favor, se você tiver mais informações sobre isso, entre em contato comigo via [grupo do telegram PEASS & HackTricks aqui](https://t.me/peass), ou twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Este é um script php para explorar o protocolo fastcgi para contornar open_basedir e disable_functions.
Ele ajudará você a contornar disable_functions estrito para RCE carregando a extensão maliciosa.
Você pode acessá-lo aqui: https://github.com/w181496/FuckFastcgi ou uma versão ligeiramente modificada e melhorada aqui: https://github.com/BorelEnzo/FuckFastcgi
Você descobrirá que a exploração é muito semelhante ao código anterior, mas em vez de tentar contornar disable_functions usando PHP_VALUE, ela tenta carregar um módulo PHP externo para executar código usando os parâmetros extension_dir e extension dentro da variável PHP_ADMIN_VALUE.
NOTA1: Você provavelmente precisará recompilar a extensão com a mesma versão do PHP que o servidor está usando (você pode verificar isso na saída do phpinfo):
NOTA2: Eu consegui fazer isso funcionar inserindo os valores de extension_dir e extension dentro de um arquivo de configuração PHP .ini (algo que você não conseguirá fazer atacando um servidor). Mas por algum motivo, ao usar essa exploração e carregar a extensão da variável PHP_ADMIN_VALUE, o processo simplesmente parou, então não sei se essa técnica ainda é válida.
Vulnerabilidade de Execução Remota de Código PHP-FPM (CVE-2019–11043)