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ä →

Hämärretyn PHP-koodin tunnistaminen

Lukukelvoton PHP-koodi, jossa on eval ja base64_decode, on klassinen merkki lisätystä haittakoodista. Mitä kaavoja etsitte, miten löydätte ne vaarattomasti ja milloin hämärrys on oikeutettua.

Tilanne Lukuaika 5 minHavaitseminen ja forensiikka

Lyhyesti: Hämärretty PHP-koodi on koodia, joka on tehty tarkoituksella lukukelvottomaksi, yleensä koodauksella ja pakkauksella, joka puretaan vasta ajon aikana. Tyypillisiä tunnistuskaavoja ovat eval yhdessä base64_decode-, gzinflate- tai str_rot13-funktion kanssa, hyvin pitkät rivit, heksamerkkijonot ja funktioiden nimet, jotka kootaan osista. Etsikää vaarattomilla grep-komennoilla, älkää koskaan suorittako koodia ja verratkaa löydöt alkuperäiseen pakettiin.

Miksi hyökkääjät piilottavat koodinsa

Joka sijoittaa web shellin tai takaoven palvelimelle, haluaa sen pysyvän pitkään huomaamattomana. Luettava koodi pistäisi silmään jokaiselle ylläpitäjälle, joka avaa tiedoston, ja jokainen skanneri löytäisi sen. Siksi hyökkääjät pakkaavat koodinsa: se koodataan, pakataan ja kootaan ja suoritetaan uudelleen vasta kutsun yhteydessä.

PHP2Shellille ei ole vahvistettuja Indicators of Compromise -tunnisteita. Hämärretty koodi ei ole tämän aukon tunnusmerkki vaan yleinen merkki siitä, että joku on lisännyt koodia, riippumatta siitä, mitä kautta. Miten web shellit löydetään ja poistetaan kokonaisuutena, kuvaa Web shellin tunnistaminen ja poisto. Tämä artikkeli keskittyy kysymykseen, mistä hämärretyn koodin tunnistaa.

eval, base64 ja muut: tyypilliset rakennuspalikat

Hämärrys noudattaa lähes aina samaa periaatetta: lukukelvoton datalohko muunnetaan yhden tai useamman funktion avulla takaisin koodiksi, joka sitten suoritetaan. Seuraavat palikat toistuvat tässä yhä uudelleen.

Palikka Esimerkit Miksi se pistää silmään
Suoritus eval, assert merkkijonolla (PHP 7.x:ään asti), create_function (PHP 7.x:ään asti) suorittaa tekstin koodina
Dekoodaus base64_decode, str_rot13, hex2bin, strrev, convert_uudecode tekee datan taas luettavaksi
Purku gzinflate, gzuncompress, gzdecode purkaa upotetun koodin
Kokoaminen chr()-ketjut, lyhyiden osien liittäminen, \x-escapet piilottaa funktioiden nimet
Dynaaminen kutsu muuttujat funktion nimenä, call_user_func, array_map merkkijonolla kutsu ei näy missään selkotekstinä
Järjestelmäpääsy system, exec, shell_exec, passthru, proc_open, popen komennot palvelimella

PHP-käsikirjan mukaan assert() ei arvioi merkkijonoja koodina enää PHP 8.0:sta lähtien, ja create_function() poistettiin PHP 8.0:ssa. Palvelimilla, joilla on vanhempia PHP-versioita, molemmat pysyvät olennaisina hakusanoina.

Yksittäinen palikka on harvoin epäilyttävä, base64_decode-funktiota käyttävät monet sovellukset oikeutetusti. Epäilyttäväksi tulee yhdistelmä: dekoodaus, jonka tulos virtaa suoraan suoritukseen.

Vaaraton haku: harmittomat grep-komennot

Seuraavat komennot käyvät tiedostot läpi vain tekstinä. Ne eivät suorita PHP-koodia. Mukauttakaa polku.

