Napad je možen v konfiguracijah nginx, v katerih se posredovanje v PHP-FPM izvaja z ločevanjem delov URL-ja z uporabo “fastcgi_split_path_info” in definiranjem spremenljivke okolja PATH_INFO, vendar brez predhodnega preverjanja obstoja datoteke z uporabo “try_files $fastcgi_script_name” ali »if (!-f $) document_root$fastcgi_script_name)«. Problem je tudi
lokacija ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
Rešitev težave lahko spremljate v distribucijskih kompletih na teh straneh:
try_files $fastcgi_script_name =404;
Težavo povzroča napaka pri ravnanju s kazalci v datoteki
Če direktiva fastcgi_split_path_info določa razdelitev poti skripta z uporabo regularnega izraza, občutljivega na novo vrstico (na primer, veliko primerov predlaga uporabo "^(.+?\.php)(/.*)$"), lahko napadalec zagotovi, da prazna vrednost se zapiše v spremenljivko okolja PATH_INFO. V tem primeru naprej po izvedbi
Z zahtevo po URL-ju, oblikovanem na določen način, lahko napadalec doseže premik kazalca path_info na prvi bajt strukture »_fcgi_data_seg«, pisanje ničle v ta bajt pa bo vodilo do premika »char* pos« kazalec na predhodno locirano pomnilniško območje. Naslednji imenovani FCGI_PUTENV bo prepisal podatke v tem pomnilniku z vrednostjo, ki jo napadalec lahko nadzira. Navedeni pomnilnik shranjuje tudi vrednosti drugih spremenljivk FastCGI in z zapisom njihovih podatkov lahko napadalec ustvari fiktivno spremenljivko PHP_VALUE in doseže izvedbo svoje kode.
Vir: opennet.ru