Pe scurt: Un fișier care apelează doar phpinfo() arată fiecărui vizitator versiunea, modulele, căile și setările PHP, adesea și variabile de mediu cu date de acces. Pentru securitatea phpinfo se aplică de aceea: nu lăsați niciodată durabil asemenea fișiere în webroot, ștergeți-le după utilizare și verificați starea PHP mai degrabă prin gestionarul de pachete și configurare. Nivelul de patch împotriva PHP2Shell nu îl dovedește oricum o ieșire phpinfo.
Fișierul de test care rămâne
De la 21.10.2026, mii de administratori verifică ce versiune PHP livrează site-urile lor. Calea cea mai rapidă este cunoscută: creați un fișier info.php cu o singură linie, apelați-l în browser, citiți rezultatul. Funcționează. Problema începe după aceea, când fișierul este uitat.
Asemenea fișiere supraviețuiesc surprinzător de mult. Se mută odată cu migrările, ajung în backup-uri și apar după ani în directoare pe care nu le mai cunoaște nimeni. Scannerele automate interoghează permanent nume de fișiere tipice. Ce a fost pentru administrator un instrument ajutător este pentru un atacator o schiță de construcție a serverului.
Sunt afectate în mod deosebit agențiile și furnizorii de hosting cu multe site-uri de clienți. Cine verifică într-o săptămână agitată zeci de site-uri creează repede zeci de fișiere de test. Un singur director uitat este suficient pentru ca fișierul să poată fi accesat și luni mai târziu.
Ce trădează phpinfo() și de ce contează pentru securitate
Potrivit manualului PHP, phpinfo() afișează starea curentă a PHP. Prin constante se poate controla ce părți apar; fără indicații, apare totul.
| Domeniu (constantă) | Conținut conform manualului | De ce este delicat |
|---|---|---|
INFO_GENERAL |
Build, locația php.ini, server web, sistem | Trădează sistemul de operare și căile |
INFO_CONFIGURATION |
Valorile locale și master ale tuturor directivelor | Arată dacă disable_functions sau open_basedir acționează |
INFO_MODULES |
Extensii încărcate, cu setări | Atacatorii văd ce funcții sunt disponibile |
INFO_ENVIRONMENT |
Variabile de mediu | Aici se află adesea date de acces la baze de date sau API |
INFO_VARIABLES |
Variabile predefinite (Environment, GET, POST, Cookie, Server) | Conține antetele și cookie-urile cererii curente |
Cele mai periculoase sunt ultimele două rânduri. Aplicațiile moderne încarcă cu plăcere datele de acces din variabile de mediu, de exemplu dintr-un fișier .env sau din configurarea containerului. Aceste valori apar atunci în clar în ieșire. Cum protejați în general asemenea secrete descrie articolul Protejarea corectă a datelor de acces și a fișierelor .env.
La aceasta se adaugă: ieșirea arată valorile cererii în curs, deci și cookie-urile și antetele. Dacă un atacator poate îndruma un vizitator spre pagină și poate citi răspunsul, de exemplu printr-o vulnerabilitate Cross-Site Scripting în altă parte, devin vizibile chiar și cookie-urile marcate HttpOnly.
De ce phpinfo nu este o dovadă împotriva PHP2Shell
Mulți au creat fișierul tocmai ca să verifice nivelul de patch. Pentru aceasta este însă potrivit doar limitat. Distribuțiile și furnizorii de hosting aplică adesea corecțiile ca backport; potrivit rapoartelor, de exemplu Ubuntu 24.04 afișează în continuare 8.3.6 după actualizare. Numărul afișat spune deci puțin. Invers, un număr actual nu dovedește că toți worker-ii au fost reporniți.
Solid este nivelul pachetului cu numerele CVE din changelog, completat cu repornirea tuturor proceselor PHP. Cum se face acest lucru explică articolul Verificarea corectă a versiunii PHP și a nivelului de patch.
O ieșire pe termen scurt în contextul web are totuși locul ei: arată ce php.ini și ce valori se aplică efectiv site-ului, deoarece linia de comandă citește adesea o altă configurare. Contextul despre niveluri și precedență îl explică php.ini explicat. Dacă aveți nevoie de asta, atunci cu acces protejat, cu nume de fișier aleatoriu și doar pentru minute.
Pentru majoritatea întrebărilor există oricum căi mai bune. Versiunea PHP a unui pool FPM se află în configurarea acestuia și în lista de procese. Valori individuale pot fi interogate cu un script în afara webroot-ului prin ini_get(), fără a expune totul. Iar în panourile de hosting, interfața arată versiunea atribuită fiecărui site, deși fără informații despre backport-uri.
Găsirea fișierelor uitate: pași concreți de verificare
Astfel descoperiți moștenirile vechi pe un server Linux. Comenzile doar citesc și nu modifică nimic.
- Căutați fișiere cu apel phpinfo (adaptați calea):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Verificați nume de fișiere tipice, chiar fără rezultate în conținut:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
-
Evaluați rezultatele: Nu fiecare apariție este un fișier de test. Instrumente de administrare, panouri sau framework-uri pot folosi
phpinfo()în spatele unei autentificări. Decisiv este dacă fișierul este accesibil din internet fără autentificare. -
Priviți accesările din jurnal înainte de a șterge:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Ștergeți și schimbați secretele: Dacă în ieșire se afla o parolă sau o cheie și fișierul era public, valoarea se consideră cunoscută. Modificați-o.
O apariție cu dată de creare necunoscută și conținut suspect alături de apelul phpinfo poate fi și o ușă dosnică. Atunci nu ștergeți doar, ci salvați și lăsați să fie verificat, vedeți Recunoașterea și eliminarea webshell-urilor.
Prevenire durabilă în loc de curățenie
Trei măsuri fac ca tema să nu mai revină. Prima: includeți phpinfo în lista disable_functions din php.ini pentru contextul web. Verificați mai întâi dacă panoul dumneavoastră are nevoie de funcție pentru o pagină de stare. Cum acționează setarea și unde sunt limitele ei se găsește la Folosirea corectă a disable_functions.
; php.ini pentru FPM sau Apache, apoi reporniți toate procesele PHP
disable_functions = phpinfo
expose_php = Off
A doua: furnizare doar printr-un proces fix, de exemplu prin Git sau pipeline de build, pentru ca niciun fișier individual să nu ajungă manual în webroot. A treia: informațiile de stare aparțin monitorizării sau inventarului, nu unei pagini publice.
expose_php = Off elimină în plus antetul prin care PHP comunică versiunea sa în fiecare răspuns. Aceasta nu înlocuiește o actualizare, dar răpește scannerelor automate o informație comodă. Cine are mai multe persoane cu acces la server ar trebui să convină în plus o regulă simplă: fișierele de test sunt șterse în același pas în care au fost create, nu abia „mai târziu”.
Cum ajută PHP SOS concret?
- Căutăm în webroot-urile dumneavoastră fișiere phpinfo, scripturi de test și alte moșteniri vechi și evaluăm fiecare apariție.
- Analizăm accesările la fișierele găsite și vă spunem ce secrete ar trebui să înlocuiți.
- Dovedim nivelul de patch împotriva PHP2Shell prin changelog-ul pachetului și pornirea proceselor, nu printr-un afișaj de versiune.
- Implementăm durabil
disable_functions,expose_phpși alte întăriri în cadrul întăririi serverului.
Concluzie: Un fișier phpinfo este creat în secunde și este uitat la fel de repede. Cine îl caută și îl elimină acum închide o scurgere de date inutilă și se bazează, la nivelul de patch, pe dovezi solide.
Întrebări frecvente
Este un fișier phpinfo, în sine, o vulnerabilitate?
Nu deschide niciun acces, dar oferă atacatorilor o descriere detaliată a serverului: versiune, module, căi, setări și, în funcție de mediu, chiar variabile de mediu. Aceasta ușurează atacurile țintite și poate dezvălui date de acces.
Dovedește numărul versiunii din phpinfo că PHP2Shell este remediat?
Nu. Distribuțiile și furnizorii de hosting aplică adesea corecțiile ca backport, iar numărul afișat rămâne atunci același. Nivelul de patch îl dovedesc changelog-ul pachetului și confirmarea furnizorului, plus repornirea tuturor proceselor PHP.
Ce fac dacă un fișier phpinfo a fost public mai mult timp?
Ștergeți fișierul, verificați în access log cine l-a accesat și înlocuiți toate secretele care apăreau în ieșire, de exemplu parole de baze de date sau chei API din variabilele de mediu.
Pot dezactiva complet phpinfo()?
Da, prin disable_functions în php.ini al contextului web. Verificați mai întâi dacă un panou sau o aplicație folosește funcția pentru pagini de stare și reporniți apoi procesele PHP.