Trenutno stanje: PHP2Shell. Dvije kritične PHP ranjivosti (CVSS 9.2) omogućuju zlonamjerni kod bez prijave. Zakrpe od 21. 10. 2026.Što sada učiniti →

phpinfo() datoteke: zašto moraju nestati

Nakon PHP2Shella mnogi administratori brzo stvore info.php. Zašto su takve datoteke curenje podataka, kako ih pronaći i koji su bolji putovi provjere.

Stanje 5 min čitanjaSiguran razvoj

Ukratko: Datoteka koja samo poziva phpinfo() svakom posjetitelju pokazuje verziju, module, putanje i postavke PHP-a, često i varijable okruženja s pristupnim podacima. Za sigurnost phpinfo-a stoga vrijedi: takve datoteke nikad ne ostavljati trajno u webrootu, brisati ih nakon uporabe, a stanje PHP-a radije provjeravati preko upravljanja paketima i konfiguracije. Stanje zakrpe protiv PHP2Shella phpinfo ispis ionako ne dokazuje.

Testna datoteka koja ostaje

Od 21. 10. 2026. tisuće administratora provjeravaju koju PHP verziju isporučuju njihove web-stranice. Najbrži put je poznat: stvoriti datoteku info.php s jednim jedinim retkom, pozvati je u pregledniku, pročitati rezultat. To radi. Problem počinje poslije, kad se datoteka zaboravi.

Takve datoteke preživljavaju začuđujuće dugo. Sele se pri selidbama, završavaju u sigurnosnim kopijama i nakon godina se pojavljuju u direktorijima koje više nitko ne poznaje. Automatizirani skeneri neprestano pozivaju tipične nazive datoteka. Što je administratoru bila pomoć, napadaču je nacrt poslužitelja.

Osobito su pogođene agencije i hosteri s mnogo web-stranica klijenata. Tko u užurbanom tjednu provjerava desetke web-stranica, brzo stvori desetke testnih datoteka. Jedan jedini zaboravljeni direktorij dovoljan je da datoteka mjesecima kasnije još bude dostupna.

Što phpinfo() otkriva i zašto je to važno za sigurnost

Prema PHP priručniku phpinfo() ispisuje trenutačno stanje PHP-a. Konstantama se može upravljati koji dijelovi se pojavljuju; bez navoda to je sve.

Područje (konstanta) Sadržaj prema priručniku Zašto je osjetljivo
INFO_GENERAL build, lokacija php.ini, web-poslužitelj, sustav otkriva operacijski sustav i putanje
INFO_CONFIGURATION lokalne i master vrijednosti svih direktiva pokazuje djeluju li disable_functions ili open_basedir
INFO_MODULES učitana proširenja s postavkama napadači vide koje su funkcije dostupne
INFO_ENVIRONMENT varijable okruženja ovdje često stoje pristupni podaci za bazu ili API
INFO_VARIABLES unaprijed definirane varijable (Environment, GET, POST, Cookie, Server) sadrži zaglavlja i kolačiće trenutačnog zahtjeva

Najopasniji su posljednja dva retka. Moderne aplikacije pristupne podatke rado učitavaju iz varijabli okruženja, primjerice iz .env datoteke ili iz konfiguracije containera. Te vrijednosti tada stoje u ispisu kao otvoreni tekst. Kako se takve tajne u načelu štite, opisuje članak Ispravno zaštititi pristupne podatke i .env datoteke.

Tome se pridodaje: ispis pokazuje vrijednosti tekućeg zahtjeva, dakle i kolačiće i zaglavlja. Ako napadač može posjetitelja usmjeriti na stranicu i pročitati odgovor, primjerice preko Cross-Site-Scripting ranjivosti na drugom mjestu, vidljivi postaju čak i kolačići označeni kao HttpOnly.

Zašto phpinfo nije dokaz protiv PHP2Shella

Mnogi su datoteku stvorili upravo da provjere stanje zakrpe. Za to je prikladna samo uvjetno. Distribucije i hosteri ispravke često primjenjuju kao backport; prema izvješćima Ubuntu 24.04 nakon updatea i dalje prikazuje 8.3.6. Prikazani broj dakle govori malo. Obrnuto, aktualan broj ne dokazuje da su svi workeri ponovno pokrenuti.

Pouzdano je stanje paketa s CVE brojevima u changelogu, dopunjeno ponovnim pokretanjem svih PHP procesa. Kako to ide, objašnjava članak Ispravno provjeriti PHP verziju i stanje zakrpe.

Kratkotrajan ispis u web-kontekstu ipak ima svoje mjesto: pokazuje koji php.ini i koje vrijednosti doista vrijede za web-stranicu, jer naredbena linija često čita drugu konfiguraciju. Pozadinu o razinama i prednosti objašnjava php.ini objašnjen. Ako Vam to treba, onda zaštićeno pristupom, sa slučajnim nazivom datoteke i samo na nekoliko minuta.

