Non descriverei questo cambiamento come "critico" di per sé, ma ha comunque implicazioni sulla sicurezza. Non sono a conoscenza di tutto ciò che è cambiato radicalmente da quando quel consiglio è diventato rilevante - il comportamento di PHP tende strongmente alla compatibilità con le versioni precedenti, anche quando questo ha implicazioni sulla sicurezza. Immagina di avere un server che consente alle persone di caricare file sul server, ad esempio in una directory chiamata upload
. Ora, lo script di caricamento fa attenzione a consentire solo file con determinate estensioni (ad esempio, solo .png
) per garantire che nessuno carichi un file PHP dannoso.
Ora, come attaccante, cercherò di scrivere una shell PHP in un file, dare un nome al file evil.png
e caricarlo. Quando caricherà, visiterò http://example.com/upload/evil.png
, ma scoprirò che questo mi scarica solo il file - nginx non ha mai inviato la richiesta a php-fcgi per essere elaborata come php, perché il nome del file termina in .png
.
Se sono un utente malintenzionato a conoscenza di PATH_INFO
, successivamente proverò http://example.com/upload/evil.png/index.php
. Se il tuo server è configurato in questo modo, verrà eseguito PHP (perché nginx vede il index.php
alla fine) e PHP percorrerà il percorso fino a trovare un componente che è un file, non una directory ( evil.png
) e tenta di eseguirlo. Poi il mio guscio viene eseguito e io vinco.
Detto questo, ci sono modi migliori per affrontare questo problema avendo la configurazione NGINX dividere il percorso in anticipo, quindi PHP non sta camminando sul filesystem.
Dall'eccellente post di blog sul 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;
}