PHP-FPM se presenta como una alternativa superior al estándar PHP FastCGI, ofreciendo características que son particularmente beneficiosas para sitios web con alto tráfico. Funciona a través de un proceso maestro que supervisa un conjunto de procesos de trabajo. Para una solicitud de script PHP, es el servidor web el que inicia una conexión proxy FastCGI al servicio PHP-FPM. Este servicio tiene la capacidad de recibir solicitudes ya sea a través de puertos de red en el servidor o sockets Unix.
A pesar del papel intermedio de la conexión proxy, PHP-FPM necesita estar operativo en la misma máquina que el servidor web. La conexión que utiliza, aunque basada en proxy, difiere de las conexiones proxy convencionales. Al recibir una solicitud, un trabajador disponible de PHP-FPM la procesa—ejecutando el script PHP y luego reenviando los resultados de vuelta al servidor web. Después de que un trabajador concluye el procesamiento de una solicitud, vuelve a estar disponible para solicitudes futuras.
Pero, ¿qué es CGI y FastCGI?
CGI
Normalmente, las páginas web, archivos y todos los documentos que se transfieren del servidor web al navegador se almacenan en un directorio público específico como home/user/public_html. Cuando el navegador solicita cierto contenido, el servidor verifica este directorio y envía el archivo requerido al navegador.
Si CGI está instalado en el servidor, el directorio específico cgi-bin también se agrega allí, por ejemplo, home/user/public_html/cgi-bin. Los scripts CGI se almacenan en este directorio. Cada archivo en el directorio se trata como un programa ejecutable. Al acceder a un script desde el directorio, el servidor envía una solicitud a la aplicación responsable de este script, en lugar de enviar el contenido del archivo al navegador. Después de que se completa el procesamiento de los datos de entrada, la aplicación envía los datos de salida al servidor web, que reenvía los datos al cliente HTTP.
Por ejemplo, cuando se accede al script CGI http://mysitename.com/cgi-bin/file.pl, el servidor ejecutará la aplicación Perl apropiada a través de CGI. Los datos generados a partir de la ejecución del script serán enviados por la aplicación al servidor web. El servidor, por otro lado, transferirá los datos al navegador. Si el servidor no tuviera CGI, el navegador habría mostrado el código del archivo .pl. (explicación de aquí)
FastCGI
FastCGI es una tecnología web más nueva, una versión mejorada de CGI ya que la funcionalidad principal sigue siendo la misma.
La necesidad de desarrollar FastCGI surgió debido al rápido desarrollo y complejidad de las aplicaciones, así como para abordar las deficiencias de escalabilidad de la tecnología CGI. Para satisfacer esos requisitos, Open Market introdujo FastCGI – una versión de alto rendimiento de la tecnología CGI con capacidades mejoradas.
disable_functions bypass
Es posible ejecutar código PHP abusando de FastCGI y evitando las limitaciones de disable_functions.
Via Gopherus
No estoy seguro de si esto funciona en versiones modernas porque lo intenté una vez y no ejecutó nada. Por favor, si tienes más información sobre esto, contáctame a través del [grupo de telegram PEASS & HackTricks aquí](https://t.me/peass), o twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Usando Gopherus puedes generar una carga útil para enviar al oyente FastCGI y ejecutar comandos arbitrarios:
Subiendo y accediendo a este script, el exploit se enviará a FastCGI (deshabilitando disable_functions) y los comandos especificados se ejecutarán.
PHP exploit
No estoy seguro de si esto funciona en versiones modernas porque lo intenté una vez y no pude ejecutar nada. De hecho, logré ver que phpinfo() de la ejecución de FastCGI indicaba que disable_functions estaba vacío, pero PHP (de alguna manera) aún me estaba impidiendo ejecutar cualquier función previamente deshabilitada. Por favor, si tienes más información sobre esto, contáctame a través de [PEASS & HackTricks telegram group here](https://t.me/peass), o twitter [@carlospolopm](https://twitter.com/hacktricks_live).
Este es un script php para explotar el protocolo fastcgi para eludir open_basedir y disable_functions.
Te ayudará a eludir disable_functions estrictos para RCE cargando la extensión maliciosa.
Puedes acceder a él aquí: https://github.com/w181496/FuckFastcgi o a una versión ligeramente modificada y mejorada aquí: https://github.com/BorelEnzo/FuckFastcgi
Encontrarás que el exploit es muy similar al código anterior, pero en lugar de intentar eludir disable_functions usando PHP_VALUE, intenta cargar un módulo PHP externo para ejecutar código usando los parámetros extension_dir y extension dentro de la variable PHP_ADMIN_VALUE.
NOTA1: Probablemente necesitarás recompilar la extensión con la misma versión de PHP que está usando el servidor (puedes verificarlo dentro de la salida de phpinfo):
NOTA2: Logré hacer que esto funcionara insertando los valores de extension_dir y extension dentro de un archivo de configuración PHP .ini (algo que no podrás hacer atacando un servidor). Pero por alguna razón, al usar este exploit y cargar la extensión desde la variable PHP_ADMIN_VALUE, el proceso simplemente murió, así que no sé si esta técnica sigue siendo válida.
Vulnerabilidad de Ejecución Remota de Código PHP-FPM (CVE-2019–11043)