Trumpai: failas, kuris tik kviečia phpinfo(), kiekvienam lankytojui parodo PHP versiją, modulius, kelius ir nustatymus, dažnai ir aplinkos kintamuosius su prisijungimo duomenimis. phpinfo saugumui todėl galioja: tokių failų niekada nepalikti ilgam žiniatinklio šakniniame kataloge, panaudojus ištrinti, o PHP būseną verčiau tikrinti per paketų valdymą ir konfigūraciją. Pataisų būsenos nuo PHP2Shell phpinfo išvestis vis tiek neįrodo.
Bandomasis failas, kuris lieka
Nuo 2026-10-21 tūkstančiai administratorių tikrina, kokią PHP versiją pateikia jų svetainės. Greičiausias kelias žinomas: sukurti failą info.php su viena eilute, atidaryti naršyklėje, nuskaityti rezultatą. Tai veikia. Problema prasideda po to, kai failas pamirštamas.
Tokie failai išgyvena stebėtinai ilgai. Jie keliauja kartu perkeliant, patenka į atsargines kopijas ir po metų atsiranda kataloguose, kurių niekas nebepažįsta. Automatiniai skaneriai nuolat kviečia tipinius failų vardus. Kas administratoriui buvo pagalbinė priemonė, užpuolikui yra serverio statybos instrukcija.
Ypač paveiktos agentūros ir talpinimo teikėjai su daug klientų svetainių. Kas sunkią savaitę tikrina dešimtis svetainių, greitai sukuria dešimtis bandomųjų failų. Vieno pamiršto aplanko pakanka, kad failas po mėnesių vis dar būtų pasiekiamas.
Ką phpinfo() išduoda ir kodėl tai svarbu saugumui
Pasak PHP vadovo, phpinfo() išveda dabartinę PHP būseną. Per konstantas galima valdyti, kurios dalys rodomos; be nurodymo rodoma viskas.
| Sritis (konstanta) | Turinys pagal vadovą | Kodėl jautru |
|---|---|---|
INFO_GENERAL |
kūrinys (build), php.ini vieta, žiniatinklio serveris, sistema | išduoda operacinę sistemą ir kelius |
INFO_CONFIGURATION |
visų direktyvų vietinės ir pagrindinės reikšmės | rodo, ar disable_functions ar open_basedir veikia |
INFO_MODULES |
įkelti plėtiniai su nustatymais | užpuolikai mato, kurios funkcijos prieinamos |
INFO_ENVIRONMENT |
aplinkos kintamieji | čia dažnai yra duomenų bazės ar API prisijungimo duomenys |
INFO_VARIABLES |
iš anksto apibrėžti kintamieji (Environment, GET, POST, Cookie, Server) | turi dabartinės užklausos antraštes ir slapukus |
Pavojingiausios paskutinės dvi eilutės. Šiuolaikinės programos prisijungimo duomenis mielai kraunasi iš aplinkos kintamųjų, pavyzdžiui, iš .env failo ar konteinerio konfigūracijos. Šios reikšmės išvestyje tada rodomos atviru tekstu. Kaip tokias paslaptis apskritai apsaugoti, aprašo straipsnis Prisijungimo duomenų ir .env failų teisinga apsauga.
Be to: išvestis rodo vykstančios užklausos reikšmes, taigi ir slapukus bei antraštes. Jei užpuolikas gali nukreipti lankytoją į puslapį ir perskaityti atsakymą, pavyzdžiui, per Cross-Site Scripting spragą kitoje vietoje, tampa matomi net kaip HttpOnly pažymėti slapukai.
Kodėl phpinfo nėra įrodymas nuo PHP2Shell
Daugelis failą sukūrė būtent pataisų būsenai patikrinti. Tam jis tinka tik ribotai. Distribucijos ir talpinimo teikėjai pataisas dažnai įdiegia kaip atgalinį perkėlimą (backport); pasak pranešimų, pavyzdžiui, Ubuntu 24.04 po atnaujinimo toliau rodo 8.3.6. Rodomas numeris todėl sako mažai. Atvirkščiai, naujas numeris neįrodo, kad visi darbiniai procesai (worker) paleisti iš naujo.
Patikima yra paketo būsena su CVE numeriais changelog, papildyta visų PHP procesų paleidimu iš naujo. Kaip tai padaryti, aiškina straipsnis PHP versijos ir pataisų būsenos teisingas tikrinimas.
Trumpalaikė išvestis žiniatinklio kontekste vis tiek turi savo vietą: ji parodo, kuri php.ini ir kurios reikšmės svetainei iš tikrųjų galioja, nes komandinė eilutė dažnai skaito kitą konfigūraciją. Lygmenų ir pirmenybės pagrindus aiškina php.ini paaiškinimas. Jei to reikia, tai su prieigos apsauga, atsitiktiniu failo vardu ir tik minutėms.
Daugumai klausimų vis tiek yra geresni būdai. FPM baseino PHP versija nurodyta jo konfigūracijoje ir procesų sąraše. Pavienes reikšmes galima užklausti scenarijumi už žiniatinklio šakninio katalogo per ini_get(), neatskleidžiant visko. O talpinimo valdymo skydeliuose sąsaja rodo kiekvienai svetainei priskirtą versiją, nors be informacijos apie atgalinius perkėlimus.
Pamirštų failų paieška: konkretūs tikrinimo žingsniai
Taip rasite senus likučius Linux serveryje. Komandos tik skaito ir nieko nekeičia.
- Ieškoti failų su phpinfo kreipiniu (pritaikyti kelią):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
- Patikrinti tipinius failų vardus, net be radinių turinyje:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
-
Įvertinti radinius: ne kiekvienas radinys yra bandomasis failas. Administravimo įrankiai, valdymo skydeliai ar karkasai gali naudoti
phpinfo()už prisijungimo. Lemia, ar failas pasiekiamas iš interneto be prisijungimo. -
Prieš ištrinant, pažiūrėti kreipinius žurnale:
grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
- Ištrinti ir pakeisti paslaptis: jei išvestyje buvo slaptažodis ar raktas ir failas buvo viešas, reikšmė laikoma žinoma. Pakeiskite ją.
Radinys su nežinoma sukūrimo data ir neįprastu turiniu šalia phpinfo kreipinio gali būti ir užpakalinės durys. Tada ne tik ištrinkite, bet ir išsaugokite bei leiskite patikrinti, žr. Webshell atpažinimas ir pašalinimas.
Ilgalaikė prevencija vietoj tvarkymo
Trys priemonės pasirūpina, kad tema negrįžtų. Pirma: phpinfo įtraukti į sąrašą disable_functions žiniatinklio konteksto php.ini. Anksčiau patikrinkite, ar jūsų skydelis funkciją reikalauja būsenos puslapiui. Kaip nustatymas veikia ir kur jo ribos, rašoma disable_functions teisingas naudojimas.
; php.ini FPM arba Apache, po to iš naujo paleisti visus PHP procesus
disable_functions = phpinfo
expose_php = Off
Antra: paskleidimas tik per fiksuotą eigą, pavyzdžiui, per Git ar kūrimo konvejerį, kad pavieniai failai rankomis nepatektų į žiniatinklio šakninį katalogą. Trečia: būsenos informacijai vieta stebėsenoje ar inventoriuje, o ne viešame puslapyje.
expose_php = Off papildomai pašalina antraštę, kuria PHP kiekviename atsakyme praneša savo versiją. Tai atnaujinimo nepakeičia, bet automatiniams skaneriams atima patogią informaciją. Kas turi kelis žmones su serverio prieiga, turėtų papildomai sutarti paprastą taisyklę: bandomieji failai ištrinami tame pačiame darbo žingsnyje, kuriame sukurti, o ne „vėliau“.
Kaip PHP SOS padeda konkrečiai?
- Peržiūrime jūsų žiniatinklio šakninius katalogus ieškodami phpinfo failų, bandomųjų scenarijų ir kitų senų likučių ir įvertiname kiekvieną radinį.
- Įvertiname kreipinius į rastus failus ir pasakome, kurias paslaptis turėtumėte pakeisti.
- Pataisų būseną nuo PHP2Shell įrodome per paketo changelog ir procesų paleidimą, o ne per versijos rodinį.
disable_functions,expose_phpir kitus sutvirtinimus serverio sutvirtinimo rėmuose įgyvendiname ilgam.
Išvada: phpinfo failas sukuriamas per sekundes ir pamirštamas tiek pat greitai. Kas jo dabar ieško ir jį pašalina, uždaro nereikalingą duomenų nutekėjimą ir dėl pataisų būsenos remiasi patikimais įrodymais.
Dažni klausimai
Ar phpinfo failas savaime yra saugumo spraga?
Jis neatveria prieigos, bet užpuolikams pateikia išsamų serverio aprašymą: versiją, modulius, kelius, nustatymus ir, priklausomai nuo aplinkos, aplinkos kintamuosius. Tai palengvina tikslines atakas ir gali atskleisti prisijungimo duomenis.
Ar versijos numeris phpinfo įrodo, kad PHP2Shell pataisytas?
Ne. Distribucijos ir talpinimo teikėjai pataisas dažnai įdiegia kaip atgalinį perkėlimą (backport), ir rodomas numeris išlieka toks pat. Pataisų būseną įrodo paketo changelog ir teikėjo patvirtinimas, taip pat visų PHP procesų paleidimas iš naujo.
Ką daryti, jei phpinfo failas ilgesnį laiką buvo viešas?
Ištrinti failą, prieigos žurnale pažiūrėti, kas jį kvietė, ir pakeisti visas išvestyje buvusias paslaptis, pavyzdžiui, duomenų bazės slaptažodžius ar API raktus iš aplinkos kintamųjų.
Ar galiu phpinfo() išjungti visiškai?
Taip, per disable_functions žiniatinklio konteksto php.ini. Anksčiau patikrinkite, ar valdymo skydelis ar programa funkciją naudoja būsenos puslapiams, ir po to iš naujo paleiskite PHP procesus.