
Docker-basiertes Labor, das die Nginx CVE-2013-4547 URI-Parsing-Schwachstelle demonstriert, mit schrittweiser Ausnutzung zur Privilegienumgehung und Codeausführung.
Betroffene Versionen: Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7
Referenzen:
Diese Schwachstelle hat nicht viel mit Codeausführung zu tun. Die Hauptursache ist, dass die URI der Anfrage falsch geparst wird, wodurch fälschlicherweise der vom Benutzer angeforderte Dateiname ermittelt wird. Dies führt zu Nebeneffekten wie Umgehung von Berechtigungen und Codeausführung.
Ein Beispiel: Wenn Nginx eine Anfrage erkennt, die auf .php endet, wird diese zur Verarbeitung an FastCGI weitergeleitet. Die übliche Konfiguration sieht wie folgt aus:
location ~ \.php$ {
include fastcgi_params;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT /var/www/html;
}
Im Normalfall (wenn pathinfo deaktiviert ist) werden nur Dateien mit der Endung .php an FastCGI zur Verarbeitung gesendet.
Mit CVE-2013-4547 können wir eine Anfrage wie 1.gif[0x20][0x00].php stellen. Diese URI passt auf den regulären Ausdruck \.php$ und gelangt in diesen Location-Block. Nach dem Betreten interpretiert Nginx die angeforderte Datei jedoch fälschlicherweise als 1.gif[0x20] und setzt diesen Wert als SCRIPT_FILENAME, der an FastCGI gesendet wird.
FastCGI führt die Verarbeitung auf Basis des Werts von SCRIPT_FILENAME durch, was letztendlich die Analyse-Schwachstelle verursacht.
Daher müssen wir lediglich eine Datei hochladen, deren Name mit einem Leerzeichen endet, um PHP dazu zu bringen, sie zu analysieren.
Ein weiteres Beispiel: Viele Websites schränken den Zugriff auf das Admin-Backend durch IP-Beschränkungen ein:
location /admin/ {
allow 127.0.0.1;
deny all;
}
Wir können folgende URI anfordern: /test[0x20]/../admin/index.php. Diese URI passt nicht auf /admin/ im Location-Block und umgeht somit die IP-Überprüfung. Die letztendlich angeforderte Datei ist jedoch /test[0x20]/../admin/index.php, also /admin/index.php, sodass der Zugriff auf das Admin-Backend erfolgreich ist. (Voraussetzung ist, dass ein Verzeichnis namens test existiert – dies ist eine Eigenheit von Linux-Systemen; wenn ein nicht existierendes Verzeichnis verwendet wird, tritt selbst bei einem Sprung in die übergeordnete Ebene ein Datei-nicht-gefunden-Fehler auf. Unter Windows gibt es diese Einschränkung nicht.)
Starten der Schwachstellenumgebung:
docker-compose build
docker-compose up -d
Nach dem Start der Umgebung rufen Sie http://your-ip:8080/ auf, um eine Upload-Seite zu sehen.
Diese Umgebung verwendet eine Blacklist-Validierung; wir können keine Dateien mit der Endung .php hochladen und müssen daher CVE-2013-4547 ausnutzen. Wir laden eine Datei namens 1.gif (beachten Sie das Leerzeichen am Ende) hoch:

Rufen Sie http://your-ip:8080/uploadfiles/1.gif[0x20][0x00].php auf; Sie werden sehen, dass PHP analysiert wurde:

Hinweis: [0x20] ist ein Leerzeichen, [0x00] ist \0. Beide Zeichen müssen nicht URL-kodiert werden.