Aktuālā situācija: PHP2Shell. Divas kritiskas PHP ievainojamības (CVSS 9.2) ļauj izpildīt ļaunprātīgu kodu bez pieteikšanās. Ielāpi kopš 21.10.2026.Kas jādara tagad →

Datubāzes pārbaude, vai tajā nav ielikta koda

Kas pārbauda tikai failus, tam paslīd garām puse. Kā lasāmā režīmā un uz kopijas pārmeklēt datubāzes saturu, iestatījumus, trigerus un kontus, meklējot ielikto kodu.

Aktuāls uz 5 min lasīšanas laiksAtklāšana un forensika

Īsi sakot: Lai pārbaudītu datubāzi uz ļaunprātīgu kodu, ar lasāmiem vaicājumiem pārmeklējiet eksportu vai kopiju, meklējot ielikto kodu un skriptus, svešas adreses un apslēptu kodu saturā un iestatījumos. Pārbaudiet arī trigerus, ieplānotos notikumus, saglabātās procedūras un datubāzes lietotājus. Attīriet tikai pēc izvērtēšanas un nekad ar aklu meklēšanu un aizstāšanu, jo serializēti dati citādi sabojājas.

Daudzu attīrīšanu aklais plankums

Pēc ielaušanās lielākā daļa uzturētāju pārbauda failus. Viņi nomaina CMS kodolu, dzēš aizdomīgus PHP failus un no jauna uzstāda paplašinājumus. Pēc tam vietne izskatās tīra, un nedēļu vēlāk tā atkal pāradresē uz svešām lapām. Iemesls bieži ir datubāzē, kas attīrīšanā tika pārņemta nemainīta.

Uzbrucējiem datubāze ir pievilcīga slēptuve. Skripts logrīkā tiek piegādāts katrā lapā. Mainīts adrešu iestatījums novirza visus apmeklētājus. Papildu administratora konts atver durvis vēlākam laikam. Nekas no tā netiek pamanīts failu skenēšanā.

Pēc PHP2Shell, ievainojamībām CVE-2026-109618 un CVE-2026-109619 ar koda izpildi bez pieteikšanās, datubāze tāpēc pieder pie katras pārbaudes. Kas var izpildīt kodu serverī, tas parasti var nolasīt datubāzes piekļuves datus no konfigurācijas un tur rakstīt pēc patikas. Kā lietojumprogramma vispār sazinās ar datubāzi, izskaidro PHP un datubāzes: PDO un mysqli.

Kur datubāzē slēpjas ļaunprātīgs kods

Atrašanās vieta Tipisks saturs Ietekme
Saturs (raksti, lapas, produkti) <script> bloki, neredzamas saites, <iframe> ļaunprātīgs kods vai surogātpasts apmeklētājiem
Iestatījumi un opcijas mainīta vietnes adrese, svešie skripti logrīkos vai tēmas opcijās pāradresācijas, skripti visās lapās
Lietotāju tabulas papildu administratori pastāvīga piekļuve
Trigeri kods, kas katrā saglabāšanā maina saturu ļaunprātīgs kods atgriežas pēc attīrīšanas
Ieplānoti notikumi atkārtoti uzdevumi datubāzes serverī izmaiņas bez piekļuves caur tīmekli
Datubāzes lietotāji papildu konti ar plašām tiesībām piekļuve apejot CMS

Pēdējās trīs rindas īpaši bieži tiek palaistas garām, jo tās atrodas nevis CMS tabulās, bet pašā datubāzes serverī.

Interneta veikalos vienai atrašanās vietai jāpievērš īpaša uzmanība: iestatījumiem, caur kuriem kasē un pasūtījuma noslēgumā tiek iekļauti papildu skripti. Svešs skripts šajā vietā var nolasīt klientu ievadi, pirms tā šifrēta nonāk pie maksājumu pakalpojuma sniedzēja. Tāpēc mērķtiecīgi pārbaudiet visus laukus galvenes un kājenes kodam, izsekošanas iekļaušanai un dizaina iestatījumiem, kas darbojas kases lapās.

