Telefon zadzwonił o 9:17 rano. Klientka - właścicielka małej kliniki rehabilitacyjnej - mówiła szybko, wyraźnie zdenerwowana: „Moja strona coś robi. Wyświetlają się na niej dziwne teksty po angielsku, a Google wyrzuca ostrzeżenie, że to strona niebezpieczna. Co to w ogóle jest?"

Wszedłem na adres. Zamiast schludnej strony wizytówki kliniki - chaos. Połowa menu nie działała, stopka była wypełniona dziesiątkami linków prowadzących na podejrzane kasyna i apteki internetowe, a w tytule strony widniał tekst: „Buy cheap Viagra online - best prices". Między treściami o rehabilitacji pojawiały się losowe paragrafy ze słowami kluczowymi o lekach na receptę. Google Search Console pokazywał alert z przed trzech tygodni - klientka przez ten czas do panelu nie zaglądała.

Strona stała bez aktualizacji od ponad dwóch lat. Wtyczki przestarzałe o kilkanaście wersji, motyw nieaktualizowany od 2022 roku, WordPress w wersji 5.9. Wystarczył jeden znany exploit w popularnej wtyczce formularzy - i boty zrobiły swoje w ciągu minut.

To nie jest wyjątkowy przypadek. Opisuję go szczegółowo, bo w ciągu ostatniego roku pomogłem naprawić osiem stron z podobnym scenariuszem. Mechanizm jest zawsze ten sam - i zawsze można go było przewidzieć.

Co właściwie się stało - anatomia ataku

Zanim przejdziemy do naprawy, warto zrozumieć jak działają takie ataki - bo wiedza ta zmienia sposób myślenia o utrzymaniu strony.

WordPress napędza około 43% wszystkich stron w internecie. To gigantyczna baza potencjalnych celów. Hakerzy nie siedzą przy klawiaturze i ręcznie nie szukają ofiar - uruchamiają zautomatyzowane boty, które bez przerwy skanują sieć w poszukiwaniu znanych podatności. Gdy tylko pojawia się publiczny raport o błędzie w popularnej wtyczce (a pojawiają się regularnie), boty mają nowe „zadanie" na liście.

W przypadku kliniki winowajcą okazała się wtyczka do formularzy kontaktowych - wersja z 2022 roku zawierała lukę klasy SQL injection umożliwiającą nieautoryzowane zapisywanie plików na serwerze. Łatka wyszła w ciągu 48 godzin od publicznego ujawnienia błędu. Strona klientki miała jeszcze tę starą wersję - i przez prawie dwa lata była otwarta na atak, który w końcu nastąpił.

Po udanym wejściu atakujący zainstalował tzw. backdoor - ukryty skrypt PHP, który pozwala na zdalne zarządzanie stroną nawet po usunięciu pierwotnej luki. Następnie wstrzyknął spam SEO (ang. SEO spam injection): ukryte linki i treści, niewidoczne dla zwykłego użytkownika, ale indeksowane przez Google. Cel? Przekazanie „mocy" strony kliniki na wskazane domeny - apteki, kasyna, strony z lekami.

Dlaczego właśnie SEO spam? Strona kliniki działała kilka lat, miała pewną historię i autorytet w Google. Atakujący wykorzystują ten autorytet jak „pożyczkę" - i ta pożyczka kosztuje właściciela strony utratę pozycji w wyszukiwarce, flagowanie przez Google i potencjalne kary algorytmiczne trwające miesiącami.

Diagnoza: co dokładnie było uszkodzone

Pierwszym krokiem była pełna diagnoza. Korzystam przy tym ze sprawdzonego zestawu narzędzi:

  1. Skan wtyczką Wordfence - identyfikacja zainfekowanych plików PHP, nieznanych plików w katalogach wtyczek i motywów, zmian w plikach rdzenia WordPress.
  2. Przegląd bazy danych - wyszukanie wstrzykniętych skryptów i linków w tabelach wp_posts, wp_options i wp_usermeta.
  3. Sprawdzenie Google Search Console - raport bezpieczeństwa pokazuje dokładnie które URL-e zostały oznaczone jako złośliwe i od kiedy.
  4. Analiza pliku .htaccess - atakujący często modyfikują go, żeby przekierowywać ruch mobilny lub ruch z wyszukiwarek na swoje strony.
  5. Lista użytkowników administracyjnych - sprawdzenie czy nie zostały dodane nieznane konta z rolą administratora.

