Serangan ini dimungkinkan dalam konfigurasi nginx di mana penerusan ke PHP-FPM dilakukan dengan memisahkan bagian-bagian URL menggunakan “fastcgi_split_path_info” dan mendefinisikan variabel lingkungan PATH_INFO, tetapi tanpa terlebih dahulu memeriksa keberadaan file menggunakan “try_files $fastcgi_script_name” direktif atau “if (!-f $) document_root$fastcgi_script_name)". Masalahnya juga
lokasi ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^ (. +? \. php) (/.*) $;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_passphp:9000;
}
Anda dapat melacak penyelesaian masalah dalam kit distribusi di halaman ini:
coba_files $fastcgi_script_name =404;
Masalah ini disebabkan oleh kesalahan saat memanipulasi pointer dalam suatu file
Jika direktif fastcgi_split_path_info menentukan pemisahan jalur skrip menggunakan ekspresi reguler sensitif baris baru (misalnya, banyak contoh menyarankan penggunaan "^(.+?\.php)(/.*)$"), maka penyerang dapat memastikan bahwa nilai kosong ditulis ke variabel lingkungan PATH_INFO. Dalam hal ini, eksekusi lebih lanjut
Dengan meminta URL yang diformat dengan cara tertentu, penyerang dapat menggeser penunjuk path_info ke byte pertama dari struktur “_fcgi_data_seg”, dan menulis nol pada byte ini akan menyebabkan pergerakan “char* pos” penunjuk ke area memori yang terletak sebelumnya. Selanjutnya disebut FCGI_PUTENV akan menimpa data dalam memori ini dengan nilai yang dapat dikontrol oleh penyerang. Memori yang ditentukan juga menyimpan nilai variabel FastCGI lainnya, dan dengan menulis datanya, penyerang dapat membuat variabel PHP_VALUE fiktif dan mencapai eksekusi kodenya.
Sumber: opennet.ru