Za većinu pitanja ionako postoje bolji putovi. PHP verzija FPM poola stoji u njegovoj konfiguraciji i u popisu procesa. Pojedinačne vrijednosti mogu se skriptom izvan webroota dohvatiti pomoću ini_get(), a da se ne otkrije sve. A u hosting panelima sučelje prikazuje dodijeljenu verziju po web-stranici, iako bez izjave o backportima.

Pronaći zaboravljene datoteke: konkretni koraci provjere

Ovako na Linux poslužitelju pronalazite naslijeđene ostatke. Naredbe samo čitaju i ništa ne mijenjaju.

  1. Potražiti datoteke s pozivom phpinfo (prilagoditi putanju):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
  1. Provjeriti tipične nazive datoteka, i bez pogotka u sadržaju:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
  1. Ocijeniti pogotke: nije svako nalazište testna datoteka. Administratorski alati, paneli ili frameworci mogu koristiti phpinfo() iza prijave. Odlučuje je li datoteka dostupna s interneta bez prijave.

  2. Pogledati pristupe u zapisniku prije brisanja:

grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
  1. Obrisati i zamijeniti tajne: ako je u ispisu stajala lozinka ili ključ, a datoteka je bila javna, vrijednost se smatra poznatom. Promijenite je.
Savjet

Nalazište s nepoznatim datumom izrade i upadljivim sadržajem pokraj poziva phpinfo može biti i stražnja vrata. Tada ne samo obrisati, nego osigurati i dati provjeriti, vidi Prepoznati i ukloniti webshellove.

Trajno spriječiti umjesto čistiti

Tri mjere osiguravaju da se tema ne vrati. Prvo: phpinfo uvrstiti na popis disable_functions u php.ini za web-kontekst. Prethodno provjerite treba li Vaš panel funkciju za stranicu statusa. Kako postavka djeluje i gdje su njezine granice, stoji u članku Ispravno koristiti disable_functions.

; php.ini za FPM ili Apache, nakon toga ponovno pokrenuti sve PHP procese
disable_functions = phpinfo
expose_php = Off

Drugo: postavljanje samo preko čvrstog postupka, primjerice putem Gita ili build pipelinea, kako pojedinačne datoteke ne bi ručno dospijevale u webroot. Treće: informacije o statusu pripadaju u nadzor ili inventar, a ne na javnu stranicu.

expose_php = Off dodatno uklanja zaglavlje kojim PHP u svakom odgovoru priopćava svoju verziju. To ne zamjenjuje update, ali automatiziranim skenerima oduzima zgodnu informaciju. Tko ima više osoba s pristupom poslužitelju, trebao bi uz to dogovoriti jednostavno pravilo: testne datoteke brišu se u istom radnom koraku u kojem su stvorene, a ne tek „kasnije“.

Kako PHP SOS konkretno pomaže?

  • Pretražujemo Vaše webrootove u potrazi za phpinfo datotekama, testnim skriptama i drugim naslijeđenim ostacima te ocjenjujemo svako nalazište.
  • Analiziramo pristupe pronađenim datotekama i kažemo Vam koje biste tajne trebali zamijeniti.
  • Stanje zakrpe protiv PHP2Shella dokazujemo preko changelog paketa i pokretanja procesa, a ne prikazom verzije.
  • disable_functions, expose_php i druga ojačavanja trajno provodimo u okviru ojačavanja poslužitelja.

Zaključak: phpinfo datoteka se stvori u sekundama i jednako brzo zaboravi. Tko je sada potraži i ukloni, zatvara nepotrebno curenje podataka i pri stanju zakrpe oslanja se na pouzdane dokaze.

Česta pitanja

Je li phpinfo datoteka sama po sebi sigurnosna ranjivost?

Ne otvara pristup, ali napadačima daje detaljan opis poslužitelja: verziju, module, putanje, postavke i, ovisno o okruženju, varijable okruženja. To olakšava ciljane napade i može otkriti pristupne podatke.

Dokazuje li broj verzije u phpinfo da je PHP2Shell zakrpan?

Ne. Distribucije i hosteri ispravke često primjenjuju kao backport, pa prikazani broj ostaje isti. Stanje zakrpe dokazuju changelog paketa i potvrda pružatelja, uz ponovno pokretanje svih PHP procesa.

Što učiniti ako je phpinfo datoteka dulje vrijeme bila javna?

Obrisati datoteku, u access zapisniku provjeriti tko ju je dohvaćao i zamijeniti sve tajne koje su stajale u ispisu, primjerice lozinke baza podataka ili API ključeve iz varijabli okruženja.

Mogu li phpinfo() potpuno isključiti?

Da, pomoću disable_functions u php.ini web-konteksta. Prethodno provjerite koristi li panel ili aplikacija funkciju za stranice statusa, a PHP procese nakon toga ponovno pokrenite.

Izvori

Hitni kontakt

Svaki sat se računa. Pišite nam odmah.

Ukratko opišite sustav, verziju PHP-a i opažanje. Javit ćemo Vam se, razjasniti situaciju i raditi na daljinu dok incident nije zaključen i dokumentiran.

Hitna pomoć