W tym konkretnym przypadku znalazłem: 34 zainfekowane pliki PHP (w tym cztery ukryte backdoory w katalogu uploads/), 3 nieznane konta administratorów, ponad 2 000 wstrzykniętych wierszy w bazie danych z linkami i treściami SEO spam, zmodyfikowany plik .htaccess z regułami przekierowującymi użytkowników z urządzeń mobilnych, oraz kompletnie przestarzały stos: WordPress 5.9, PHP 7.4 (wspierany tylko przez 6 miesięcy po wydaniu PHP 8.1).

Ważne: Sam skan wtyczką to za mało. Wordfence i podobne narzędzia dobrze wykrywają znane sygnatury złośliwego kodu, ale zaawansowane backdoory mogą być skonstruowane tak, żeby wyglądały jak legalne funkcje PHP. Pełna diagnoza wymaga ręcznego przeglądu podejrzanych plików.

Skutki ataku - co traciła klientka każdego dnia

Warto to powiedzieć wprost, bo wiele osób bagatelizuje wycięty spam z „brzydkimi linkami": skutki trwają długo po samej naprawie.

Naprawa strony WordPress - krok po kroku

Po diagnozie przyszedł czas na działanie. Oto dokładnie co zrobiłem:

  1. Backup stanu przed naprawą - zawsze, nawet zainfekowaną stronę. Backup pozwala wrócić do konkretnego stanu jeśli coś pójdzie nie tak podczas naprawy, a dla kwestii prawnych dokumentuje zakres infekcji.
  2. Zmiana wszystkich haseł i usunięcie nieznanych kont - hasło do wp-admin, FTP, bazy danych, panelu hostingu i e-maila powiązanego ze stroną. Trzy konta administratorów zostały usunięte.
  3. Izolacja strony - tymczasowe ustawienie trybu maintenance i blokada zewnętrzna na poziomie .htaccess, żeby boty nie mogły dalej używać backdoorów w trakcie naprawy.
  4. Czyszczenie zainfekowanych plików - ręczne usunięcie lub zastąpienie czystymi wersjami 34 zainfekowanych plików. Pliki rdzenia WordPress zastąpione świeżą kopią z oficjalnego repozytorium.
  5. Czyszczenie bazy danych - usunięcie ponad 2 000 wierszy spamu. Sprawdzenie tabeli wp_options pod kątem nieznanych opcji z zewnętrznymi URL-ami.
  6. Przywrócenie poprawnego .htaccess - zastąpienie zmodyfikowanego pliku czystą wersją wygenerowaną przez WordPress, a następnie dodanie reguł wzmacniających bezpieczeństwo.
  7. Aktualizacja wszystkiego - WordPress do aktualnej wersji, wszystkie wtyczki, motyw. Usunięcie 4 wtyczek, które nie były aktualizowane od ponad roku i których autorzy porzucili projekt.
  8. Wdrożenie zabezpieczeń - instalacja i konfiguracja Wordfence z firewallem, blokadą prób logowania, powiadomieniami e-mail o nieudanych logowaniach.
  9. Aktualizacja PHP - migracja z PHP 7.4 na 8.2 na poziomie hostingu.
  10. Zgłoszenie recenzji do Google Search Console - po wyczyszczeniu strony złożenie wniosku o usunięcie alertu bezpieczeństwa. Google usuwa flagę zazwyczaj w ciągu 1-7 dni od recenzji.

Łączny czas pracy: 11 godzin. Strona wróciła do działania po 18 godzinach od pierwszego telefonu. Alert Google zniknął po 4 dniach.

Trzy opcje dla właściciela strony WordPress - co wybrać

Gdy strona jest już wyczyszczona i działa, pojawia się pytanie strategiczne: co dalej, żeby to się nie powtórzyło? Są trzy drogi.

Opcja A
Serwisowanie samodzielnie (DIY)

Regularnie sam aktualizujesz WordPress, wtyczki i motyw. Monitorujesz Google Search Console. Wykonujesz backupy.

  • Bezpłatne poza czasem
  • Pełna kontrola
  • Wymaga regularności - minimum raz na 2 tygodnie
  • Brak monitoringu 24/7
  • Ryzyko przeoczenia krytycznej luki
  • Co robisz gdy aktualizacja psuje stronę?
Opcja B
Opieka serwisowa u specjalisty

Zlecasz miesięczną opiekę - specjalista aktualizuje, monitoruje, reaguje na problemy i raz w miesiącu wysyła raport.

  • Spokój ducha - problem z głowy
  • Szybka reakcja przy incydencie
  • Backup i monitoring w pakiecie
  • Regularne raporty
  • Koszt: 150-400 zł/miesiąc
  • Zależność od jednej osoby
Opcja C
Migracja na stronę statyczną

