WordPress, wirus, access denied i brak kopii zapasowej. Jak sobie poradzić?

Masz stronę w WordPressie i pewnego dnia, gdy próbujesz na nią wejść, pojawia się komunikat "Access denied". Nie możesz zalogować się do panelu administratora ani zobaczyć żadnej podstrony. Twoja strona została zhakowana, a ty w dodatku nie masz kopii zapasowej. Czy sytuacja jest beznadziejna?

Zależy, jakie szkody wyrządził haker. Mógł usunąć wszystkie dane, ale jeśli nie to miał na celu jego atak, możesz spróbować odzyskać stronę.

Wirusy mogą być podrzucone jako pliki albo doklejone do istniejącego pliku, dlatego pozbycie się ich jest wyzwaniem. Jeśli jednak zabierzesz się za to z planem, jest duża szansa na powodzenie.

Potrzebujesz: dostępu FTP do serwera i dostępu do bazy danych. O FTP i bazie oraz o tym, skąd wziąć do nich hasła pisałam we wcześniejszym wpisie.

Pliki silnika WordPressa

Silnik WordPressa znajduje się w katalogach wp-adminwp-includes. Nikt tam nie zagląda, więc jest to idealne miejsce, aby ukryć parę złośliwych plików. Na szczęście nie ma tam żadnych danych użytkownika, więc można te katalogi łatwo wyrzucić i zastąpić nowymi.

Zaloguj się na serwer przez FTP. Przejdź do katalogu wp-includes i znajdź plik version.php. Odczytaj wersję WordPressa, której używasz. Jest ona zapisana w zmiennej $wp_version i będzie to np. "5.5.3".

Wejdź na stronę wordpress.org/download/releases i ściągnij ZIP ze swoją wersją. Rozpakuj plik na swoim komputerze. Gdy zajrzysz do rozpakowanego katalogu, zobaczysz trzy katalogi – wp-admin, wp-includeswp-content – oraz trochę plików. Zmień nazwy katalogu wp-admin na czysty-wp-admin, a wp-includes na czysty-wp-includes.

Wróć do FileZilli i skopiuj katalogi czysty-wp-adminczysty-wp-includes do katalogu głównego twojej strony, tak żeby były w tym samym miejscu, co wp-adminwp-includes. Kopiowanie trochę potrwa. Następnie usuń stare katalogi wp-adminwp-includes, a katalogom czysty-wp-adminczysty-wp-includes zmień nazwy na wp-adminwp-includes. Tym sposobem zostały usunięte wszystkie wirusy w tych katalogach! Hura!

Teraz przyjrzyj się luźnym plikom znajdującym się w katalogu głównym strony. Mowa o plikach takich jak wp-config.php, wp-settings.php itd. Zachowaj plik wp-config.php.htaccess (jeśli taki posiadasz). Przekopiuj te dwa pliki na swój komputer. Usuń wszystkie luźne pliki, a na ich miejsce wgraj świeże pliki z katalogu ściągniętego ze strony WordPressa.

wp-config.php

Plik wp-config.php zawiera dane logowania do bazy danych, tzw. sól, za pomocą której można wylogować wszystkich zalogowanych użytkowników (również hakerów), oraz prefiks tabel w bazie danych (domyślnie "wp_"). Plik ten powinien być podobny do pliku wp-config-sample.php, dlatego najlepiej porównaj oba pliki w edytorze tekstowym.

Zwróć uwagę, czy plik nie zawiera czegoś podobnego do:

@include “\057ho\155e/ (...)"
Jeśli tak, usuń to. Jeśli natomiast interesuje cię, co to takiego, rozszyfruj kod za pomocą dekodera malware'u: malwaredecoder.com. Być może wskaże ci to miejsce, w którym znajduje się podejrzany plik podrzucony przez hakerów.

Jeśli jesteś już w pliku wp-config.php, wnieś kilka zmian podnoszących bezpieczeństwo strony.

Przede wszystkim zastąp fragment:

define( 'AUTH_KEY',         'put your unique phrase here' );
define( 'SECURE_AUTH_KEY',  'put your unique phrase here' );
define( 'LOGGED_IN_KEY',    'put your unique phrase here' );
define( 'NONCE_KEY',        'put your unique phrase here' );
define( 'AUTH_SALT',        'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT',   'put your unique phrase here' );
define( 'NONCE_SALT',       'put your unique phrase here' );
świeżą solą wygenerowaną na stronie api.wordpress.org/secret-key/1.1/salt. Link do tej strony znajduje się również w pliku wp-config.php (pamiętaj jednak, aby skopiować link z czystego pliku ściągniętego ze strony WordPressa, bo twój stary wp-config.php mógł zostać zmodyfikowany przez hakerów). Dzięki zmianie soli wszyscy zalogowani użytkownicy zostaną wylogowani i będą musieli użyć ponownie hasła do zalogowania. Jest to dobry sposób na wylogowanie hakera, który nie zna hasła, ale udało mu się zalogować podstępem.

Dobrym zwyczajem jest uniemożliwienie edycji plików motywu z poziomu panelu administatora. Haker, który zna hasło, nie będzie mógł modyfikować plików. Dodaj linijkę:

define( 'DISALLOW_FILE_EDIT', true );
tuż przed:
/* That's all, stop editing! Happy publishing. */

Nie sprawdzałam, czy ta opcja ma jakiekolwiek znaczenie, gdy korzysta się np. z wtyczki File Manager, za pomocą której można wgrywać i modyfikować pliki. Lepiej jednak dmuchać na zimne. Jak mawiała moja koleżanka, pakując do plecaka najróżniejsze rzeczy, które prawie nigdy się nie przydawały – przezorny zawsze ubezpieczony.

Tak przygotowany plik wgraj z powrotem na serwer.

Katalog główny oraz katalogi wp-adminwp-content są czyste. Czas zająć się katalogiem wp-content, czyli miejscem, w którym rezydują motywy, wtyczki i zdjęcia. Duuuże pole do popisu dla hakera.

wp-content/uploads

W katalogu wp-content/uploads umieszczone są wszystkie pliki (zdjęcia, filmy, pliki dźwiękowe, PDF-y), które zostały wgrane na serwer przez panel administratora WordPress. Tu również hakerzy ukrywają wirusy.

Na co zwrócić uwagę? Na wszystkie pliki z końcówką .php – tych plików w ogóle nie powinno tu być i należy je bez wahania usunąć.

Do tego wszystkie pliki z końcówką .ico, szczególnie te, których nazwa jest dziwna i zaczyna się od kropki. Pliki, których nazwa zaczyna się od kropki, są traktowane jako ważne pliki systemowe i ukrywane przed użytkownikiem. Aby FileZilla pokazała ukryte pliki, w górnym pasku wybierz "Server" i "Force showing hidden files".

Proponuję przeskanować ten katalog ręcznie, czyli przechodząc z katalogu do katalogu i szukając podejrzanych rzeczy. WordPress umieszcza pliki w katalogach wedle dat, np. plik wgrany w grudniu 2020 r. znajdzie się w katalogu 2020/12.

Dla ułatwienia pracy możesz ustawić sortowanie na podstawie typu pliku. Dzięki temu łatwo namierzysz np. pliki PHP i ICO. Zapisuj sobie, który folder został już sprawdzony, ponieważ jest to żmudna robota i łatwo o pomyłkę.

Wtyczki

Czas zająć się wtyczkami. Przejdź do katalogu wp-content i skopiuj katalog plugins na swój komputer. Dzięki temu będziesz mieć kopię zapasową.

Ściągnij z internetu wtyczki w wersjach, których aktualnie używa twoja strona. Wersję możesz sprawdzić w głównym pliku PHP wtyczki, który z reguły ma nazwę taką samą lub bardzo podobną do nazwy katalogu, w którym się znajduje. Np. jeśli korzystasz z wtyczki znajdującej się w katalogu wp-statistics, to jej głównym plikiem będzie wp-statistics/wp-statistics.php. Na samej górze pliku znajdziesz numer wersji. Podmień stary katalog wtyczki na świeży katalog.

Ten krok wykonaj dla każdej wtyczki. Jest to żmudne, ale dzięki temu pozbędziesz się wszystkich wirusów zaszytych we wtyczkach.