# Suoritus yhdistettynä dekoodaukseen tai purkuun
grep -rlE "(eval|assert)\s*\(\s*(base64_decode|gzinflate|gzuncompress|str_rot13|hex2bin)" /var/www --include="*.php*"

# Hyvin pitkät rivit (usein pakattua koodia)
grep -rlE ".{2000,}" /var/www --include="*.php*"

# Paljon heksa-escapeja tai chr()-ketjuja yhdellä rivillä
grep -rlE "(\\\\x[0-9a-fA-F]{2}){20,}" /var/www --include="*.php*"
grep -rlE "(chr\s*\(\s*[0-9]+\s*\)\s*\.\s*){8,}" /var/www --include="*.php*"

# Funktiokutsu muuttujan kautta heti merkkijonoista tehdyn sijoituksen jälkeen
grep -rnE "\\\$[a-zA-Z_]+\s*=\s*['\"][a-z_]{4,}['\"]\s*;\s*\\\$[a-zA-Z_]+\s*\(" /var/www --include="*.php*" | head -50

Tarkistakaa osumat ensin komennolla ls -l ja aikaleiman kanssa ja avatkaa ne sitten vain tekstinä, esimerkiksi less-komennolla. Älkää koskaan kutsuko epäilyttäviä tiedostoja selaimen kautta, sillä silloin palvelin suorittaisi ne.

Missä hämärretty koodi tyypillisesti sijaitsee

Hämärretty koodi on harvoin omassa, silmiinpistävässä tiedostossaan. Useammin se lisätään olemassa oleviin tiedostoihin, aivan alkuun tai aivan loppuun, usein monien tyhjien rivien jälkeen, jotta se ei pistä heti silmään tiedostoa avattaessa. Suosittuja ovat tiedostot, jotka ladataan jokaisella kutsulla: keskeinen index.php, asetustiedostot ja teeman funktiotiedostot.

Erityisen huomaamaton tie kulkee konfiguraation kautta. Asetuksella auto_prepend_file PHP lataa ennen jokaista skriptiä lisätiedoston. Jos se on hyökkääjän luomassa .user.ini- tai .htaccess-tiedostossa, hänen koodinsa pyörii mukana jokaisella sivukutsulla ilman, että yhtäkään sovellustiedostoa on muutettu. Liitettävällä tiedostolla on tällöin mielellään harmiton pääte kuten .ico tai .png.

# Ladataanko lisäkoodia ennen jokaista skriptiä tai sen jälkeen?
grep -rnE "auto_(prepend|append)_file" /var/www --include=".user.ini" --include=".htaccess" --include="*.conf" 2>/dev/null

# PHP-koodia tiedostoissa, joilla on kuva- tai ikonipääte
grep -rlE "<\?php" /var/www --include="*.ico" --include="*.png" --include="*.jpg" --include="*.gif" 2>/dev/null

Oikeutetun hämärryksen erottaminen haittakoodista

Kaikki lukukelvoton koodi ei ole haitallista. Kolme tapausta esiintyy usein:

  1. Kaupalliset koodaajat: Jotkin liitännäisten ja ohjelmistojen valmistajat suojaavat koodinsa työkaluilla kuten ionCube tai SourceGuardian. Tiedostot ovat lukukelvottomia, mutta viittaavat tyypillisesti tarvittavaan loaderiin. Verratkaa niitä alkuperäiseen pakettiin.
  2. Minimoitu tai generoitu koodi: Välimuistit ja mallimoottorit tuottavat pitkiä rivejä ilman rivinvaihtoja, mutta ilman dekoodatun tekstin suoritusta.
  3. Upotettu data: Kuvat tai fontit Base64-merkkijonona PHP-tiedostossa ovat epätavallisia mutta harmittomia, kunhan tulosta ei suoriteta.

Luotettavin testi on vertailu lähteeseen: jos tiedosto on muuttumattomana valmistajan paketista, se on oikeutettu. Jos se ei ole missään alkuperäispaketissa tai poikkeaa siitä, se on tutkittava.

Tärkeää

