Trenutno stanje: PHP2Shell. Dve kritični ranljivosti PHP (CVSS 9,2) omogočata izvedbo škodljive kode brez prijave. Popravki od 21. 10. 2026.Kaj je zdaj treba storiti →

Datoteke phpinfo(): zakaj morajo izginiti

Po PHP2Shell mnogi skrbniki hitro ustvarijo info.php. Zakaj so take datoteke uhajanje podatkov, kako jih najdete in katere poti preverjanja so boljše.

Stanje 5 min branjaVaren razvoj

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.

  1. Poiščite datoteke s klicem phpinfo (prilagodite pot):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
  1. 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
  1. 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.

  2. 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
  1. Izbrišite in zamenjajte skrivnosti: če je bilo v izpisu geslo ali ključ in je bila datoteka javna, vrednost velja za znano. Spremenite jo.
Nasvet

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_php in 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.

Viri

Takojšnji stik

Vsaka ura šteje. Pišite nam zdaj.

Na kratko opišite sistem, različico PHP in opažanje. Odzovemo se, razjasnimo stanje in delamo na daljavo, dokler incident ni zaključen in dokumentiran.

Takojšnja pomoč