Attacken är möjlig i nginx-konfigurationer där vidarebefordran i PHP-FPM utförs genom att dela delar av URL:en med "fastcgi_split_path_info" och definiera miljövariabeln PATH_INFO, men utan att först kontrollera existensen av filen med "try_files $fastcgi_script_name" direktivet eller "if (!-f $ document_root$fastcgi_script_name)". problem inklusive
plats ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
Du kan följa felsökningen i distributioner på dessa sidor:
try_files $fastcgi_script_name =404;
Problemet orsakas av ett fel vid manipulering av pekare i filen
Om direktivet fastcgi_split_path_info specificerar att dela sökvägen till skriptet med ett reguljärt uttryck som är känsligt för överföringen av nyradstecknet (till exempel, i många exempel föreslås det att använda "^(.+?\.php)(/. *)$"), då kan angriparen skriva ett tomt värde till miljövariabeln PATH_INFO. I det här fallet, längre fram i utförandet
Genom att begära en URL formaterad på ett visst sätt kan en angripare flytta path_info-pekaren till den första byten i "_fcgi_data_seg"-strukturen, och skriva noll till denna byte kommer att flytta "char * pos"-pekaren till det tidigare minnesområdet. Den FCGI_PUTENV som anropas nästa kommer att skriva över data i detta minne med ett värde som angriparen kan kontrollera. Det angivna minnet lagrar också värden för andra FastCGI-variabler, och genom att skriva deras data kan angriparen skapa en dummy PHP_VALUE-variabel och uppnå exekvering av sin kod.
Källa: opennet.ru