Ajankohtainen tilanne: PHP2Shell. Kaksi kriittistä PHP-haavoittuvuutta (CVSS 9.2) sallii haittakoodin suorittamisen ilman kirjautumista. Korjaukset 21.10.2026 alkaen.Mitä nyt on tehtävä →

phpinfo()-tiedostot: miksi niiden on poistuttava

PHP2Shellin jälkeen moni ylläpitäjä luo nopeasti tiedoston info.php. Miksi tällaiset tiedostot ovat tietovuoto, miten ne löydetään ja mitkä tarkistustavat ovat parempia.

Tilanne Lukuaika 4 minTurvallinen kehitys

Lyhyesti: Tiedosto, joka vain kutsuu phpinfo()-funktiota, näyttää jokaiselle kävijälle PHP:n version, moduulit, polut ja asetukset, usein myös ympäristömuuttujat tunnuksineen. phpinfon tietoturvan kannalta pätee siksi: tällaisia tiedostoja ei jätetä pysyvästi verkkojuureen, ne poistetaan käytön jälkeen ja PHP:n tila tarkistetaan mieluummin paketinhallinnan ja konfiguraation kautta. PHP2Shellin korjaustilaa phpinfo-tuloste ei joka tapauksessa todista.

Testitiedosto, joka jää

21.10.2026 alkaen tuhannet ylläpitäjät tarkistavat, mitä PHP-versiota heidän verkkosivustonsa tarjoilevat. Nopein tie on tuttu: luodaan tiedosto info.php yhdellä rivillä, avataan se selaimessa ja luetaan tulos. Se toimii. Ongelma alkaa sen jälkeen, kun tiedosto unohtuu.

Tällaiset tiedostot säilyvät yllättävän pitkään. Ne siirtyvät mukana muutoissa, päätyvät varmuuskopioihin ja ilmestyvät vuosien jälkeen hakemistoihin, joita kukaan ei enää tunne. Automaattiset skannerit kysyvät tyypillisiä tiedostonimiä jatkuvasti. Mikä oli ylläpitäjälle apuväline, on hyökkääjälle palvelimen rakennusohje.

Erityisesti kohteena ovat virastot ja hosting-yritykset, joilla on paljon asiakassivustoja. Joka tarkistaa kiireisellä viikolla kymmeniä verkkosivustoja, luo nopeasti kymmeniä testitiedostoja. Yksi ainoa unohtunut kansio riittää siihen, että tiedosto on haettavissa vielä kuukausien päästä.

Mitä phpinfo() paljastaa ja miksi sillä on tietoturvamerkitystä

PHP-käsikirjan mukaan phpinfo() tulostaa PHP:n nykyisen tilan. Vakioilla voi ohjata, mitkä osat näkyvät; ilman määritystä näkyy kaikki.

Alue (vakio) Sisältö käsikirjan mukaan Miksi arkaluonteinen
INFO_GENERAL build, php.ini:n sijainti, verkkopalvelin, järjestelmä paljastaa käyttöjärjestelmän ja polut
INFO_CONFIGURATION kaikkien direktiivien paikalliset ja päätason arvot näyttää, toimivatko disable_functions tai open_basedir
INFO_MODULES ladatut laajennukset asetuksineen hyökkääjät näkevät, mitkä funktiot ovat käytettävissä
INFO_ENVIRONMENT ympäristömuuttujat tässä on usein tietokannan tai API:n tunnuksia
INFO_VARIABLES ennalta määritellyt muuttujat (Environment, GET, POST, Cookie, Server) sisältää nykyisen pyynnön otsikot ja evästeet

Vaarallisimmat ovat kaksi viimeistä riviä. Nykyaikaiset sovellukset lataavat tunnuksia mielellään ympäristömuuttujista, esimerkiksi .env-tiedostosta tai konttikonfiguraatiosta. Nämä arvot näkyvät silloin selkotekstinä tulosteessa. Miten tällaiset salaisuudet suojataan periaatteessa, kuvaa kirjoitus Tunnusten ja .env-tiedostojen oikea suojaus.

