Strona zhakowana - co robić? Plan ratunkowy WordPress krok po kroku
Zhakowana strona WordPress co robic - najpierw izoluj i zrób backup, potem wyczyść malware ręcznie lub skanerem, zmień wszystkie hasła i zgłoś sprawę do Google Search Console, żeby zdjąć ostrzeżenie z wyników wyszukiwania.
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.
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ędzie | Cena | Co wykrywa | Wyróżnik |
|---|---|---|---|
| Wordfence Free | 0 zł | Pliki rdzenia, znane wirusy | Darmowe, firewall |
| Wordfence Premium | ok. 500 zł/rok | To samo + sygnatury real-time | Ochrona 0-day |
| MalCare | ok. 400 zł/rok | Złożony malware, backdoory | Czyszczenie 1 kliknięciem |
| Sucuri Scanner | 0 zł (zewnętrzny) | Blacklisty, spam SEO | Bez instalacji |
| ImunifyAV | w panelu hostingu | Ścaner serwerowy | Dostę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 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. 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. 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. 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. 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. 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.Najczęstsze pytania
Skąd wiem, że moja strona WordPress została zhakowana?
Czy mogę wyczyścić zhakowanego WordPressa sam, bez specjalisty?
Ile trwa oczyszczenie zhakowanej strony WordPress?
Czy warto płacić za Wordfence Premium lub MalCare?
Jak długo Google utrzymuje ostrzeżenie po wyczyszczeniu strony?
Co zrobić, żeby strona WordPress nie została zhakowana ponownie?
Potrzebujesz pomocy z projektem?
Robię strony WordPress i sklepy Shoper od 2500 zł. Partner Shoper, 120+ projektów.
- Odpowiedź w 24h
- Certyfikowany Partner Shoper
- 120+ zrealizowanych projektów
- Zgodność z RODO, pełna ochrona danych