Na kratko: Datoteka, ki samo kliče phpinfo(), vsakemu obiskovalcu pokaže različico, module, poti in nastavitve PHP, pogosto tudi spremenljivke okolja z dostopnimi podatki. Za varnost phpinfo zato velja: takih datotek nikoli ne puščajte trajno v webrootu, po uporabi jih izbrišite, stanje PHP pa raje preverjajte prek upravljanja paketov in konfiguracije. Stanja popravkov proti PHP2Shell izpis phpinfo tako ali tako ne dokazuje.
Testna datoteka, ki ostane
Od 21. 10. 2026 na tisoče skrbnikov preverja, katero različico PHP dostavljajo njihove spletne strani. Najhitrejša pot je znana: ustvarite datoteko info.php z eno samo vrstico, jo odprete v brskalniku in preberete rezultat. To deluje. Težava se začne potem, ko se datoteka pozabi.
Take datoteke preživijo presenetljivo dolgo. Selijo se z preselitvami, končajo v varnostnih kopijah in se po letih pojavijo v imenikih, ki jih nihče več ne pozna. Samodejni skenerji nenehno poizvedujejo po tipičnih imenih datotek. Kar je bilo za skrbnika pripomoček, je za napadalca načrt strežnika.
Posebej so prizadete agencije in ponudniki gostovanja z mnogimi spletnimi stranmi strank. Kdor v mrzličnem tednu preverja ducate spletnih strani, hitro ustvari ducate testnih datotek. Dovolj je ena sama pozabljena mapa, da je datoteka mesece pozneje še vedno dosegljiva.
Kaj phpinfo() izda in zakaj je to pomembno za varnost
Po priročniku PHP phpinfo() izpiše trenutno stanje PHP. S konstantami je mogoče nadzorovati, kateri deli se prikažejo; brez navedbe je to vse.
| Področje (konstanta) | Vsebina po priročniku | Zakaj je občutljivo |
|---|---|---|
INFO_GENERAL |
gradnja, lokacija php.ini, spletni strežnik, sistem | izda operacijski sistem in poti |
INFO_CONFIGURATION |
lokalne in glavne vrednosti vseh direktiv | pokaže, ali disable_functions ali open_basedir delujeta |
INFO_MODULES |
naložene razširitve z nastavitvami | napadalci vidijo, katere funkcije so na voljo |
INFO_ENVIRONMENT |
spremenljivke okolja | tu so pogosto dostopni podatki za bazo podatkov ali API |
INFO_VARIABLES |
vnaprej določene spremenljivke (Environment, GET, POST, Cookie, Server) | vsebuje glave in piškotke trenutne zahteve |
Najnevarnejši sta zadnji dve vrstici. Sodobne aplikacije dostopne podatke rade nalagajo iz spremenljivk okolja, na primer iz datoteke .env ali iz konfiguracije vsebnika. Te vrednosti so potem v izpisu v golem besedilu. Kako take skrivnosti načeloma zaščitite, opisuje prispevek Pravilna zaščita dostopnih podatkov in datotek .env.
Poleg tega izpis kaže vrednosti tekoče zahteve, torej tudi piškotke in glave. Če lahko napadalec obiskovalca preusmeri na stran in prebere odgovor, na primer prek ranljivosti cross-site scripting na drugem mestu, postanejo vidni tudi piškotki, označeni kot HttpOnly.
Zakaj phpinfo ni dokaz proti PHP2Shell
Mnogi so datoteko ustvarili ravno zato, da bi preverili stanje popravkov. Za to je primerna le pogojno. Distribucije in ponudniki gostovanja popravke pogosto vgradijo kot backport; po poročilih Ubuntu 24.04 po posodobitvi še naprej kaže 8.3.6. Prikazana številka torej pove malo. Obratno aktualna številka ne dokazuje, da so bili vsi workerji znova zagnani.
Zanesljivo je stanje paketa s številkami CVE v dnevniku sprememb, dopolnjeno s ponovnim zagonom vseh procesov PHP. Kako to storite, pojasnjuje prispevek Pravilno preverjanje različice PHP in stanja popravkov.
Kratkotrajen izpis v spletnem kontekstu ima kljub temu svoje mesto: pokaže, katera php.ini in katere vrednosti dejansko veljajo za spletno stran, saj ukazna vrstica pogosto bere drugo konfiguracijo. Ozadje o ravneh in prednosti pojasnjuje Pojasnilo o php.ini. Če to potrebujete, potem z zaščito dostopa, z naključnim imenom datoteke in samo za minute.
Za večino vprašanj so tako ali tako boljše poti. Različica PHP poola FPM je navedena v njegovi konfiguraciji in v seznamu procesov. Posamezne vrednosti je mogoče poizvedovati s skripto zunaj webroota prek ini_get(), ne da bi razkrili vse. In v nadzornih ploščah gostovanja vmesnik prikazuje dodeljeno različico za vsako spletno stran, čeprav brez izjave o backportih.
Iskanje pozabljenih datotek: konkretni koraki preverjanja
Tako na strežniku Linux odkrijete stare ostanke. Ukazi samo berejo in ničesar ne spreminjajo.
- Poiščite datoteke s klicem phpinfo (prilagodite pot):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Preverite tipična imena datotek, tudi brez zadetka v vsebini:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
-
Ocenite zadetke: vsaka najdba ni testna datoteka. Skrbniška orodja, nadzorne plošče ali ogrodja lahko
phpinfo()uporabljajo za prijavo. Odločilno je, ali je datoteka dosegljiva z interneta brez prijave. -
Preglejte dostope v dnevniku, preden izbrišete:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Izbrišite in zamenjajte skrivnosti: če je bilo v izpisu geslo ali ključ in je bila datoteka javna, vrednost velja za znano. Spremenite jo.
Najdba z neznanim datumom nastanka in nenavadno vsebino ob klicu phpinfo je lahko tudi stranska vrata. Takrat je ne samo izbrišite, ampak jo zavarujte in dajte preveriti, glejte Prepoznavanje in odstranjevanje webshellov.
Trajno preprečevanje namesto čiščenja
Trije ukrepi poskrbijo, da tema ne bo prišla nazaj. Prvič: phpinfo vpišite na seznam disable_functions v php.ini za spletni kontekst. Prej preverite, ali vaša nadzorna plošča funkcijo potrebuje za stran s stanjem. Kako nastavitev deluje in kje so njene meje, piše v prispevku Pravilna uporaba disable_functions.
; php.ini za FPM ali Apache, nato znova zaženite vse procese PHP
disable_functions = phpinfo
expose_php = Off
Drugič: razmeščanje samo po stalnem postopku, na primer prek Gita ali gradbenega cevovoda, da posamezne datoteke ne pridejo ročno v webroot. Tretjič: informacije o stanju sodijo v nadzor ali popis, ne na javno stran.
expose_php = Off dodatno odstrani glavo, s katero PHP v vsakem odgovoru sporoča svojo različico. To posodobitve ne nadomesti, samodejnim skenerjem pa vzame priročno informacijo. Kdor ima več oseb z dostopom do strežnika, naj poleg tega dogovori preprosto pravilo: testne datoteke se izbrišejo v istem delovnem koraku, v katerem so bile ustvarjene, ne šele „pozneje“.
Kako konkretno pomaga PHP SOS?
- Preiščemo vaše webroote glede datotek phpinfo, testnih skript in drugih starih ostankov ter ocenimo vsako najdbo.
- Ovrednotimo dostope do najdenih datotek in vam povemo, katere skrivnosti naj zamenjate.
- Stanje popravkov proti PHP2Shell dokažemo z dnevnikom sprememb paketa in zagonom procesov namesto s prikazom različice.
disable_functions,expose_phpin druga utrjevanja trajno uvedemo v okviru utrjevanja strežnika.
Sklep: Datoteka phpinfo je ustvarjena v sekundah in prav tako hitro pozabljena. Kdor jo išče in odstrani zdaj, zapre nepotrebno uhajanje podatkov in se pri stanju popravkov zanese na zanesljiva dokazila.
Pogosta vprašanja
Ali je datoteka phpinfo sama po sebi varnostna vrzel?
Ne odpira dostopa, a napadalcem poda podroben opis strežnika: različico, module, poti, nastavitve in glede na okolje tudi spremenljivke okolja. To olajša ciljne napade in lahko razkrije dostopne podatke.
Ali številka različice v phpinfo dokazuje, da je PHP2Shell popravljen?
Ne. Distribucije in ponudniki gostovanja popravke pogosto vgradijo kot backport, prikazana številka pa ostane enaka. Stanje popravkov dokažeta dnevnik sprememb paketa in potrditev ponudnika, poleg tega ponovni zagon vseh procesov PHP.
Kaj storiti, če je bila datoteka phpinfo dalj časa javna?
Datoteko izbrišite, v dnevniku dostopa preverite, kdo jo je klical, in zamenjajte vse skrivnosti, ki so bile v izpisu, na primer gesla baze podatkov ali ključe API iz spremenljivk okolja.
Ali lahko phpinfo() popolnoma izklopim?
Da, prek disable_functions v php.ini spletnega konteksta. Prej preverite, ali nadzorna plošča ali aplikacija funkcijo uporablja za strani s stanjem, nato pa znova zaženite procese PHP.