Strona wizytówkowa zamieniana na statyczny HTML. Żadnego CMS, żadnych wtyczek, żadnych aktualizacji do pilnowania.

  • Zero podatności na włamania do CMS
  • Szybsza strona - brak PHP i bazy danych
  • Niższe koszty hostingu
  • Brak miesięcznych kosztów serwisowania
  • Brak panelu edycji treści
  • Koszt jednorazowej migracji
  • Edycja wymaga technicznej wiedzy

W przypadku kliniki rehabilitacyjnej wybraliśmy opcję B - opiekę serwisową. Strona ma formularz rezerwacji online, który wymaga PHP i jest regularnie modyfikowana przez właścicielkę. Całkowita migracja na static byłaby zbyt dużą zmianą w sposobie pracy.

Dla klientów, którzy mają stronę-wizytówkę z treściami rzadko zmienianymi - firmowy profil, landing page usługi, portfolio - opcja C jest coraz częściej moją pierwszą rekomendacją. Strona, którą czytasz właśnie teraz, to czysty statyczny HTML - bez CMS, bez wtyczek, bez ryzyka włamania do panelu administracyjnego.

Porównanie: WordPress vs strona statyczna pod kątem bezpieczeństwa

Aspekt WordPress Strona statyczna
Podatność na włamania CMS Tak - wymaga aktualizacji Nie dotyczy
Wymagane aktualizacje Co 1-2 tygodnie Brak
Panel edycji treści Tak Nie (wymagana edycja pliku)
Prędkość ładowania Zależy od wtyczek i hostingu Bardzo szybka
Koszt hostingu 60-200 zł/rok (z PHP i MySQL) Nawet bezpłatny (GitHub Pages, Netlify)
Koszt utrzymania 150-400 zł/miesiąc (opieka) lub własny czas Minimalny
Sklep internetowy Tak (WooCommerce) Ograniczony (Stripe, zewnętrzny koszyk)
Blog z CMS Tak Nie bez SSG (Jekyll, Hugo, Eleventy)

Jak działające serwisowanie WordPress powinno wyglądać

Jeśli zostajesz przy WordPressie - niezależnie czy robisz to sam, czy zlecasz - oto minimum, które musi być zrobione regularnie. To nie jest lista „fajnych rzeczy do zrobienia". To lista rzeczy, których brak skończył się atakiem u klientki.

Pułapka aktualizacji: Aktualizacja wtyczki może zepsuć stronę - szczególnie gdy nowa wersja zmienia sposób działania lub jest niekompatybilna z motywem. Dlatego aktualizacje powinny być wykonywane zawsze po wykonaniu backupu i na staging (środowisko testowe), a nie bezpośrednio na produkcji.

Kiedy nie warto naprawiać - i lepiej zacząć od zera

Są sytuacje, w których naprawa zainfekowanej strony jest droższa i mniej bezpieczna niż reinstalacja od zera. Oto kiedy rekomendowałem klientom nową instalację zamiast czyszczenia:

W takim przypadku najlepszym podejściem jest: wyeksportowanie samej treści (posty, strony, dane kontaktowe) z bazy danych do czystego pliku XML, a następnie zaimportowanie jej na świeżej instalacji WordPress na nowym lub wyresetowanym hostingu. Motyw i wtyczki instalujemy od zera z oficjalnych repozytoriów.

Dobra wiadomość: Nawet jeśli strona jest rozległa, sama treść - artykuły, opisy usług, galerie - jest stosunkowo prosta do przeniesienia. Problemem jest kod, nie treść. Eksport i import postów przez WordPress XML to operacja na kilka minut.

Koszt naprawy vs koszt serwisowania - prosta matematyka

Klientka zapłaciła za naprawę 1 800 zł. Do tego doliczyć trzeba utratę ruchu organicznego przez kilka tygodni - jej strona w trakcie ataku nie przynosiła nowych pacjentów z Google. Szacunkowo przez 4 tygodnie obecności alertu straciła 8-12 zapytań online, które przy jej cennikach to 2 400-3 600 zł utraconych przychodów.

Całkowity koszt incydentu (naprawa + utracone przychody): 4 200-5 400 zł.

Koszt rocznej opieki serwisowej, która by temu zapobiegła: 2 400 zł (200 zł/miesiąc).

Serwisowanie WordPress to nie koszt - to ubezpieczenie. I jak większość ubezpieczeń, żałujesz że go nie miałeś dopiero gdy coś się stanie.

Co powinieneś zrobić teraz

Jeśli masz stronę WordPress i nie wiesz kiedy ostatnio była aktualizowana - sprawdź to dzisiaj. Zaloguj się do wp-admin i zerknij na listę wtyczek. Jeśli przy którejkolwiek widzisz komunikat „dostępna aktualizacja" i data ostatniej aktualizacji jest starsza niż miesiąc - jesteś w grupie ryzyka.

