Es gab eine Menge von sprechen über ein Sicherheitsproblem in Bezug auf die cgi.fix_pathinfo
PHP - Option mit Nginx verwendet ( in der Regel PHP-FPM, schneller CGI).
Infolgedessen wird in der Standard-Nginx-Konfigurationsdatei Folgendes angegeben:
# NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
Das "offizielle" Nginx-Wiki gibt jedoch jetzt an, dass PATH_INFO korrekt gehandhabt werden kann, ohne die obige PHP-Option zu deaktivieren. Na und?
Fragen
- Können Sie klar erklären, was zu
cgi.fix_pathinfo
tun ist? (Das offizielle Dokument sagt nur : "Weitere Informationen zu PATH_INFO finden Sie in den CGI-Spezifikationen.") - Was macht PHP wirklich mit diesen
PATH_INFO
undSCRIPT_FILENAME
Variablen? - Warum und wie kann es mit Nginx gefährlich sein? ( detaillierte Beispiele)
- Gibt es das Problem in neueren Versionen dieser Programme noch?
- Ist Apache anfällig?
Ich versuche, das Problem bei jedem Schritt zu verstehen. Ich verstehe zum Beispiel nicht, warum die Verwendung des Unix-Sockets php-fpm dieses Problem vermeiden könnte .
Antworten:
TL; DR - das Update (das Sie möglicherweise nicht einmal benötigen) ist SEHR EINFACH und am Ende dieser Antwort.
Ich werde versuchen, Ihre spezifischen Fragen zu beantworten, aber Ihr Missverständnis von PATH_INFO macht die Fragen selbst ein bisschen falsch.
Die erste Frage sollte lauten: "Was ist das für ein Pfadinformationsgeschäft?"
Pfadinformationen sind Zeug nach dem Skript in einem URI (sollte mit einem Schrägstrich beginnen, endet aber vor den Abfrageargumenten, die mit einem beginnen
?
). Der letzte Absatz im Übersichtsabschnitt des Wikipedia-Artikels über CGI fasst es gut zusammen. UntenPATH_INFO
ist "/ THIS / IS / PATH / INFO":http://example.com/path/to/script.php/THIS/IS/PATH/INFO?query_args=foo
Ihre nächste Frage hätte lauten sollen: "Wie bestimmt PHP was
PATH_INFO
und wasSCRIPT_FILENAME
ist?"PATH_INFO
, so dass das, was eigentlich seinPATH_INFO
sollte, aufgemischt wurde,SCRIPT_FILENAME
was in vielen Fällen defekt ist. Ich habe keine ausreichend alte Version von PHP zum Testen, aber ich glaube, sie hatSCRIPT_FILENAME
im obigen Beispiel Folgendes gesehen: "/path/to/script.php/THIS/IS/PATH/INFO" (vorangestellt mit die docroot wie gewohnt).PATH_INFO
undSCRIPT_FILENAME
bekommt nur den Teil , dass die Punkte an das Skript (mit dem Präfix der docroot natürlich) angefordert werden.PATH_INFO
, mussten sie eine Konfigurationseinstellung für die neue Funktion hinzufügen, damit Benutzer, die Skripts ausführen, die vom alten Verhalten abhängen, neue PHP-Versionen ausführen können. Deshalb gibt es sogar einen Konfigurationsschalter dafür. Es sollte von Anfang an eingebaut sein (mit dem "gefährlichen" Verhalten).Aber woher weiß PHP, welcher Teil des Skripts ist und welche Pfadinformationen es enthält? Was ist, wenn der URI ungefähr so aussieht:
http://example.com/path/to/script.php/THIS/IS/PATH/INFO.php?q=foo
SCRIPT_FILENAME
wurde bestimmt undPATH_INFO
bekommt den rest.SCRIPT_FILENAME
bekommt" /foo.jpg " (wieder mit dem Präfix docroot) undPATH_INFO
erhält "/nonexistent.php".Warum und wie gefährlich es sein kann, sollte jetzt klar sein:
Nginx und Apache könnten so erstellt oder konfiguriert werden, dass Anfragen mit diesem Trick verhindert werden. Es gibt zahlreiche Beispiele dafür, auch in der Antwort von user2372674 . Dieser Blogartikel erklärt das Problem gut, aber es fehlt die richtige Lösung.
Die beste Lösung ist jedoch, einfach sicherzustellen, dass PHP-FPM richtig konfiguriert ist, damit es niemals eine Datei ausführt, es sei denn, sie endet mit ".php". Es ist erwähnenswert, dass neuere Versionen von PHP-FPM (~ 5.3.9 +?) Dies als Standard haben, daher ist diese Gefahr nicht mehr so problematisch.
Die Lösung
Wenn Sie eine neuere Version von PHP-FPM (~ 5.3.9 +?) Haben, müssen Sie nichts unternehmen, da das unten stehende sichere Verhalten bereits die Standardeinstellung ist.
Andernfalls suchen Sie die
www.conf
Datei von php-fpm (/etc/php-fpm.d/www.conf
hängt möglicherweise von Ihrem System ab). Stellen Sie sicher, dass Sie Folgendes haben:Auch dies ist heutzutage an vielen Orten Standard.
Beachten Sie, dass dies einen Angreifer nicht daran hindert, eine ".php" -Datei in einen WordPress-Upload-Ordner hochzuladen und diese mit derselben Technik auszuführen. Sie müssen weiterhin über eine gute Sicherheit für Ihre Anwendungen verfügen.
quelle
SCRIPT_FILENAME
ist, warum istfastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
in meinernginx
conf eine Zeile ? Überschreibt es die Bemühungen von PHP, den WertSCRIPT_FILENAME
von sich selbst zu entdecken ?security.limit_extensions
? Ich habe es versuchtphpinfo()
,ini_get(security.limit_extensions)
undini_get_all()
ohne Erfolg.Im Wesentlichen können Sie ohne diese Datei mit PHP-Code namens "foo.jpg" auf den Webserver hochladen; Dann fordern Sie es wie http: //domain.tld/foo.jpg/nonexistent.php an und der Web-Server-Stack sagt fälschlicherweise oh; das ist ein PHP; Ich muss das verarbeiten, es wird foo.jpg / nonexistent.php nicht finden, also wird es auf foo.jpg zurückgreifen und foo.jpg als PHP-Code verarbeiten. Das ist gefährlich, da es das System für ein sehr leichtes Eindringen öffnet. Jede Webanwendung, die zum Beispiel das Hochladen von Bildern ermöglicht, wird zum Tool zum Hochladen von Backdoors.
In Bezug auf die Verwendung von PHP-FPM mit Unix-Socket, um dies zu vermeiden; IMO wird es das Problem nicht lösen.
quelle
cgi.fix_pathinfo
ist nicht gefährlich, da die Standardkonfiguration sicherphp-fpm
ist (es werden nur Dateien mit der.php
Erweiterung ausgeführt).Im Nginx-Wiki als Sicherheitsmaßnahme
ist im Standortblock enthalten. In anderen Tutorials
verwendet wird, was das gleiche tun sollte, kann aber laut Nginx-Wiki Probleme bereiten. Mit diesen Optionen
cgi.fix_pathinfo=1
sollte das kein Problem mehr sein. Weitere Informationen finden Sie hier .quelle