Dostajesz telefon od klienta: „Wchodzę na swoją stronę i Chrome pokazuje wielki czerwony ekran z ostrzeżeniem”. Albo sam odkrywasz, że Twoja firmowa strona przekierowuje na rosyjski sklep z lekami. To jeden z gorszych momentów dla właściciela strony, ale mam dobrą wiadomość - w większości przypadków da się z tego wyjść bez utraty danych i pozycji.

Przerabiałem to wielokrotnie u klientów. Raz strona z Poznania zainfekowana przez zepsutą wtyczkę formularza kontaktowego, raz sklep e-commerce na WooCommerce z backdoorem wgranym przez skradziony dostęp FTP. Schemat działania jest zawsze podobny, różni się tylko skala zniszczeń. Poniżej opisuję go dokładnie.

Krok 1: Izolacja - pierwsze 15 minut

Zanim zaczniesz cokolwiek czyścić, musisz zatrzymać szkody. Złośliwy kod na Twojej stronie aktywnie działa: wysyła spam z Twojego serwera, atakuje odwiedzających, podkrada dane klientów albo infekuje kolejne pliki.

Pierwsze działania:

1. Włącz tryb maintenance - najprostszy sposób to wtyczka LightStart (dawniej Coming Soon Page) albo plik .maintenance w katalogu głównym WordPress.
2. Jeśli masz dostęp do panelu hostingu - zawieska konto lub zablokuj ruch HTTP tymczasowo.
3. Zmień hasło do panelu hostingu i FTP od razu, jeszcze zanim zaczniesz czyszczenie.
4. Powiadom hosting - część polskich hostingów (np. LH.pl, home.pl) ma specjalne procedury dla zainfekowanych stron i może pomóc w izolacji.

Nie usuwaj jeszcze żadnych plików. Zainfekowane pliki są Ci potrzebne do analizy i jako dowód stanu. Najpierw backup.

Krok 2: Backup - nawet zainfekowanej strony

Wiem, brzmi paradoksalnie - po co backupować coś, co jest zawirusowane? Bo:

  • Masz dokumentację ataku (przydatna przy zgłoszeniu do hostingu lub policji).
  • Masz punkt odniesienia do porównania plików po czyszczeniu.
  • Jeśli czegoś nie wyczyścisz dobrze, możesz przeszukać archiwum i znaleźć, co przeoczyłeś.

Zrób pełny backup przez FTP (pobierz cały katalog strony) plus eksport bazy danych przez phpMyAdmin lub komendą mysqldump. Zapisz to lokalnie na swoim komputerze, nie na tym samym serwerze.

50%ataków WordPress wynika ze znanych luk w przestarzałych wtyczkach
1-3 dniczas reakcji Google na prośbę o weryfikację po czyszczeniu
200-1200 PLNtypowy koszt profesjonalnego odwirusowania strony w Polsce
72 godz.maksymalny czas na zgłoszenie naruszenia danych do UODO wg RODO

Krok 3: Diagnoza - co dokładnie zaatakowało Twoją stronę

Zanim wyczyścisz, musisz wiedzieć, z czym masz do czynienia. Różne typy infekcji wymagają różnych działań.

Skany online (bez instalacji wtyczki):

  • Sucuri SiteCheck (sitecheck.sucuri.net) - szybki skan zewnętrzny, sprawdza blacklisty i oczywiste infekcje.
  • VirusTotal - wklej URL strony.
  • Google Safe Browsing: transparencyreport.google.com/safe-browsing/search.

Wtyczki skanujące (instalowane na serwerze):

  • Wordfence Security - darmowy, skanuje pliki rdzenia, wtyczki, motywy i porównuje je z repozytorium wordpress.org.
  • MalCare - skanuje na własnych serwerach, nie obciąża Twojego hostingu.

Najczęstsze typy ataków, na które trafiam u klientów:

  • Backdoor - plik PHP dający atakującemu stały dostęp (ukryty często w katalogu uploads, który rzadko kto przeszukuje).
  • SEO spam injection - złośliwy kod wstrzykuje spamerskie linki do farmaceutyków lub kasyn widoczne tylko dla robotów Google.
  • Redirect hack - strona przekierowuje mobilnych użytkowników lub gości z wyszukiwarki na obce domeny.
  • Phishing - na serwerze stworzono fałszywą stronę banku lub sklepu (w podkatalogu).

