Atak jest możliwy w konfiguracjach nginx, w których przekazywanie do PHP-FPM odbywa się poprzez oddzielenie części adresu URL za pomocą „fastcgi_split_path_info” i zdefiniowanie zmiennej środowiskowej PATH_INFO, ale bez uprzedniego sprawdzenia istnienia pliku za pomocą funkcji „try_files $fastcgi_script_name” dyrektywę lub „if (!-f $) document_root$fastcgi_script_name)”. Problem jest również
lokalizacja ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_pass php:9000;
}
Rozwiązanie problemu można śledzić w zestawach dystrybucyjnych na tych stronach:
try_files $fastcgi_script_name =404;
Problem jest spowodowany błędem podczas manipulowania wskaźnikami w pliku
Jeśli dyrektywa fastcgi_split_path_info określa dzielenie ścieżki skryptu przy użyciu wyrażenia regularnego rozróżniającego nową linię (na przykład wiele przykładów sugeruje użycie „^(.+?\.php)(/.*)$”), osoba atakująca może zapewnić, że pusta wartość jest zapisywana w zmiennej środowiskowej PATH_INFO. W tym przypadku dalej w wykonaniu
Żądając adresu URL sformatowanego w określony sposób, atakujący może osiągnąć przesunięcie wskaźnika path_info na pierwszy bajt struktury „_fcgi_data_seg”, a wpisanie zera do tego bajtu spowoduje przesunięcie „char* pos” wskaźnik do wcześniej zlokalizowanego obszaru pamięci. Następny o nazwie FCGI_PUTENV nadpisze dane w tej pamięci wartością, którą atakujący może kontrolować. Podana pamięć przechowuje także wartości innych zmiennych FastCGI, a zapisując ich dane, atakujący może utworzyć fikcyjną zmienną PHP_VALUE i osiągnąć wykonanie swojego kodu.
Źródło: opennet.ru