Η επίθεση είναι δυνατή σε διαμορφώσεις 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 στο πρώτο byte της δομής «_fcgi_data_seg» και η εγγραφή ενός μηδέν σε αυτό το byte θα οδηγήσει στη μετακίνηση του «char* pos». δείκτη σε μια περιοχή μνήμης που βρίσκεται προηγουμένως. Το επόμενο που ονομάζεται FCGI_PUTENV θα αντικαταστήσει τα δεδομένα σε αυτήν τη μνήμη με μια τιμή που μπορεί να ελέγξει ο εισβολέας. Η καθορισμένη μνήμη αποθηκεύει επίσης τις τιμές άλλων μεταβλητών FastCGI και γράφοντας τα δεδομένα τους, ένας εισβολέας μπορεί να δημιουργήσει μια πλασματική μεταβλητή PHP_VALUE και να επιτύχει την εκτέλεση του κώδικά του.
Πηγή: opennet.ru