Padomājiet arī par citām datubāzēm tajā pašā serverī. Testa un starpposma kopijas, veci projektu stāvokļi vai citu vietņu datubāzes bieži atrodas blakus un ir sasniedzamas ar tiem pašiem piekļuves datiem. Kas atrasts dzīvajā datubāzē, tas jāpārbauda arī tur, pirms kopija vēlāk atkal tiek izmantota kā pamats.

Datubāzes pārbaude uz ļaunprātīgu kodu: saturs un iestatījumi

Strādājiet uz eksporta. Tas vienlaikus ir pierādījumu nodrošinājums un meklēšanas pamats. Eksportu var pārmeklēt kā teksta failu, neapgrūtinot darbojošos datubāzi:

# Izveidot konsekventu eksportu (piekļuves dati tiek pieprasīti)
mysqldump --single-transaction --routines --triggers --events -u BENUTZER -p DATENBANK > export.sql
sha256sum export.sql > export.sql.sha256

# Saskaitīt tipiskus paraugus eksportā
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

Pēdējais vaicājums uzskaita visus domēnus, kas datubāzē sastopami, pēc biežuma. Svešie domēni, ko neviens komandā nepazīst, ir svarīgākie kandidāti. Mērķtiecīgiem vaicājumiem pašā datubāzē der SELECT komandas. Piemērs izmanto WordPress tabulas; citu sistēmu prefikss un tabulu nosaukumi atrodami to dokumentācijā:

-- Iestatījumi ar skriptiem vai aizdomīgām funkcijām
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;

Ieraksti ar ļoti lielu saturu pelna īpašu uzmanību. Fona informāciju par WordPress specifiskajām slēptuvēm sniedz ceļvedis Slēpto piekļuvju atrašana WordPress.

Trigeri, notikumi un datubāzes konti

Trigeri un ieplānoti notikumi daudzās tīmekļa lietojumprogrammās nemaz nav paredzēti. Ja tie pastāv, kādam jāspēj izskaidrot, kāpēc. Šie vaicājumi tikai lasa no MySQL un MariaDB sistēmas tabulām:

-- Trigeri visās datubāzēs
SELECT TRIGGER_SCHEMA, TRIGGER_NAME, EVENT_OBJECT_TABLE, CREATED
FROM information_schema.TRIGGERS;

-- Ieplānoti notikumi
SELECT EVENT_SCHEMA, EVENT_NAME, STATUS, CREATED, LAST_EXECUTED
FROM information_schema.EVENTS;

-- Saglabātās procedūras un funkcijas
SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_TYPE, CREATED
FROM information_schema.ROUTINES
WHERE ROUTINE_SCHEMA NOT IN ('mysql', 'sys', 'information_schema', 'performance_schema');

-- Datubāzes lietotāji
SELECT user, host FROM mysql.user ORDER BY user;

Ja jūsu lietojumprogramma izmanto PostgreSQL vai citu datubāzu sistēmu, sistēmas tabulu un komandu nosaukumi ir citi; princips paliek tas pats. Analīzei ieteicams atsevišķs datubāzes lietotājs, kam atļauts tikai lasīt. Tā pat drukas kļūda vaicājumā neko nevar mainīt, un pārbaude neatstāj pēdas datos.

Trigeris, kas, saglabājot rakstu, pievieno kodu, izskaidro, kāpēc ļaunprātīgs kods atgriežas pēc katras attīrīšanas. Nezināmi datubāzes lietotāji pieder pie kontu pārbaudes tāpat kā administratoru konti CMS; vairāk par to sadaļā Svešu administratoru kontu atrašana CMS un serverī.

Tīra attīrīšana, nesabojājot datus