Motywy

Przejdź do katalogu wp-content/themes i usuń wszystkie katalogi z nieużywanymi motywami. W tym katalogu powinien być tylko aktualnie wykorzystywany motyw, ponieważ im więcej katalogów i plików, tym więcej okazji na ukrycie wirusa. Strukturę katalogów możesz porównać z WordPressem ściągniętym wcześniej ze strony WordPressa.

Zmień nazwę katalogu z używanym motywem na coś innego (np. "kopia-zapasowa-motywu"), ściągnij z internetu świeżą wersję używanego motywu i wgraj ją na serwer. Wersję używanego motywu znajdziesz w pliku style.css w katalogu głównym motywu. Tym sposobem unieszkodliwiłeś wirusy w katalogu themes.

Baza danych

Pliki strony są przeskanowane, więc czas zająć się bazą danych. Kroki, które należy wykonać, są opisane tu: www.fixrunner.com/how-to-scan-wordpress-for-malware.

Użytkownicy

Ok, wygląda na to, że pozbyliśmy się wirusów. Spróbuj zalogować się teraz do panelu administatora. Jeśli strona została wyczyszczona poprawnie, powinno się to udać. Przejdź do sekcji "Użytkownicy" i usuń wszystkich podejrzanych administratorów i zwykłych użytkowników, których nie rozpoznajesz, którzy mają dziwne nazwy i dziwne e-maile.

Zmiana haseł

Gdy już jesteś w panelu administratora, zmień hasło każdemu użytkownikowi i sobie. Hasła muszą być długie i skomplikowane.

Zaloguj się do panelu klienta u hostingodawcy i zmień hasło FTP, do bazy danych oraz do samego panelu klienta. Te hasła również muszą być długie i skomplikowane. Zaloguj się przez FileZillę na serwer (używając nowego hasła), skopiuj plik wp-config.php, zastąp w nim stare hasło do bazy świeżym hasłem, przy okazji jeszcze raz zmień sól, i wgraj tak przygotowany plik na serwer.

Aktualizacja wszystkiego i porządki

Przejdź do panelu administratora WordPress i usuń wszystkie wtyczki, których nie potrzebujesz. Potem zaktualizuj motyw, wtyczki oraz samego WordPressa. Pamiętaj, aby robić to regularnie. Chyba nie chcesz powtórki z rozrywki? :-)

Skan bezpieczeństwa

Na koniec zainstaluj wtyczkę Wordfence i przeskanuj stronę w poszukiwaniu wirusów. Wtyczka nie wykryje wszystkiego, ale jest pomocna – potrafi np. wskazać użytkowników utworzonych w nietypowy sposób oraz wtyczki, które ze względu na luki bezpieczeństwa zostały usunięte z oficjalnego katalogu wtyczek WordPressa.

Podsumowanie

Niestety bezpieczeństwem strony zaczynamy interesować się dopiero wtedy, gdy się sparzymy. Jednak nie zawsze stronę będzie można odzyskać; może się też zdarzyć, że poprzez nasze zaniedbania wyciekną dane naszych klientów. Przyczyną ataku może być słabe hasło, dziurawa wtyczka lub błąd w samym WordPressie. Aby zapewnić bezpieczeństwo swojej stronie, pamiętaj o następujących rzeczach:

  1. Regularnie aktualizuj WordPressa, motywy i wtyczki.
  2. Używaj silnych haseł.
  3. Rób kopie zapasowe plików strony i bazy danych.
  4. Usuwaj nieużywane wtyczki, motywy i pliki w bibliotece mediów.
  5. Nie pobieraj wtyczek i motywów z podejrzanych źródeł.
  6. Co jakiś czas sprawdzaj w panelu administratora WordPress, czy nie pojawił się jakiś nowy podejrzany administrator.
  7. Zainstaluj na stronie certyfikat SSL.
Pani Marta
Jestem Marta. Pani Marta. I piszę o rzeczach, które inspirują mnie i ciekawią w pracy web developera. Na moim blogu znajdziesz porady dotyczące WordPressa i programowania stron, a także moje osobiste przemyślenia na najróżniejsze tematy.