¿Activado cgi.fix_pathinfo sigue siendo "peligroso" en Nginx?

2 respuestas

2

No describiría este cambio como "crítico" per se, pero todavía tiene implicaciones de seguridad. No tengo conocimiento de nada que haya cambiado fundamentalmente desde que el consejo se volvió relevante: el comportamiento de PHP tiende fuertemente hacia la compatibilidad hacia atrás, incluso cuando eso tiene implicaciones de seguridad. Imagine que tiene un servidor que permite a las personas cargar archivos en el servidor, por ejemplo, en un directorio llamado upload . Ahora, su secuencia de comandos de carga tiene cuidado de permitir solo los archivos con ciertas extensiones (por ejemplo, solo .png ) para garantizar que nadie cargue un archivo PHP malicioso.

Ahora, como atacante, intentaré escribir un shell PHP en un archivo, nombrar el archivo evil.png y subirlo. Cuando se cargue, visitaré http://example.com/upload/evil.png , pero descubriré que esto simplemente me descarga el archivo: nginx nunca envió la solicitud a php-fcgi para que se procese como php, porque el nombre del archivo termina en .png .

Si soy un atacante que conoce PATH_INFO , a continuación intentaré con http://example.com/upload/evil.png/index.php . Si su servidor está configurado de este modo, esto resultará en la ejecución de PHP (porque nginx ve el index.php al final) y PHP recorrerá la ruta hasta que encuentre un componente que sea un archivo, no un directorio ( evil.png ) y tratar de ejecutarlo. Entonces mi shell se ejecuta y gano.

Dicho esto, hay mejores maneras de lidiar con esto haciendo que la configuración de NGINX divida la ruta de antemano, por lo que PHP no está caminando por el sistema de archivos.

De excelente de Neal Poole publicación de blog sobre el problema :

# Pass all .php files onto a php-fpm/php-fcgi server.
location ~ \.php$ {
   # Zero-day exploit defense.
   # http://forum.nginx.org/read.php?2,88845,page=3
   # Won't work properly (404 error) if the file is not stored on this server, which is entirely possible with php-fpm/php-fcgi.
   # Comment the 'try_files' line out if you set up php-fpm/php-fcgi on another machine.  And then cross your fingers that you won't get hacked.
   try_files $uri =404;

   fastcgi_split_path_info ^(.+\.php)(/.+)$;
   include fastcgi_params;
   fastcgi_index index.php;
   fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
   fastcgi_pass php;
}
    
respondido por el David 11.01.2018 - 17:58
fuente
2

Incluso ahora parece que conlleva peligro debido a que PHP aún está procesando el script desde la primera vez que aparece el archivo encontrado. Entonces, ¿por qué mantuvieron el valor predeterminado como ;cgi.fix_pathinfo=1 entonces?

Porque CGI es independiente de PHP y tiene su propio estándar. CGI (Common Gateway Interface) es una interfaz que instruye al servidor sobre cómo comunicar datos con las aplicaciones, cómo se pasa la información de la solicitud y el cuerpo, desde la entrada hasta la salida. Los servidores de Web pueden configurarse para ejecutar un programa como CGI , lo que significa que reenviarán los datos de solicitud a un programa específico. Y así es como NGinx pasa la solicitud a PHP.

Hablando de Estándar CGI , los desarrolladores de PHP-FPM deben cumplir con el estándar CGI tal como se indica en el archivo PHP-FPM ini ex: /etc/php/7.2/fpm/php.ini :

; cgi.fix_pathinfo provides *real* PATH_INFO/PATH_TRANSLATED support for CGI.  PHP's
; previous behaviour was to set PATH_TRANSLATED to SCRIPT_FILENAME, and to not grok
; what PATH_INFO is.  For more information on PATH_INFO, see the cgi specs.  Setting
; this to 1 will cause PHP CGI to fix its paths to conform to the spec.  A setting
; of zero causes PHP to behave as before.  Default is 1.  You should fix your scripts
; to use SCRIPT_FILENAME rather than PATH_TRANSLATED.
; http://php.net/cgi.fix-pathinfo
;cgi.fix_pathinfo=1

Supongo que el texto Setting this to 1 will cause PHP CGI to fix its paths to conform to the spec. A setting of zero causes PHP to behave as before. explica la elección. Aquí está la PATH_INFO CGI Spec .

    
respondido por el KeitelDOG 28.11.2018 - 19:39
fuente

Lea otras preguntas en las etiquetas