Porównanie narzędzi do skanowania WordPress

NarzędzieCenaCo wykrywaWyróżnik
Wordfence Free0 złPliki rdzenia, znane wirusyDarmowe, firewall
Wordfence Premiumok. 500 zł/rokTo samo + sygnatury real-timeOchrona 0-day
MalCareok. 400 zł/rokZłożony malware, backdooryCzyszczenie 1 kliknięciem
Sucuri Scanner0 zł (zewnętrzny)Blacklisty, spam SEOBez instalacji
ImunifyAVw panelu hostinguŚcaner serwerowyDostępny u hostingów PL

Krok 4: Czyszczenie plików rdzenia i motywu

To najważniejszy etap. Działasz warstwami.

Warstwa 1: Rdzeń WordPress

Pobierz czystą wersję WordPress odpowiadającą Twojej instalacji z wordpress.org. Przez FTP nadpisz katalogi wp-admin i wp-includes oraz wszystkie pliki PHP w katalogu głównym (index.php, wp-login.php, wp-settings.php itp.). NIE ruszaj: wp-config.php, .htaccess (na razie), katalogu wp-content.

Potem sprawdz wp-config.php ręcznie - szukaj obcego kodu na początku lub końcu pliku, który nie pasuje do standardowej struktury.

Warstwa 2: Wtyczki

Najkorzystniej: dezaktywuj wszystkie wtyczki przez phpMyAdmin (zmień wartość active_plugins w tabeli wp_options na a:0:{}), usuń cały katalog wp-content/plugins przez FTP, pobierz wszystkie wtyczki od nowa z wordpress.org lub od kupionego dostawcy. Nie przywrócaj wtyczek, których nie aktualizujesz - to potencjalne furtki.

Warstwa 3: Motyw