Lisäksi: tuloste näyttää käynnissä olevan pyynnön arvot eli myös evästeet ja otsikot. Jos hyökkääjä voi ohjata kävijän sivulle ja lukea vastauksen, esimerkiksi toisessa kohdassa olevan Cross-Site-Scripting-aukon kautta, jopa HttpOnly-merkityt evästeet tulevat näkyviin.

Miksi phpinfo ei todista PHP2Shelliä vastaan

Moni loi tiedoston juuri tarkistaakseen korjaustilan. Juuri siihen se sopii vain rajallisesti. Jakelut ja hosting-palveluntarjoajat asentavat korjaukset usein backportina; raporttien mukaan esimerkiksi Ubuntu 24.04 näyttää päivityksen jälkeenkin 8.3.6. Näytetty numero kertoo siis vähän. Päinvastoin, ajantasainen numero ei todista, että kaikki workerit on käynnistetty uudelleen.

Kestävä on paketin tila muutoslokin CVE-numeroineen, täydennettynä kaikkien PHP-prosessien uudelleenkäynnistyksellä. Miten se tehdään, selittää kirjoitus PHP-version ja korjaustilan oikea tarkistus.

Lyhytaikaisella tulosteella verkkokontekstissa on silti paikkansa: se näyttää, mitä php.ini-tiedostoa ja mitä arvoja verkkosivustolle todella sovelletaan, sillä komentorivi lukee usein toista konfiguraatiota. Tasojen ja ensisijaisuuden taustat selittää php.ini selitettynä. Jos tarvitsette tätä, tehkää se pääsysuojattuna, satunnaisella tiedostonimellä ja vain minuuteiksi.

Useimpiin kysymyksiin on joka tapauksessa parempia tapoja. FPM-poolin PHP-versio on sen konfiguraatiossa ja prosessilistassa. Yksittäisiä arvoja voi kysellä skriptillä verkkojuuren ulkopuolella funktiolla ini_get() paljastamatta kaikkea. Ja hosting-paneeleissa käyttöliittymä näyttää verkkosivustolle määrätyn version, joskin ilman tietoa backporteista.

Unohtuneiden tiedostojen löytäminen: konkreettiset tarkistusvaiheet

Näin jäänteet löytyvät Linux-palvelimelta. Komennot vain lukevat eivätkä muuta mitään.

  1. Etsikää tiedostot, joissa on phpinfo-kutsu (mukauttakaa polku):
grep -rlE "phpinfo[[:space:]]*\(" /var/www --include="*.php" 2>/dev/null
  1. Tarkistakaa tyypilliset tiedostonimet, vaikka sisällössä ei olisi osumia:
find /var/www -type f \( -iname "info.php" -o -iname "phpinfo.php" -o -iname "test.php" -o -iname "i.php" \) 2>/dev/null
  1. Arvioikaa osumat: Kaikki löydöt eivät ole testitiedostoja. Ylläpitotyökalut, paneelit tai kehykset voivat käyttää phpinfo()-funktiota kirjautumisen takana. Ratkaisevaa on, onko tiedosto saavutettavissa internetistä ilman kirjautumista.

  2. Katsokaa lokista käyttö, ennen kuin poistatte:

grep -E "GET /(info|phpinfo|test|i)\.php" /var/log/nginx/access.log* 2>/dev/null | tail -n 50
  1. Poistakaa ja vaihtakaa salaisuudet: Jos tulosteessa oli salasana tai avain ja tiedosto oli julkinen, arvo katsotaan tunnetuksi. Vaihtakaa se.
Vinkki

Löytö, jonka luontipäivä on tuntematon ja jonka sisällössä on phpinfo-kutsun lisäksi jotain epäilyttävää, voi olla myös takaovi. Silloin ei pidä vain poistaa vaan varmistaa ja tarkistuttaa, katso Web shellien tunnistaminen ja poisto.

Pysyvä ennaltaehkäisy siivoamisen sijaan

