Na kratko: Za preverjanje zbirke podatkov za škodljivo kodo izvoz ali kopijo z bralnimi poizvedbami preiščite za vnesene skripte, tuje naslove in zakrito kodo v vsebinah in nastavitvah. Preverite tudi prožilce, načrtovane dogodke, shranjene procedure in uporabnike zbirke podatkov. Čistite šele po oceni in nikoli s slepim iskanjem in zamenjavo, ker se sicer serializirani podatki pokvarijo.
Slepa pega številnih čiščenj
Po vdoru večina upravljavcev preveri datoteke. Zamenjajo jedro CMS, izbrišejo sumljive datoteke PHP in znova namestijo razširitve. Spletna stran je potem videti čista, teden pozneje pa spet preusmerja na tuje strani. Vzrok je pogosto v zbirki podatkov, ki je bila pri čiščenju prevzeta nespremenjena.
Za napadalce je zbirka podatkov privlačno skrivališče. Skript v gradniku se dostavlja na vsaki strani. Spremenjena nastavitev naslova preusmeri vse obiskovalce. Dodatni skrbniški račun odpre vrata za pozneje. Nič od tega ne izstopa pri skeniranju datotek.
Po PHP2Shell, ranljivostih CVE-2026-109618 in CVE-2026-109619 z izvajanjem kode brez prijave, zato zbirka podatkov sodi v vsako preverjanje. Kdor lahko na strežniku izvaja kodo, praviloma lahko iz konfiguracije prebere dostopne podatke zbirke podatkov in tam poljubno piše. Kako aplikacija sploh komunicira z zbirko podatkov, pojasnjuje PHP in zbirke podatkov: PDO in mysqli.
Kje se skriva škodljiva koda v zbirki podatkov
| Mesto najdbe | Tipična vsebina | Učinek |
|---|---|---|
| Vsebine (prispevki, strani, izdelki) | bloki <script>, nevidne povezave, <iframe> |
škodljiva koda ali spam za obiskovalce |
| Nastavitve in možnosti | spremenjen naslov spletne strani, tuji skripti v gradnikih ali možnostih teme | preusmeritve, skripti na vseh straneh |
| Uporabniške tabele | dodatni skrbniki | trajni dostop |
| Prožilci | koda, ki ob vsakem shranjevanju spremeni vsebine | škodljiva koda se po čiščenju vrne |
| Načrtovani dogodki | ponavljajoča se opravila v strežniku zbirke podatkov | spremembe brez spletnega dostopa |
| Uporabniki zbirke podatkov | dodatni računi z obsežnimi pravicami | dostop mimo CMS |
Zadnje tri vrstice se še posebej pogosto spregledajo, ker ne ležijo v tabelah CMS, ampak v samem strežniku zbirke podatkov.
Pri spletnih trgovinah si eno mesto najdbe zasluži posebno pozornost: nastavitve, prek katerih se v blagajno in zaključek naročila vključujejo dodatni skripti. Tuj skript na tem mestu lahko bere vnose strank, preden se šifrirani pošljejo plačilni storitvi. Zato ciljno preverite vsa polja za kodo v glavi in nogi, vključitve sledenja in nastavitve videza, ki delujejo na straneh blagajne.
Pomislite tudi na druge zbirke podatkov na istem strežniku. Testne in vmesne kopije, stara stanja projektov ali zbirke podatkov drugih spletnih strani pogosto ležijo zraven in so dosegljive z istimi dostopnimi podatki. Kar je najdeno v živi zbirki podatkov, je treba preveriti tudi tam, preden kopija pozneje znova služi kot podlaga.
Preverjanje zbirke podatkov za škodljivo kodo: vsebine in nastavitve
Delajte na izvozu. Hkrati je zavarovanje dokazov in podlaga za iskanje. Izvoz je mogoče preiskati kot besedilno datoteko, ne da bi obremenili delujočo zbirko podatkov:
# Ustvarite dosleden izvoz (dostopni podatki se vprašajo)
mysqldump --single-transaction --routines --triggers --events -u BENUTZER -p DATENBANK > export.sql
sha256sum export.sql > export.sql.sha256
# Preštejte tipične vzorce v izvozu
grep -oiE '<script[^>]{0,80}' export.sql | sort | uniq -c | sort -rn | head -30
grep -oiE '(eval\(|base64_decode|fromCharCode|document\.write|atob\()' export.sql | sort | uniq -c
grep -oiE 'https?://[a-z0-9.-]+' export.sql | sort | uniq -c | sort -rn | head -50
Zadnja poizvedba po pogostosti našteje vse domene, ki se pojavijo v zbirki podatkov. Tuje domene, ki jih nihče v ekipi ne pozna, so najpomembnejši kandidati. Za ciljne poizvedbe v sami zbirki podatkov so primerni ukazi SELECT. Primer uporablja tabele WordPress; predpono in imena tabel drugih sistemov najdete v njihovi dokumentaciji:
-- Nastavitve s skripti ali sumljivimi funkcijami
SELECT option_name, LENGTH(option_value) AS laenge
FROM wp_options
WHERE option_value LIKE '%<script%'
OR option_value LIKE '%eval(%'
OR option_value LIKE '%base64_decode%'
ORDER BY laenge DESC;
Vnosi z zelo veliko vsebino si zaslužijo posebno pozornost. Ozadje o skrivališčih, značilnih za WordPress, ponuja vodnik Iskanje stranskih vrat v WordPressu.
Prožilci, dogodki in računi zbirke podatkov
Prožilci in načrtovani dogodki v številnih spletnih aplikacijah sploh niso predvideni. Če obstajajo, naj bi nekdo znal pojasniti, zakaj. Te poizvedbe berejo samo iz sistemskih tabel MySQL in MariaDB:
-- Prožilci v vseh zbirkah podatkov
SELECT TRIGGER_SCHEMA, TRIGGER_NAME, EVENT_OBJECT_TABLE, CREATED
FROM information_schema.TRIGGERS;
-- Načrtovani dogodki
SELECT EVENT_SCHEMA, EVENT_NAME, STATUS, CREATED, LAST_EXECUTED
FROM information_schema.EVENTS;
-- Shranjene procedure in funkcije
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, CREATED
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');
-- Uporabniki zbirke podatkov
SELECT user, host FROM mysql.user ORDER BY user;
Če vaša aplikacija uporablja PostgreSQL ali drug sistem zbirk podatkov, se sistemske tabele in ukazi imenujejo drugače; načelo ostaja enako. Za analizo je priporočljiv lasten uporabnik zbirke podatkov, ki sme samo brati. Tako tudi tipkarska napaka v poizvedbi ne more ničesar spremeniti, preverjanje pa v podatkih ne pušča sledi.
Prožilec, ki ob shranjevanju prispevka doda kodo, pojasni, zakaj se škodljiva koda po vsakem čiščenju vrne. Neznani uporabniki zbirke podatkov sodijo v preverjanje računov prav tako kot skrbniški računi v CMS; več o tem pod Iskanje tujih skrbniških računov v CMS in na strežniku.
Čisto očistiti, ne da bi uničili podatke
Čiščenje je najbolj občutljiv del. Ta vrstni red se je obnesel:
- Ocenite najdbe: vsak zadetek se uvrsti kot znan, nenevarno pojasnljiv ali tuj. Kode za sledenje in zemljevide so pogosto legitimne.
- Zaprite vstopno točko: PHP posodobite na popravljeno stanje (8.5.12, 8.4.27, 8.3.36, 8.2.35 ali potrjen backport), znova zaženite vse delavce, posodobite aplikacijo.
- Ciljno odstranite: tuje vsebine očistite prek aplikacije ali z orodji, ki serializirane podatke obravnavajo pravilno. Tuje prožilce, dogodke in račune izbrišite.
- Zamenjajte dostopne podatke: novo geslo zbirke podatkov vnesite v konfiguracijo aplikacije, pravice uporabnika aplikacije omejite na lastno zbirko podatkov.
- Ponovno preverite: iskalne poizvedbe ponovite čez nekaj dni.
Ničesar ne zamenjujte z iskanjem in zamenjavo v izvozu SQL. Serializirani podatki PHP skupaj shranjujejo dolžino vsakega niza. Če se dolžina spremeni, nastavitev postane neberljiva in spletna stran lahko odpove.
Preusmeritve, ki se pojavljajo kljub čisti zbirki podatkov, imajo vzrok v drugi plasti. Prispevek Spletna stran preusmerja na tuje strani pomaga pri zožitvi.
Kako PHP SOS pomaga konkretno?
- Zbirko podatkov zavarujemo s kontrolno vsoto in izvoz preiščemo za skripte, tuje domene in zakrito kodo.
- Preverimo prožilce, dogodke, procedure in uporabnike zbirke podatkov, ki ležijo zunaj CMS.
- Najdbe očistimo v okviru odstranjevanja zlonamerne kode, ne da bi poškodovali serializirane podatke.
- Omejimo pravice uporabnika aplikacije in po čiščenju preverjanje ponovimo.
Pogosta vprašanja
Ali se lahko škodljiva koda skriva v zbirki podatkov?
Da. Napadalci zapišejo JavaScript v prispevke, opise izdelkov ali gradnike, spremenijo nastavitve naslovov za preusmeritve ali ustvarijo skrbniške račune. V MySQL in MariaDB lahko podatke dodatno spreminjajo prožilci in načrtovani dogodki. Skeniranje datotek ničesar od tega ne najde.
Kako preiščem zbirko podatkov, ne da bi karkoli pokvaril?
Delajte na izvozu ali kopiji in uporabljajte samo poizvedbe SELECT. Izvoz je poleg tega mogoče kot besedilno datoteko preiskati z grep. Spremembe izvedete šele, ko je vsaka najdba ocenjena in je na voljo varnostna kopija.
Zakaj najdb ne bi smel čistiti z iskanjem in zamenjavo v izvozu?
Številni CMS shranjujejo nastavitve kot serializirane podatke PHP, pri katerih je skupaj shranjena dolžina vsakega niza. Zamenjava spremeni dolžino, ne pa tudi navedbe, nastavitev pa postane neberljiva. Čistite prek aplikacije ali z orodji, ki serializirane podatke razumejo.
Ali je vsak skript v zbirki podatkov sumljiv?
Ne. Kode za sledenje, zemljevidi, videoposnetki ali gradniki za klepet se prav tako shranjujejo kot skript. Odločilno je, ali kdo v ekipi pozna vnos in ciljni naslov.