Jeśli masz custom motyw, musisz go przeskanować plik po pliku. Wordfence po skanowaniu pokazuje podejrzane pliki z porównaniem diff. Szukaj: eval(base64_decode, system(, exec(, passthru( - to klasyczne wzorce złośliwego kodu PHP.

Warstwa 4: Katalog uploads

W wp-content/uploads nie powinno być żadnych plików PHP. Usuń każdy plik .php znaleziony w tym katalogu - tam nie ma nic do roboty dla skryptów PHP.

Czyszczenie WordPress po ataku - lista kontrolna

  • Backup całej strony (pliki + baza) przed czyszczeniem
  • Zmiana hasła do panelu hostingu i FTP
  • Nadpisanie katalogów wp-admin i wp-includes czystą kopią
  • Usunięcie wszystkich wtyczek i ponowna instalacja ze świeżych źródeł
  • Skan motywu w poszukiwaniu eval/base64/exec
  • Usunięcie plików PHP z katalogu uploads
  • Sprawdzenie .htaccess pod kątem obcych reguł przekierowań
  • Wyczyszczenie bazy danych ze spamerskich linków i obcych adminów
  • Zmiana haseł admina WordPress, soli w wp-config.php, hasła bazy danych
  • Skan wtyczką Wordfence po zakończeniu czyszczenia

Krok 5: Czyszczenie bazy danych

Baza danych to często pomijany element, a złośliwy kod chętnie się tam chowa. Przez phpMyAdmin wykonaj wyszukiwanie w całej bazie frazy eval(base64 oraz script w tabelach wp_posts i wp_options.

Sprawdz też tabelę wp_users - czy nie ma nieznanych kont administratorów. Atakujący często zakładają ukrytych adminów jako backup dostępu. To klasyczny trick - atakujesz stronę, zostawiasz sobie konto z rolą admin i wracasz miesiąc później.

W wp_options szukaj podejrzanych wartości przy kluczach siteurl, home, active_plugins - atakujący czasem podmienia adres URL strony na własny.

Przy rozległej infekcji bazy najszybsze wyjście to przywrócenie bazy z backupu sprzed ataku (jeśli masz pewność kiedy dokładnie nastąpił atak) lub użycie wtyczki Better Search Replace do hurtowego usunięcia wstrzykniętych linków.

Przy dużych bazach danych (ponad kilkadziesiąt tysięcy wpisów) użyj komendy MySQL bezpośrednio zamiast phpMyAdmin - jest znacznie szybszy i nie ma limitu czasu wykonania zapytania.

Krok 6: Kiedy przywrócić z backupu zamiast czyścić

Czasem czyścić nie ma sensu. Jeśli masz backup zewnętrzny (UpdraftPlus na Google Drive, BlogVault, JetBackup na hostingu) sprzed daty infekcji, często szybciej jest po prostu przywrócić czysty stan.

Wyliczenie: czy backup jest sprzed ataku? Sprawdź datę modyfikacji zainfekowanych plików w logu serwera. Czy przywrócenie nie cofnie ważnych zmian treści lub zamówień? Przy sklepach WooCommerce zwykle warto czyścić ręcznie zamiast cofać bazę, bo ryzykujesz utratą zamówień złożonych po dacie backupu.

Po przywróceniu z backupu musisz i tak zmienić hasła oraz sprawdzić, czy luka, którą wykorzystano, jest już załatana (np. zaktualizować podatną wtyczkę).

Plusy

  • Szybkie przywrócenie czystego stanu bez analizy każdego pliku
  • Pewność, że nie ma ukrytych backdoorów
  • Oszczędność czasu przy rozległej infekcji

Minusy

  • Możliwa utrata nowszych treści, wpisów, zamówień
  • Nie eliminuje przyczyny ataku - luka nadal istnieje
  • Backup musi być naprawdę sprzed daty infekcji

Krok 7: Zmiana wszystkich haseł i kluczy bezpieczeństwa

Nawet jeśli wyczyściłeś stronę perfekcyjnie, stare hasła są nadal u atakującego. To obowiązkowe:

  • Hasło administratora WordPress (i wszystkich innych kont WP).
  • Hasło FTP lub SFTP.
  • Hasło bazy danych (i aktualizacja go w wp-config.php).
  • Klucze bezpieczeństwa w wp-config.php - wygeneruj nowe na api.wordpress.org/secret-key/1.1/salt/.
  • Hasło do panelu hostingu i cPanel.
  • Jeśli masz skonfigurowane klucze API wtyczek (PayU, Stripe, inne) - sprawdź logi dostępu FTP pod kątem nieautoryzowanego odczytu wp-config.php.

Krok 8: Zgłoszenie do Google i zdjęcie ostrzeżenia

Jeśli Google oznaczyło Twoją stronę jako niebezpieczną, samo wyczyszczenie nie zdejmie etykiety automatycznie. Musisz poprosić Google o ponowną weryfikację.

1. Zaloguj się do Google Search Console (search.google.com/search-console).
2. Przejdź do sekcji Problemy z bezpieczeństwem (Security Issues).
3. Sprawdź, co dokładnie wykryto - tam znajdziesz przykładowe zainfekowane URL-e.
4. Po zakończeniu czyszczenia kliknij Poprosi o weryfikację (Request Review).
5. W formularzu opisz co zrobiłeś: jakie pliki usunąłeś, jakie wtyczki zaktualizowałeś, jakie hasła zmieniłeś.

Google zazwyczaj reaguje w ciągu 1-3 dni roboczych. Do tego czasu ostrzeżenie może nadal się wyświetlać. Jeśli masz domenę na Cloudflare lub korzystasz z usługi monitoringu reputacji, sprawdź też inne listy blokujące: McAfee SiteAdvisor, Norton Safe Web.

RODO: jeśli na Twojej stronie były przetwarzane dane osobowe klientów (np. sklep, formularz kontaktowy z zapisem do bazy) i doszło do ich wycieku, masz 72 godziny na zgłoszenie naruszenia do UODO. Jestem webdeveloperem, nie prawnikiem - ale warto skonsultować tę kwestię ze specjalistą od ochrony danych.

Krok 9: Zabezpieczenie przed kolejnym atakiem

Po całej akcji ratunkowej warto zadbać o to, żeby się to nie powtórzyło. Najważniejsze kroki, które robię po każdym czyszczeniu u klienta:

  • Automatyczne aktualizacje WordPress, wtyczek i motywów (przynajmniej poprawki bezpieczeństwa).
  • Backup zewnętrzny co 24 godziny - UpdraftPlus na Google Drive lub Dropbox, albo BlogVault.
  • Firewall aplikacji webowej - Wordfence lub Cloudflare (darmowy plan wystarcza do podstawowej ochrony).
  • Ograniczenie prób logowania (wtyczka Limit Login Attempts Reloaded lub Wordfence).
  • 2FA dla wszystkich adminów - darmowe wtyczki jak WP 2FA.
  • Wyłączenie XML-RPC jeśli go nie używasz (często wektorem ataku brute force).
  • Usunięcie wszystkich nieaktywnych wtyczek i motywów.
  • Monitoring uptime - polecam artykuł o monitoringu uptime i wykrywaniu awarii, gdzie opisuję konkretne narzędzia.

Jeśli nie chcesz się tym zajmować samodzielnie, mam dla klientów pakiety opieki technicznej WordPress gdzie robię to wszystko w ramach miesięcznej subskrypcji - aktualizacje, backup, monitoring, reagowanie na incydenty. Jeden atak i koszty czyszczenia przewyższają roczny koszt dobrej opieki.

A jeśli strona była zaniedbana przez lata i zastanawiasz się, czy nie lepiej zacząć od nowa zamiast ratować przestarzałą instalację, przeczytaj ile kosztuje redesign strony internetowej - czasem to sensowniejsza opcja.

Najczęstsze pytania

Skąd wiem, że moja strona WordPress została zhakowana?

Najczęstsze sygnały to: Google wyświetla ostrzeżenie „Ta witryna może być niebezpieczna”, hosting zablokował konto z powodu spamu lub złośliwego kodu, strona otwiera się wolno albo przekierowuje na obce domeny, w Google Search Console pojawia się zakładka Security Issues z alertami. Czasem infekcja jest utajniona - specjalnie ukryta przed właścicielem, widoczna tylko dla botów Google lub odwiedzających z zewnętrznych linków.

Czy mogę wyczyścić zhakowanego WordPressa sam, bez specjalisty?

Tak, jeżeli masz dostęp FTP lub menedżera plików w panelu hostingu i rozumiesz strukturę katalogów WordPress. Podstawowe czyszczenie opisuję w tym artykule. Natomiast przy zaawansowanej infekcji (backdoor w bazie danych, zaszyfrowany kod w dziesiątkach plików, rootkit na serwerze) rekomendujem zlecenie tego specjaliście - samodzielne czyszczenie może pozostawić ukryte furtki i za tydzień będziesz znowu zainfekowany.

Ile trwa oczyszczenie zhakowanej strony WordPress?

Proste przypadki - nadpisanie rdzenia i zmiana haseł - to 1-2 godziny. Średnio zaawansowane infekcje z zainfekowanymi wtyczkami i bazą danych to 4-8 godzin. Zaawansowane ataki z wieloma backdoorami, zainfekowanym motywem pisanym na zamówienie i śladami w bazie to czasem 1-2 dni pracy. Czas zależy też od tego, czy masz aktualny backup, do którego możesz cofnąć się zamiast czyścić plik po pliku.

Czy warto płacić za Wordfence Premium lub MalCare?

Wordfence w wersji darmowej wystarcza do skanowania i podstawowego firewalla, ale z sygnaturami aktualizowanymi z 30-dniowym opóźnieniem. Wordfence Premium (ok. 119 USD/rok) daje aktualizacje w czasie rzeczywistym. MalCare (ok. 99 USD/rok) wyróżnia się czyszczeniem jednym kliknięciem bez ręcznego grzebania w plikach. Przy kilku stronach opłaca się MalCare lub podobna usługa, przy jednej stronie darmowy Wordfence z regularnym backupem zewnętrznym w zupełności wystarcza.

Jak długo Google utrzymuje ostrzeżenie po wyczyszczeniu strony?

Po przesłaniu prośby o weryfikację w Search Console (Security Issues > Request Review) Google zazwyczaj reaguje w ciągu 1-3 dni roboczych przy infekcji malware. Przy tzw. manual action za spamerskie linki może to potrwać 1-4 tygodnie. W tym czasie strona może nadal wyświetlać ostrzeżenie w wynikach, dlatego warto zgłosić się jak najszybciej po upewnieniu się, że czyszczenie jest kompletne.

Co zrobić, żeby strona WordPress nie została zhakowana ponownie?

Podstawowe kroki: aktualizuj WordPressa, wtyczki i motywy na bieżąco (ponad 50% ataków wynika ze znanych luk w przestarzałych wtyczkach), używaj silnych haseł i 2FA dla adminów, usuń nieaktywne wtyczki i motywy, skonfiguruj automatyczne backupy na zewnętrzny storage. Najlepiej - oddaj stronę pod regularną opiekę techniczną, gdzie ktoś aktualizuje, monitoruje uptime i reaguje na incydenty.