Studija slučaja · Sigurnost web trgovine

Došli smo zbog SEO-a, a pronašli skriptu koja je krala podatke o karticama

Hrvatska WooCommerce trgovina, s redovnim održavanjem i antivirusom na hostingu. Napadači su na njoj imali vlastiti administratorski račun više od godinu i pol, a kupcima na blagajni podmetali su lažni obrazac za unos kartice. Vlasnik nije primijetio ništa jer su narudžbe normalno prolazile. Ovo je zapis o tome što smo pronašli, kako smo to očistili u jednom danu i što svaki vlasnik web trgovine može provjeriti već danas.

19 mjeseci
koliko je skriveni administrator postojao na web stranici

30+
podmetnutih datoteka iz najmanje desetak valova napada

0
upozorenja koja je vlasnik dobio od antivirusa na hostingu

Kako smo uopće naletjeli na napad

Klijent nam je došao zbog SEO-a. Uređivali smo kategoriju proizvoda i primijetili da sortiranje po cijeni ili popularnosti završava praznom stranicom. Uzrok je bio bezazlen: stari kod u temi pozivao je funkciju SEO dodatka koji više nije bio instaliran. Ali u istoj datoteci, ispod tog koda, stajalo je nešto što tamo nije smjelo biti. Kod koji skriva jednog administratora iz popisa korisnika.

Od tog trenutka to više nije bio SEO projekt.

Što smo zatekli

Napad nije bio jedna datoteka, nego pet slojeva. Svaki je imao svoju svrhu, a svaki je bio sakriven tako da ga vlasnik u administraciji ne vidi.

1. Skripta za krađu podataka o karticama. U postavkama teme, u polju za prilagođeni JavaScript koje se učitava na svakoj stranici, stajala su tri retka koda. Ona su s vanjskog poslužitelja učitavala datoteku nazvanu metrics.js, kako bi izgledala kao obična analitika. Datoteku smo preuzeli kao tekst, bez pokretanja, i dekodirali je. Na blagajni je umjesto Stripeovog obrasca podmetala lažni obrazac na hrvatskom jeziku (Broj kartice, Datum isteka, Sigurnosni kod), uzimala podatke i e-poštu kupca i slala ih napadaču na četiri različita načina, za slučaj da je neki blokiran. Zatim je vraćala pravi obrazac. Kupac je platio, narudžba je prošla i nitko nije posumnjao.

2. Lažni sigurnosni dodatak. Među dodacima je bio jedan koji se predstavljao kao Wordfence Login Security. Izgledao je kao dvofaktorska prijava, a zapravo je bio stražnji ulaz: unaprijed pripremljen kod prijavljivao je napadača kao administratora bez lozinke. U njegovoj tablici u bazi bilo je 23 koda. Najnoviji je nastao u svibnju 2026., četiri mjeseca nakon instalacije. Napadač je, dakle, redovito dolazio.

3. Skriveni administrator. Kod u podređenoj temi skrivao je jednog administratora iz popisa korisnika, umanjivao brojač administratora za jedan i skrivao njegove objave. Administracija je pokazivala šest administratora, a u bazi ih je bilo sedam. Račun je stvoren u ožujku 2025.

4. Nevidljive spam poveznice. Isti je kod svake minute s poslužitelja napadača preuzimao poveznice i ispisivao ih u podnožje svake stranice, u blok veličine 0 × 0 piksela. Posjetitelji ih nisu vidjeli, Google jest. Za web trgovinu koja ulaže u SEO to je ozbiljan rizik od ručne kazne.

5. Podmetnute datoteke. Usporedbom sa službenim popisom datoteka WordPressa pronašli smo 17 datoteka u jezgri koje tamo ne pripadaju, s imenima poput class-wp-widget-cache.php i rest-processor.php. Uz njih su bile PHP datoteke u mapi uploads, lažni dodaci, mape lažnih tema i datoteke podmetnute u temu WoodMart. Datumi su otkrili kronologiju: prvi trag u studenom 2025., zatim valovi napada u siječnju, veljači i ožujku 2026. te posljednji u srpnju.

Zašto vlasnik ništa nije primijetio

Ovo je najvažniji dio priče, jer se odnosi na gotovo svaku web trgovinu.

Kako smo čistili

Prvo smo napravili potpunu sigurnosnu kopiju u zatečenom stanju. Ona je dokaz i čuva se izvan poslužitelja, ali se za vraćanje web stranice nikad ne smije koristiti. Zatim smo redom:

Klijent je dobio izvješće sa snimkama svakog nalaza, vremenskim slijedom i popisom onoga što je moglo biti izloženo.

Što je bilo izloženo, a što nije

Ugrožena su bila plaćanja karticom kroz Stripeov obrazac. Apple Pay i Google Pay nisu, jer se plaćanje odvija u sučelju Applea i Googlea, a pouzećem se kartica ni ne unosi. Tajni ključ Stripe računa nije bio na poslužitelju jer je trgovina spojena preko Stripe Connecta.

Kod krađe podataka o karticama vlasnik ima obvezu iz čl. 33. Opće uredbe o zaštiti podataka: povredu treba prijaviti AZOP-u u roku od 72 sata od trenutka kad je za nju saznao. Više o obvezama koje vlasnici često zanemare pisali smo u članku GDPR za vlasnike web stranica.

Kako su ušli

To ne znamo sa sigurnošću. Hosting je zapise pristupa čuvao samo za posljednja dva mjeseca, a prvi upadi bili su mnogo ranije. Najvjerojatniji kandidat je dodatak za upravljanje datotekama koji je bio instaliran i koji ima poznate propuste za učitavanje datoteka. Iz zapisa koje smo imali vidi se da je napadač znao lozinku skrivenog administratora i da je u rujnu i listopadu stranici za prijavu pristupao s gotovo dvjesto različitih IP adresa.

Isti dodatak vidjeli smo i na drugim zaraženim web stranicama. Ako ga imate, a ne trebate ga svakodnevno, obrišite ga.

Šest provjera koje možete napraviti danas

Što smo iz ovoga napravili

Nakon ovog slučaja sve tragove koje smo ručno tražili pretvorili smo u automatske provjere u našem pluginu GDPR evidencija za WordPress. Plugin svaki dan provjerava učitava li se na web stranici skripta koja krade podatke o karticama, je li netko sakrio administratora, podmetnuo datoteke ili ubacio lažni dodatak. Kad nešto pronađe, javlja vam mailom, a povreda se otvara jednim klikom s rokom od 72 sata za prijavu AZOP-u.

Nije antivirus i ne zamjenjuje Wordfence ni zaštitu na hostingu. Ali gleda upravo ona mjesta koja su u ovom slučaju svi drugi alati propustili.

Ako vas zanima što sve spada u redovno održavanje, a što nije, pročitajte što spada u održavanje web stranice, ili pregledajte ostale studije slučaja.

Sumnjate da nešto nije u redu s vašom web trgovinom?

Javite nam se. Pregledat ćemo web stranicu i reći vam što smo pronašli, bez uljepšavanja.

Javite nam se

Besplatna analiza Pošalji poruku
Facebook
Twitter
Linkedin
Pinterest