Älkää yrittäkö purkaa hämärrettyä koodia tuotantopalvelimella, esimerkiksi korvaamalla eval tulosteella ja kutsumalla tiedostoa. Jo yksi virhe siinä suorittaa haittakoodin. Analyysi kuuluu eristettyyn ympäristöön.

Kaavahaun rajat

Hyökkääjät tuntevat yleiset hakukomennot. He pilkkovat funktioiden nimiä, kokoavat ne ajon aikana tai siirtävät varsinaisen koodin tietokantaan, kuvatiedostoihin tai asetusmerkintöihin. Kaavahaku löytää siksi paljon mutta ei kaikkea. Miksi skannerit kohtaavat täällä rajoja, selittää Verkkosivustojen haittaohjelmaskannerit: mitä ne löytävät ja mitä eivät.

Löytö on lisäksi harvoin ainoa. Hyökkääjät käyttävät usein useissa tiedostoissa samaa palikkaa, esimerkiksi silmiinpistävää muuttujan nimeä tai erottuvaa merkkijonoa koodatun lohkon alussa. Etsikää vahvistetun löydön jälkeen siksi kohdennetusti juuri tätä merkkijonoa koko verkkohakemistosta, myös muilta samalla palvelimella olevilta verkkosivustoilta. Näin löydätte sisarukset, joita mikään yleinen kaavahaku ei ole tavoittanut.

Täydentäkää haku vertailulla alkuperäistiedostoihin ja katsauksella tietokantaan, ks. Tietokannan tarkistus lisätyn koodin varalta. Ennaltaehkäisevästi tarpeettomat järjestelmäfunktiot voi estää, kuten oppaassa disable_functions oikein käytettynä kuvataan.

Miten PHP SOS auttaa konkreettisesti?

  • Haku: Käymme läpi tiedostot ja tietokannan laajennetuilla kaavoilla ja vertaamme alkuperäispaketteihin.
  • Analyysi: Tutkimme epäilyttävää koodia eristetyssä ympäristössä vaarantamatta järjestelmäänne.
  • Siivous: Haittaohjelmien poistolla poistamme kaikki osat ja suljemme sisääntulotien.
  • Suojaus: Rajaamme PHP-funktioita ja kirjoitusoikeuksia ja seuraamme uusia tai muuttuneita tiedostoja.

Usein kysytyt kysymykset

Onko eval yhdessä base64_decoden kanssa aina haittakoodia?

Ei aina, mutta hyvin usein. Oikeutettu koodi tarvitsee tätä yhdistelmää tuskin koskaan. Tiedostoissa, jotka eivät kuulu sovellukseenne tai tunnettuun liitännäiseen, se on vahva varoitusmerkki.

Saanko purkaa hämärretyn koodin luettavaksi?

Vain suorittamatta sitä ja ei tuotantopalvelimella. Jo vahingossa tapahtunut suoritus voi aiheuttaa vahinkoa. Jättäkää analyysi epäselvässä tapauksessa asiantuntijoille, jotka työskentelevät eristetyissä ympäristöissä.

Miksi haittaohjelmaskanneri ei löydä koodia?

Skannerit etsivät tunnettuja kaavoja. Hyökkääjät muuttavat koodiaan jatkuvasti, pilkkovat funktioiden nimiä tai kokoavat ne ajon aikana. Tyhjä skannaus ei siksi todista palvelimen olevan puhdas.

Entä kaupallisesti salatut liitännäiset?

Jotkin valmistajat suojaavat koodinsa koodaajilla kuten ionCube tai SourceGuardian. Tällaiset tiedostot ovat lukukelvottomia mutta oikeutettuja, jos ne ovat valmistajalta. Verratkaa niitä alkuperäiseen pakettiin.

Auttaako disable_functions hämärrettyä koodia vastaan?

Osittain. Funktiot kuten exec tai system voi estää, eval sen sijaan ei, koska se on kielen rakenne eikä funktio. Esto vaikeuttaa hyökkääjien seuraavaa askelta mutta ei estä kaikkea haittakoodia.

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