Атаката е възможна в конфигурации на 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