Kolme toimenpidettä huolehtii siitä, ettei aihe palaa. Ensimmäinen: lisätkää phpinfo verkkokontekstin php.ini-tiedoston luetteloon disable_functions. Tarkistakaa ensin, tarvitseeko paneelinne funktiota tilasivuun. Miten asetus toimii ja missä sen rajat ovat, kerrotaan kirjoituksessa disable_functions oikein käytettynä.

; php.ini FPM:lle tai Apachelle, käynnistäkää sen jälkeen kaikki PHP-prosessit uudelleen
disable_functions = phpinfo
expose_php = Off

Toinen: toimitus vain kiinteän toimintatavan kautta, esimerkiksi Gitillä tai build-putkella, jotta yksittäisiä tiedostoja ei päädy käsin verkkojuureen. Kolmas: tilatiedot kuuluvat valvontaan tai inventaarioon, eivät julkiselle sivulle.

expose_php = Off poistaa lisäksi otsikon, jolla PHP ilmoittaa versionsa jokaisessa vastauksessa. Se ei korvaa päivitystä, mutta vie automaattisilta skannereilta kätevän tiedon. Joka antaa palvelinpääsyn usealle henkilölle, kannattaa lisäksi sopia yksinkertainen sääntö: testitiedostot poistetaan samassa työvaiheessa, jossa ne luodaan, eikä vasta ”myöhemmin”.

Miten PHP SOS auttaa konkreettisesti?

  • Käymme verkkojuurenne läpi phpinfo-tiedostojen, testiskriptien ja muiden jäänteiden varalta ja arvioimme jokaisen löydön.
  • Analysoimme löydettyjen tiedostojen käytön ja kerromme, mitkä salaisuudet teidän kannattaa vaihtaa.
  • Todistamme PHP2Shellin korjaustilan paketin muutoslokilla ja prosessin käynnistyksellä versionäytön sijaan.
  • Toteutamme disable_functions, expose_php ja muut koventamistoimet pysyvästi palvelimen koventamisen puitteissa.

Yhteenveto: phpinfo-tiedosto luodaan sekunneissa ja unohdetaan yhtä nopeasti. Joka etsii ja poistaa sen nyt, sulkee tarpeettoman tietovuodon ja luottaa korjaustilan osalta kestäviin todisteisiin.

Usein kysytyt kysymykset

Onko phpinfo-tiedosto sinänsä tietoturva-aukko?

Se ei avaa pääsyä, mutta antaa hyökkääjille yksityiskohtaisen kuvauksen palvelimesta: versio, moduulit, polut, asetukset ja ympäristöstä riippuen myös ympäristömuuttujat. Se helpottaa kohdennettuja hyökkäyksiä ja voi paljastaa tunnuksia.

Todistaako phpinfon versionumero, että PHP2Shell on korjattu?

Ei. Jakelut ja hosting-palveluntarjoajat asentavat korjaukset usein backportina, jolloin näytetty numero pysyy samana. Korjaustilan todistavat paketin muutosloki ja palveluntarjoajan vahvistus sekä kaikkien PHP-prosessien uudelleenkäynnistys.

Mitä tehdä, jos phpinfo-tiedosto on ollut pitkään julkinen?

Poistakaa tiedosto, katsokaa Access-lokista, kuka sitä haki, ja vaihtakaa kaikki tulosteessa olleet salaisuudet, esimerkiksi ympäristömuuttujista tulleet tietokannan salasanat tai API-avaimet.

Voinko kytkeä phpinfo():n kokonaan pois?

Kyllä, asetuksella disable_functions verkkokontekstin php.ini-tiedostossa. Tarkistakaa ensin, käyttääkö paneeli tai sovellus funktiota tilasivuihin, ja käynnistäkää PHP-prosessit sen jälkeen uudelleen.

Lähteet

Pikayhteys

Jokainen tunti on tärkeä. Kirjoittakaa meille nyt.

Kuvatkaa lyhyesti järjestelmä, PHP-versio ja havainnot. Otamme yhteyttä, selvitämme tilanteen ja työskentelemme etänä, kunnes tapaus on käsitelty loppuun ja dokumentoitu.

Pikaapu