Εν ολίγοις: Ένα αρχείο που καλεί μόνο το phpinfo() δείχνει σε κάθε επισκέπτη έκδοση, modules, διαδρομές και ρυθμίσεις της PHP, συχνά και μεταβλητές περιβάλλοντος με στοιχεία πρόσβασης. Για την ασφάλεια του phpinfo ισχύει γι' αυτό: τέτοια αρχεία δεν αφήνονται ποτέ μόνιμα στο webroot, διαγράφονται μετά τη χρήση και το επίπεδο της PHP ελέγχεται καλύτερα μέσω του διαχειριστή πακέτων και της διαμόρφωσης. Το επίπεδο patch απέναντι στο PHP2Shell δεν το αποδεικνύει ούτως ή άλλως μια έξοδος phpinfo.
Το αρχείο δοκιμής που μένει
Από τις 21/10/2026 χιλιάδες διαχειριστές ελέγχουν ποια έκδοση PHP παραδίδουν οι ιστότοποί τους. Ο πιο γρήγορος δρόμος είναι γνωστός: δημιουργία ενός αρχείου info.php με μία μόνο γραμμή, κλήση στον browser, ανάγνωση του αποτελέσματος. Λειτουργεί. Το πρόβλημα αρχίζει μετά, όταν το αρχείο ξεχνιέται.
Τέτοια αρχεία επιβιώνουν εκπληκτικά πολύ. Μεταφέρονται σε μετακομίσεις, καταλήγουν σε backups και εμφανίζονται μετά από χρόνια σε φακέλους που κανείς δεν γνωρίζει πια. Αυτοματοποιημένοι σαρωτές ρωτούν διαρκώς για τυπικά ονόματα αρχείων. Ό,τι ήταν βοήθημα για τον διαχειριστή, είναι για τον επιτιθέμενο οδηγίες κατασκευής του διακομιστή.
Ιδιαίτερα επηρεάζονται πρακτορεία και πάροχοι φιλοξενίας με πολλούς ιστότοπους πελατών. Όποιος ελέγχει σε μια πιεστική εβδομάδα δεκάδες ιστότοπους, δημιουργεί γρήγορα δεκάδες αρχεία δοκιμής. Ένας μόνο ξεχασμένος φάκελος αρκεί, ώστε το αρχείο να είναι ακόμη προσβάσιμο μήνες αργότερα.
Τι αποκαλύπτει το phpinfo() και γιατί μετράει για την ασφάλεια
Σύμφωνα με το εγχειρίδιο της PHP, το phpinfo() εμφανίζει την τρέχουσα κατάσταση της PHP. Μέσω σταθερών μπορεί να ελεγχθεί ποια μέρη εμφανίζονται· χωρίς καμία ένδειξη εμφανίζονται όλα.
| Τομέας (σταθερά) | Περιεχόμενο σύμφωνα με το εγχειρίδιο | Γιατί είναι λεπτό |
|---|---|---|
INFO_GENERAL |
build, θέση του php.ini, διακομιστής ιστού, σύστημα | αποκαλύπτει λειτουργικό σύστημα και διαδρομές |
INFO_CONFIGURATION |
τοπικές τιμές και κύριες τιμές όλων των οδηγιών | δείχνει αν ισχύουν τα disable_functions ή open_basedir |
INFO_MODULES |
φορτωμένες επεκτάσεις με τις ρυθμίσεις τους | οι επιτιθέμενοι βλέπουν ποιες λειτουργίες είναι διαθέσιμες |
INFO_ENVIRONMENT |
μεταβλητές περιβάλλοντος | εδώ βρίσκονται συχνά στοιχεία πρόσβασης βάσης δεδομένων ή API |
INFO_VARIABLES |
προκαθορισμένες μεταβλητές (Environment, GET, POST, Cookie, Server) | περιέχει κεφαλίδες και cookies του τρέχοντος αιτήματος |
Πιο επικίνδυνες είναι οι δύο τελευταίες γραμμές. Οι σύγχρονες εφαρμογές φορτώνουν με προτίμηση στοιχεία πρόσβασης από μεταβλητές περιβάλλοντος, για παράδειγμα από ένα αρχείο .env ή από τη διαμόρφωση container. Οι τιμές αυτές εμφανίζονται τότε σε απλό κείμενο στην έξοδο. Πώς προστατεύετε εν γένει τέτοια μυστικά, περιγράφει το άρθρο Σωστή προστασία στοιχείων πρόσβασης και αρχείων .env.
Προστίθεται: Η έξοδος δείχνει τις τιμές του τρέχοντος αιτήματος, άρα και cookies και κεφαλίδες. Αν ένας επιτιθέμενος μπορεί να οδηγήσει έναν επισκέπτη στη σελίδα και να διαβάσει την απάντηση, για παράδειγμα μέσω μιας αδυναμίας Cross-Site Scripting σε άλλο σημείο, γίνονται ορατά ακόμη και cookies που έχουν σημανθεί ως HttpOnly.
Γιατί το phpinfo δεν αποτελεί απόδειξη απέναντι στο PHP2Shell
Πολλοί δημιούργησαν το αρχείο ακριβώς για να ελέγξουν το επίπεδο patch. Γι' αυτό ακριβώς είναι κατάλληλο μόνο υπό όρους. Οι διανομές και οι πάροχοι φιλοξενίας εγκαθιστούν συχνά διορθώσεις ως backport· σύμφωνα με αναφορές, το Ubuntu 24.04 για παράδειγμα εμφανίζει και μετά την ενημέρωση ακόμη 8.3.6. Ο αριθμός που εμφανίζεται λέει επομένως λίγα. Αντίστροφα, ένας τρέχων αριθμός δεν αποδεικνύει ότι έγινε επανεκκίνηση όλων των workers.
Αξιόπιστο είναι το επίπεδο του πακέτου με τους αριθμούς CVE στο changelog, συμπληρωμένο με την επανεκκίνηση όλων των διεργασιών PHP. Πώς γίνεται, εξηγεί το άρθρο Σωστός έλεγχος έκδοσης PHP και επιπέδου patch.
Μια βραχύχρονη έξοδος στο πλαίσιο ιστού έχει παρ' όλα αυτά τη θέση της: δείχνει ποιο php.ini και ποιες τιμές ισχύουν πραγματικά για τον ιστότοπο, επειδή η γραμμή εντολών διαβάζει συχνά άλλη διαμόρφωση. Το υπόβαθρο για τα επίπεδα και την προτεραιότητα εξηγεί το Το php.ini εξηγημένο. Αν το χρειάζεστε, τότε με προστασία πρόσβασης, με τυχαίο όνομα αρχείου και μόνο για λεπτά.
Για τα περισσότερα ερωτήματα υπάρχουν ούτως ή άλλως καλύτεροι δρόμοι. Η έκδοση PHP ενός pool FPM αναγράφεται στη διαμόρφωσή του και στη λίστα διεργασιών. Μεμονωμένες τιμές μπορούν να ερωτηθούν με σενάριο εκτός του webroot μέσω ini_get(), χωρίς να αποκαλυφθούν τα πάντα. Και στα πάνελ φιλοξενίας η διεπαφή δείχνει την εκχωρημένη έκδοση ανά ιστότοπο, αν και χωρίς πληροφορία για backports.
Εντοπισμός ξεχασμένων αρχείων: συγκεκριμένα βήματα ελέγχου
Έτσι εντοπίζετε κατάλοιπα σε διακομιστή Linux. Οι εντολές μόνο διαβάζουν και δεν αλλάζουν τίποτα.
- Αναζήτηση αρχείων με κλήση phpinfo (προσαρμόστε τη διαδρομή):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Έλεγχος τυπικών ονομάτων αρχείων, ακόμη και χωρίς εύρημα στο περιεχόμενο:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
-
Αξιολόγηση των ευρημάτων: Δεν είναι κάθε εύρημα αρχείο δοκιμής. Εργαλεία διαχειριστή, πάνελ ή frameworks μπορεί να χρησιμοποιούν το
phpinfo()πίσω από σύνδεση. Αποφασιστικό είναι αν το αρχείο είναι προσβάσιμο από το διαδίκτυο χωρίς σύνδεση. -
Δείτε τις προσβάσεις στο log, προτού διαγράψετε:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Διαγραφή και αντικατάσταση μυστικών: Αν στην έξοδο υπήρχε κωδικός ή κλειδί και το αρχείο ήταν δημόσιο, η τιμή θεωρείται γνωστή. Αλλάξτε την.
Ένα εύρημα με άγνωστη ημερομηνία δημιουργίας και ύποπτο περιεχόμενο δίπλα στην κλήση phpinfo μπορεί να είναι και κερκόπορτα. Τότε όχι μόνο διαγραφή, αλλά αντίγραφο και έλεγχος, δείτε Εντοπισμός και αφαίρεση webshells.
Μόνιμη πρόληψη αντί για καθαρισμό
Τρία μέτρα φροντίζουν ώστε το θέμα να μην επανέλθει. Πρώτον: προσθέστε το phpinfo στη λίστα disable_functions του php.ini για το πλαίσιο ιστού. Ελέγξτε προηγουμένως αν το πάνελ σας χρειάζεται τη συνάρτηση για μια σελίδα κατάστασης. Πώς λειτουργεί η ρύθμιση και πού βρίσκονται τα όριά της, αναφέρεται στο Σωστή χρήση του disable_functions.
; php.ini για FPM ή Apache, έπειτα επανεκκίνηση όλων των διεργασιών PHP
disable_functions = phpinfo
expose_php = Off
Δεύτερον: παράδοση μόνο μέσω σταθερής διαδικασίας, για παράδειγμα μέσω Git ή pipeline build, ώστε να μην καταλήγουν χειροκίνητα μεμονωμένα αρχεία στο webroot. Τρίτον: οι πληροφορίες κατάστασης ανήκουν στην παρακολούθηση ή στο απόθεμα και όχι σε μια δημόσια σελίδα.
Το expose_php = Off αφαιρεί επιπλέον την κεφαλίδα με την οποία η PHP ανακοινώνει την έκδοσή της σε κάθε απάντηση. Αυτό δεν αντικαθιστά μια ενημέρωση, αφαιρεί όμως από τους αυτοματοποιημένους σαρωτές μια βολική πληροφορία. Όποιος έχει πολλά άτομα με πρόσβαση στον διακομιστή, πρέπει επιπλέον να συμφωνήσει έναν απλό κανόνα: τα αρχεία δοκιμής διαγράφονται στο ίδιο βήμα εργασίας στο οποίο δημιουργήθηκαν και όχι «αργότερα».
Πώς βοηθά συγκεκριμένα η PHP SOS;
- Ψάχνουμε τα webroots σας για αρχεία phpinfo, σενάρια δοκιμής και άλλα κατάλοιπα και αξιολογούμε κάθε εύρημα.
- Αξιολογούμε τις προσβάσεις στα αρχεία που βρέθηκαν και σας λέμε ποια μυστικά πρέπει να αντικαταστήσετε.
- Αποδεικνύουμε το επίπεδο patch απέναντι στο PHP2Shell μέσω changelog πακέτου και εκκίνησης διεργασιών αντί για μια ένδειξη έκδοσης.
- Εφαρμόζουμε μόνιμα τα
disable_functions,expose_phpκαι άλλες σκληρύνσεις στο πλαίσιο της σκλήρυνσης διακομιστή.
Συμπέρασμα: Ένα αρχείο phpinfo δημιουργείται σε δευτερόλεπτα και ξεχνιέται το ίδιο γρήγορα. Όποιος το αναζητήσει και το αφαιρέσει τώρα, κλείνει μια περιττή διαρροή δεδομένων και βασίζεται για το επίπεδο patch σε αξιόπιστες αποδείξεις.
Συχνές ερωτήσεις
Είναι ένα αρχείο phpinfo από μόνο του ευπάθεια ασφαλείας;
Δεν ανοίγει πρόσβαση, δίνει όμως στους επιτιθέμενους μια λεπτομερή περιγραφή του διακομιστή: έκδοση, modules, διαδρομές, ρυθμίσεις και, ανάλογα με το περιβάλλον, και μεταβλητές περιβάλλοντος. Αυτό διευκολύνει στοχευμένες επιθέσεις και μπορεί να αποκαλύψει στοιχεία πρόσβασης.
Αποδεικνύει ο αριθμός έκδοσης στο phpinfo ότι έχει εφαρμοστεί patch για το PHP2Shell;
Όχι. Οι διανομές και οι πάροχοι φιλοξενίας εγκαθιστούν συχνά διορθώσεις ως backport, και ο αριθμός που εμφανίζεται παραμένει τότε ίδιος. Το επίπεδο patch αποδεικνύεται από το changelog του πακέτου και την επιβεβαίωση του παρόχου, καθώς και από την επανεκκίνηση όλων των διεργασιών PHP.
Τι κάνω αν ένα αρχείο phpinfo ήταν δημόσιο για μεγάλο διάστημα;
Διαγράψτε το αρχείο, δείτε στο access log ποιος το ανέκτησε και αντικαταστήστε όλα τα μυστικά που υπήρχαν στην έξοδο, για παράδειγμα κωδικούς βάσης δεδομένων ή κλειδιά API από μεταβλητές περιβάλλοντος.
Μπορώ να απενεργοποιήσω εντελώς το phpinfo();
Ναι, μέσω του disable_functions στο php.ini του πλαισίου ιστού. Ελέγξτε προηγουμένως αν ένα πάνελ ή μια εφαρμογή χρησιμοποιεί τη συνάρτηση για σελίδες κατάστασης και επανεκκινήστε έπειτα τις διεργασίες PHP.