Nginx ist derzeit der Mainstream-Webdienst. Im Folgenden sind einige der häufigsten Fehlkonfigurationen aufgeführt. Fehlender StammspeicherortServer { Wurzel /etc/nginx; Standort /hallo.txt { versuche_dateien $uri $uri/ =404; Proxy-Passwort http://127.0.0.1:8080/; } } Eine einfache Anfrage wie Unter den fast 50.000 Nginx-Konfigurationsdateien, die wir gesammelt haben, sind die häufigsten Stammpfade wie folgt: Off-By-SchrägstrichServer { hören Sie 80 Standardserver; Servername _; Standort /static { Alias /usr/share/nginx/static/; } Standort /API { Proxy-Passwort http://APIServer/v1/; } } Beim Konfigurationsfehler „Off-by-Slash“ war es aufgrund des fehlenden „/“ möglich, sich im Pfad einen Schritt nach oben zu bewegen. Diese Technik wurde von Orange Tsai in seinem Blackhat-Vortrag „Breaking Parser Logic!“ populär gemacht. In diesem Vortrag zeigt er, wie der fehlende Schrägstrich der Location-Direktive in Kombination mit der Alias-Direktive das Lesen des Quellcodes einer Webanwendung ermöglicht. Weniger bekannt ist, dass es auch in Verbindung mit anderen Anweisungen wie proxy_pass verwendet werden kann. Lassen Sie uns aufschlüsseln, was passiert und warum es funktioniert. Standort /API { Proxy-Passwort http://APIServer/v1/; } Wenn die folgende Konfiguration für den Nginx-Server zugänglich ist, können Sie davon ausgehen, dass nur Pfade unter http://apiserver/v1/ zugänglich sind. http://server/api/Benutzer -> http://apiserver/v1//Benutzer Wenn eine Anfrage an http://server/api/user gestellt wird, normalisiert Nginx zuerst die URL. Anschließend wird geprüft, ob das Präfix /api mit der URL übereinstimmt. Wenn dies der Fall ist, stimmt dies mit der URL überein. Anschließend wird das Präfix aus der URL entfernt, der /user-Pfad bleibt also bestehen. Dieser Pfad wird dann zur Diese Fehlkonfiguration kann durch die Anforderung von http://server/api../ ausgenutzt werden, was dazu führt, dass Nginx die URL http://apiserver/ anfordert, die zu http://apiserver/v1/../ normalisiert wird. Die möglichen Auswirkungen hängen davon ab, was durch die Ausnutzung dieser Fehlkonfiguration erreicht werden kann. Dies könnte beispielsweise dazu führen, dass der Status des Apache-Servers über die URL http://server/api../server-status offengelegt wird oder Pfade zugänglich gemacht werden, die nicht öffentlich zugänglich sein sollen. Ein Zeichen dafür, dass Ihr Nginx-Server falsch konfiguriert ist, besteht darin, dass der Server nach dem Entfernen der Schrägstriche in der URL immer noch dieselbe Antwort zurückgibt. Wenn beispielsweise http://server/api/user und http://server/apiuser dieselbe Antwort zurückgeben, ist der Server möglicherweise anfällig. Dies führt dazu, dass die folgende Anfrage gesendet wird: http://server/api/Benutzer -> http://apiserver/v1//Benutzer http://server/apiuser -> http://apiserver/v1/user Unsichere VariablenverwendungEinige Frameworks, Skripte und Nginx-Konfigurationen verwenden in Nginx gespeicherte Variablen unsicher. Dies kann zu Problemen wie XSS, Umgehung des HttpOnly-Schutzes, Offenlegung von Informationen und in einigen Fällen sogar RCE führen. SCRIPT_NAMEDie Konfiguration ist wie folgt: Standort ~ \.php$ { fastcgi_params einschließen; fastcgi_param SCRIPT_FILENAME $Dokumentstammsatz$fastcgi_script_name; fastcgi_pass 127.0.0.1:9000; } Das Hauptproblem besteht darin, dass Nginx alle URLs mit der Endung .php an den PHP-Interpreter sendet, auch wenn die Datei nicht auf der Festplatte vorhanden ist. Dies ist eine von vielen Nginx-Fehlkonfigurationen, die im von Nginx erstellten Dokument „Fallstricke und häufige Fehler“ aufgeführt sind. Wenn ein PHP-Skript versucht, eine Basis-URL basierend auf SCRIPT_NAME zu definieren, tritt XSS auf. <?php wenn(Basisname($_SERVER['SCRIPT_NAME']) == Basisname($_SERVER['SCRIPT_FILENAME'])) echo dirname($_SERVER['SCRIPT_NAME']); ?> GET /index.php/<script>alert(1)</script>/index.php SCRIPT_NAME = /index.php/<script>alert(1)</script>/index.php Die Verwendung von $uri kann zu einer CRLF-Injektion führen.Eine weitere Fehlkonfiguration im Zusammenhang mit Nginx-Variablen ist die Verwendung von $uri oder $document_uri anstelle von $request_uri. $uri und $document_uri enthalten die normalisierte URI, und die Normalisierung in Nginx umfasst die URL-Dekodierung der URI. Volema hat festgestellt, dass das Erstellen von Weiterleitungen in Nginx-Konfigurationen zu CRLF-Injections führen kann, häufig unter Verwendung von $uri. Ein Beispiel für eine anfällige Nginx-Konfiguration ist wie folgt: Standort / { gibt 302 https://example.com$uri zurück; } Die Zeilenumbruchzeichen für HTTP-Anfragen sind HTTP/1.1 302 vorübergehend verschoben Server: nginx/1.19.3 Inhaltstyp: text/html Inhaltslänge: 145 Verbindung: Keep-Alive Standort: https://example.com/ Erkennen: clrf Jede VariableIn einigen Fällen können vom Benutzer bereitgestellte Daten als Nginx-Variablen behandelt werden. Es ist nicht klar, warum dies geschieht, aber wie dieser H1-Bericht zeigt, ist es nicht ungewöhnlich oder leicht zu testen. Wenn wir nach der Fehlermeldung suchen, können wir sehen, dass sie im SSI-Filtermodul gefunden wird, was darauf hinweist, dass der Fehler auf SSI zurückzuführen ist. Die Testmethode ist wie folgt: $ curl -H 'Referer: bar' http://localhost/foo$http_referer | grep 'foobar' Lesen der Rohantwort des Backends Mithilfe von Wenn ein Client eine ungültige HTTP-Anfrage an Nginx sendet, wird die Anfrage unverändert an das Backend weitergeleitet, das mit seinem ursprünglichen Inhalt antwortet. Nginx versteht dann die ungültige HTTP-Antwort nicht und leitet sie an den Client weiter. Stellen Sie sich eine uWSGI-Anwendung wie diese vor: def Anwendung(Umgebung, Startantwort): start_response('500 Fehler', [('Inhaltstyp', 'text/html'),('Geheimer Header','geheime Informationen')]) return [b"Geheime Infos, sollten nicht sichtbar sein!"] Die Nginx-Konfiguration ist wie folgt: http { Fehlerseite 500 /html/error.html; proxy_intercept_errors ein; proxy_hide_header Geheimer Header; } proxy_intercept_errors liefert eine benutzerdefinierte Antwort, wenn der Antwortstatus des Backends größer als 300 ist. In der obigen uWSGI-Anwendung senden wir einen 500-Fehler, der von Nginx abgefangen wird. proxy_hide_header: Kann jeden angegebenen HTTP-Header vor dem Client verbergen. Wenn wir eine normale GET-Anfrage senden, gibt Nginx Folgendes zurück: HTTP/1.1 500 Interner Serverfehler Server: nginx/1.10.3 Inhaltstyp: text/html Inhaltslänge: 34 Verbindung: schließen Wenn wir jedoch eine ungültige HTTP-Anfrage senden, wie: ERHALTEN /? XTTP/1.1 Gastgeber: 127.0.0.1 Verbindung: schließen Wir erhalten folgende Antwort: XTTP/1.1 500 Fehler Inhaltstyp: text/html Geheimer Header: geheime Informationen Geheime Informationen, sollten nicht sichtbar sein! merge_slashes auf aus gesetzt Standardmäßig ist die Direktive Oben sind die Details einiger häufiger Nginx-Fehlkonfigurationen aufgeführt. Weitere Informationen zu Nginx-Fehlkonfigurationen finden Sie in den entsprechenden Artikeln auf 123WORDPRESS.COM. Das könnte Sie auch interessieren:
|
<<: HTML+CSS-Implementierungscode für abgerundete Rechtecke
>>: Vue implementiert einen einfachen Laufschrifteffekt
In tatsächlichen Projekten muss die Datenbank reg...
MySql verwendet verknüpfte Tabellenabfragen, die ...
Vorwort Vergessene Passwörter sind ein Problem, d...
Vor Kurzem mussten wir eine geplante Migration de...
Inhaltsverzeichnis vue2.x Vorkonzept: Routing-Hoo...
Vorwort: Manchmal wird die mit MySQL verbundene S...
Laden Sie das Redis-Image herunter Docker-Pull yy...
Website-Administratoren löschen Website-Daten aus...
yum installiere vsftpd [root@localhost usw.]# yum...
Datentypen und Operationen Datentabelle 1.1 MySQL...
Meine MySQL-Version ist MySQL V5.7.9, bitte verwe...
In diesem Artikel wird ein JS-Spezialeffekt vorge...
Unter Linux ist alles eine Datei, daher besteht d...
Vorwort Die Schlüsselwörter von MySQL und Oracle ...
Herunterladen und installierenUmgebungsvariablen ...