الهجوم ممكن في تكوينات nginx التي يتم فيها إعادة التوجيه إلى PHP-FPM عن طريق فصل أجزاء من عنوان URL باستخدام "fastcgi_split_path_info" وتحديد متغير البيئة PATH_INFO، ولكن دون التحقق أولاً من وجود الملف باستخدام "try_files $ fastcgi_script_name" التوجيه أو "if (!-f $) document_root$fastcgi_script_name)". المشكلة هي أيضا
الموقع ~ [^ /] \. php (/ | $) {
fastcgi_split_path_info ^ (. +؟ \. php) (/.*) $؛
fastcgi_param PATH_INFO $ fastcgi_path_info;
fastcgi_pass PHP:9000;
}
يمكنك تتبع حل المشكلة في مجموعات التوزيع على هذه الصفحات:
Try_files $fastcgi_script_name =404;
سبب المشكلة هو حدوث خطأ عند معالجة المؤشرات في الملف
إذا كان التوجيه fastcgi_split_path_info يحدد تقسيم مسار البرنامج النصي باستخدام تعبير عادي حساس للسطر الجديد (على سبيل المثال، تقترح العديد من الأمثلة استخدام "^(.+?\.php)(/.*)$")، فيمكن للمهاجم التأكد من أن تتم كتابة القيمة الفارغة إلى متغير البيئة PATH_INFO. في هذه الحالة، مزيد من التنفيذ
من خلال طلب عنوان URL منسق بطريقة معينة، يمكن للمهاجم تحقيق إزاحة مؤشر path_info إلى البايت الأول من بنية “_fcgi_data_seg”، وستؤدي كتابة صفر إلى هذا البايت إلى حركة “char* pos” المؤشر إلى منطقة الذاكرة الموجودة مسبقًا. سيقوم التالي المسمى FCGI_PUTENV بالكتابة فوق البيانات الموجودة في هذه الذاكرة بقيمة يمكن للمهاجم التحكم فيها. تقوم الذاكرة المحددة أيضًا بتخزين قيم متغيرات FastCGI الأخرى، ومن خلال كتابة بياناتها، يمكن للمهاجم إنشاء متغير PHP_VALUE وهمي وتحقيق تنفيذ التعليمات البرمجية الخاصة به.
المصدر: opennet.ru