Attīrīšana ir jutīgākā daļa. Šī secība ir sevi apliecinājusi:

  1. Novērtēt atradumus: katrs trāpījums tiek klasificēts kā zināms, nekaitīgi izskaidrojams vai svešs. Izsekošanas un karšu kodi bieži ir leģitīmi.
  2. Aizvērt ieejas vārtus: PHP atjaunināt uz labotu stāvokli (8.5.12, 8.4.27, 8.3.36, 8.2.35 vai apstiprināts backport), pārstartēt visus worker procesus, atjaunināt lietojumprogrammu.
  3. Mērķtiecīgi noņemt: svešu saturu attīrīt caur lietojumprogrammu vai ar rīkiem, kas pareizi apstrādā serializētus datus. Svešus trigerus, notikumus un kontus dzēst.
  4. Nomainīt piekļuves datus: jauna datubāzes parole, ierakstīt lietojumprogrammas konfigurācijā, lietojumprogrammas lietotāja tiesības ierobežot līdz savai datubāzei.
  5. Pārbaudīt vēlreiz: meklēšanas vaicājumus atkārtot pēc dažām dienām.
Svarīgi

Neaizstājiet neko ar meklēšanu un aizstāšanu SQL eksportā. Serializēti PHP dati glabā katras rakstzīmju virknes garumu. Ja garums mainās, iestatījums kļūst nelasāms un vietne var atteikt.

Pāradresācijām, kas parādās, neraugoties uz tīru datubāzi, cēlonis ir citā slānī. Sašaurināšanā palīdz raksts Vietne pāradresē uz svešām lapām.

Kā PHP SOS palīdz konkrēti?

  • Mēs nodrošinām datubāzi ar kontrolsummu un pārmeklējam eksportu, meklējot skriptus, svešus domēnus un apslēptu kodu.
  • Mēs pārbaudām trigerus, notikumus, procedūras un datubāzes lietotājus, kas atrodas ārpus CMS.
  • Mēs attīrām atradumus ļaunprogrammatūras noņemšanas ietvaros, nebojājot serializētus datus.
  • Mēs ierobežojam lietojumprogrammas lietotāja tiesības un pēc attīrīšanas pārbaudi atkārtojam.

Biežāk uzdotie jautājumi

Vai ļaunprātīgs kods var slēpties datubāzē?

Jā. Uzbrucēji ieraksta JavaScript rakstos, produktu aprakstos vai logrīkos, maina adrešu iestatījumus pāradresācijām vai izveido administratoru kontus. MySQL un MariaDB papildus trigeri un ieplānoti notikumi var mainīt datus. Failu skenēšana neatrod neko no tā.

Kā pārmeklēt datubāzi, neko nesabojājot?

Strādājiet uz eksporta vai kopijas un izmantojiet tikai SELECT vaicājumus. Eksportu turklāt var pārmeklēt kā teksta failu ar grep. Izmaiņas veic tikai tad, kad katrs atradums ir novērtēts un ir rezerves kopija.

Kāpēc atradumus nevajadzētu labot ar meklēšanu un aizstāšanu eksportā?

Daudzi CMS iestatījumus glabā kā serializētus PHP datus, kuros kopā ar to saglabāts katras rakstzīmju virknes garums. Aizstāšana maina garumu, bet ne norādi, un iestatījums kļūst nelasāms. Attīriet caur lietojumprogrammu vai ar rīkiem, kas saprot serializētus datus.

Vai katrs skripts datubāzē ir aizdomīgs?

Nē. Izsekošanas kodi, kartes, video vai tērzēšanas logrīki arī tiek glabāti kā skripts. Izšķirošais ir, vai kāds komandā pazīst ierakstu un mērķa adresi.

Avoti

Tūlītējs kontakts

Katra stunda ir svarīga. Rakstiet mums tūlīt.

Īsi aprakstiet sistēmu, PHP versiju un novēroto. Mēs sazināsimies, noskaidrosim situāciju un strādāsim attālināti, līdz incidents ir slēgts un dokumentēts.

Tūlītēja palīdzība