Trzy kroki do zrobienia teraz:

  1. Sprawdź Google Search Console - zakładka Bezpieczeństwo i ręczne działania. Brak alertów to dobra wiadomość. Jeśli ich tam nie ma, sprawdź kiedy ostatnio się logowałeś - brak alertów które widzisz to nie to samo co brak alertów które zostały wysłane.
  2. Zrób backup teraz - nawet UpdraftPlus w wersji bezpłatnej to coś. Backup na ten sam hosting gdzie strona to minimum; lepiej od razu skonfigurować eksport do Google Drive lub Dropbox.
  3. Zaktualizuj wszystko - WordPress, wtyczki, motyw. Zrób to na backupie, nie na żywej stronie. Jeśli nie wiesz jak - to dobry moment żeby zastanowić się nad opcją B.
Bezpłatna konsultacja: Jeśli nie jesteś pewien kondycji swojej strony WordPress lub chcesz omówić opcje - umów 30-minutową rozmowę. Nie sprzedaję usług na siłę. Jeśli Twoja strona jest w dobrej kondycji - powiem Ci to wprost.

Podsumowanie - WordPress wymaga opieki

WordPress to doskonałe narzędzie - elastyczne, popularne i z ogromnym ekosystemem wtyczek. Ale ta popularność ma cenę: jest najczęściej atakowanym CMS-em na świecie. Nie ma czegoś takiego jak „zainstalowałem i zapomniałem" w przypadku WordPressa.

Masz trzy drogi: pilnować aktualizacji samemu, zlecić to specjaliście, albo rozważyć migrację na prostszą platformę jeśli Twoje potrzeby są skromne. Każda z nich jest lepsza niż brak działania.

Klientka z początku tego artykułu dziś ma aktualnego WordPressa, codzienne backupy i miesięczny raport z opieki serwisowej. Jej strona ładuje się szybciej, Google Search Console jest czyste, a ona sama może skupić się na rehabilitacji pacjentów zamiast zastanawiać się co wyświetla jej witryna.

Taki powinien być stan domyślny - nie wyjątek.


Często zadawane pytania

Jak sprawdzić czy WordPress jest zawirusowany?
Pierwsze sygnały to alert w Google Search Console, komunikat bezpieczeństwa w wynikach Google, nieznane treści lub linki na stronie, zawieszone konto hostingowe. Możesz też uruchomić wtyczkę Wordfence lub Sucuri Security - skanują pliki i bazę danych w poszukiwaniu złośliwego kodu. Sprawdź też listę użytkowników administratorów - nieznane konta to pewny sygnał włamania.
Ile kosztuje naprawa zawirusowanej strony WordPress?
Koszt zależy od skali infekcji. Prosta naprawa małej strony: 400-800 zł. Głęboka infekcja z audytem i wdrożeniem zabezpieczeń: 1 000-2 500 zł. Pełna reinstalacja z migracją treści: od 2 000 zł. Dla porównania: roczna opieka serwisowa kosztuje 150-400 zł miesięcznie i zapobiega takim sytuacjom.
Czy WordPress wymaga regularnych aktualizacji?
Tak - rdzeń, wtyczki i motyw powinny być aktualizowane co 1-2 tygodnie. Ponad 97% ataków na WordPressa wykorzystuje znane podatności w przestarzałych komponentach, które mają już dostępną łatkę. Aktualizacja trwa minuty, a atak może nastąpić w dowolnym momencie po publikacji informacji o luce.
Jak długo trwa naprawa zawirusowanego WordPressa?
Prosta infekcja: 4-8 godzin. Rozległa infekcja z zanieczyszczoną bazą danych: 1-3 dni robocze. Pełna reinstalacja z migracją treści: dodatkowe 1-2 dni. Alert bezpieczeństwa Google znika zazwyczaj 1-7 dni po zgłoszeniu recenzji do Search Console.
Kiedy warto rozważyć migrację z WordPressa na stronę statyczną?
Kiedy strona to głównie wizytówka bez częstej edycji treści, wolisz nie martwić się aktualizacjami, zależy Ci na maksymalnej prędkości i bezpieczeństwie, lub masz ograniczony budżet na utrzymanie. Strony statyczne nie mają bazy danych ani PHP - nie ma co zaatakować w tradycyjnym sensie.
Co to jest serwisowanie WordPress i co obejmuje?
Serwisowanie WordPress to regularna opieka techniczna: aktualizacje rdzenia, wtyczek i motywu, codzienne backupy poza serwerem, monitoring dostępności, skanowanie złośliwego kodu, przegląd logów, optymalizacja bazy danych i monitorowanie Google Search Console. Dobra opieka zawiera też alert e-mailowy gdy strona przestaje działać.