Strona przekierowuje na inną stronę – jak znaleźć i usunąć przekierowanie
- Typowe objawy
- Klienci lądują na kasynie, aptece lub fałszywej loterii, a Ty widzisz normalną stronę
- Najczęstsza przyczyna
- Kod w .htaccess, index.php, bazie danych lub skrypt z obcej domeny po włamaniu
- Czas naprawy
- Od godziny do kilku godzin, dłużej, gdy kod się odtwarza
- Czy zrobisz to sam?
- Tak, jeśli umiesz użyć FTP, phpMyAdmin i terminala
Szybka odpowiedź
Jeśli strona przekierowuje na inną stronę tylko niektórych odwiedzających, to prawie zawsze złośliwe przekierowanie warunkowe po włamaniu. Wywołaj je w oknie prywatnym, na telefonie przez dane komórkowe albo poleceniem curl z nagłówkami telefonu i Google, a potem sprawdź po kolei .htaccess, index.php, adresy siteurl i home w bazie, skrypty we wpisach, wtyczki i DNS. Usuń źródło, mechanizm, który je odtwarza, oraz lukę, przez którą weszli atakujący.
To jedna z najbardziej frustrujących awarii. Klient pisze, że Twoja strona „otwiera kasyno”, a Ty wchodzisz i widzisz wszystko w porządku. To nie przypadek. Złośliwe przekierowania są pisane tak, żeby właściciel strony ich nie zauważył, a odwiedzający z wyszukiwarki tak.
W tym poradniku pokazuję, jak wywołać takie przekierowanie na własnym sprzęcie, gdzie zwykle siedzi jego kod i jak je usunąć tak, żeby nie wróciło. Na końcu opisuję niewinne przyczyny, które wyglądają podobnie: źle ustawiony adres strony, pętlę przekierowań HTTPS i agresywne reklamy.
Dlaczego Ty nie widzisz przekierowania, a klienci tak
Złośliwy kod sprawdza kilka warunków, zanim przekieruje odwiedzającego. Typowe filtry:
- Tylko urządzenia mobilne. Kod czyta nagłówek
User-Agenti przekierowuje tylko telefony. - Tylko wejścia z wyszukiwarki. Kod sprawdza nagłówek
Referer. Wejście z zakładki lub wpisanie adresu nie uruchamia przekierowania, kliknięcie w wynik Google tak. - Tylko pierwsze wejście. Po przekierowaniu kod zapisuje ciasteczko albo zapamiętuje adres IP i przez kolejne godziny lub dni nie przekierowuje tej samej osoby.
- Nie dla zalogowanych. Jeśli przeglądarka ma ciasteczko zalogowanego użytkownika WordPressa, kod nic nie robi.
- Nie dla robotów Google. Googlebot dostaje zwykłą stronę, żeby infekcja dłużej pozostała niewykryta.
Jak wywołać i zbadać przekierowanie
Zanim zaczniesz szukać kodu, potwierdź, że przekierowanie istnieje, i ustal, przy jakich warunkach działa. To podpowie, gdzie go szukać.
-
Okno prywatne na komputerze
Otwórz okno prywatne (incognito), wpisz w Google nazwę firmy lub frazę, na którą strona jest widoczna, i kliknij wynik. Okno prywatne nie ma Twoich ciasteczek logowania, a kliknięcie w wynik wysyła nagłówek
Refererz Google. -
Telefon przez dane komórkowe
Wyłącz Wi-Fi, żeby telefon miał inny adres IP niż Twój komputer, i powtórz to samo w trybie prywatnym przeglądarki. Jeśli przekierowanie zadziała raz, a przy drugiej próbie już nie, kod zapamiętuje odwiedzających. Wtedy kolejne próby rób z nowego okna prywatnego, a najlepiej po zmianie adresu IP, np. po włączeniu i wyłączeniu trybu samolotowego.
-
curl z nagłówkami telefonu i Google
To najbardziej powtarzalna metoda. Polecenie nie wykonuje JavaScriptu, więc pokaże tylko przekierowania po stronie serwera, ale za to dokładnie:
# jak zwykła przeglądarka, bez Referer curl -sI https://twojadomena.pl/ # jak telefon, który przyszedł z Google UA="Mozilla/5.0 (Linux; Android 14; Pixel 8) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0 Mobile Safari/537.36" curl -sI -A "$UA" -e "https://www.google.com/" https://twojadomena.pl/ # pełna ścieżka przekierowań curl -sIL -A "$UA" -e "https://www.google.com/" https://twojadomena.pl/ | grep -iE "^(HTTP|location)"Szukasz odpowiedzi
301,302lub307z nagłówkiemLocationwskazującym obcą domenę. Jeśli tylko drugie polecenie zwraca przekierowanie, kod działa po stronie serwera i reaguje na nagłówki. Szukaj go w.htaccessi plikach PHP.Opcja
-Iwysyła zapytanie typu HEAD. Część złośliwego kodu reaguje tylko na zwykłe zapytanie GET, więc jeśli nic nie widzisz, powtórz test w tej formie:curl -s -o /dev/null -D - -A "$UA" -e "https://www.google.com/" https://twojadomena.pl/. -
Narzędzia deweloperskie przeglądarki
Jeśli
curlnie pokazuje przekierowania, a przeglądarka tak, to przekierowanie robi JavaScript. Otwórz narzędzia deweloperskie (F12), w zakładce Sieć zaznacz zachowywanie dziennika („Preserve log”) i przełącz widok na urządzenie mobilne. Wejdź na stronę i zobacz, który skrypt pobiera się tuż przed przejściem na obcą domenę. Najczęściej to plik z domeny, której nie znasz, albo skrypt wpisany bezpośrednio w kod strony.
Zrzut ekranuKarta Sieć z włączonym „Zachowaj dziennik” (Preserve log) i filtrami Dokument oraz JS, wejście jak z telefonu. Fałszywy jquery.min.jsładuje się z obcej domeny (kolumna Domena), a chwilę później telefon ląduje na stronie z „nagrodą”. Zrzut z testowego środowiska, obie domeny są fikcyjne.
Gdzie siedzi kod przekierowania
To drzewo pomaga zawęzić poszukiwania na podstawie tego, co ustaliłeś w poprzednim kroku:
Szczegóły do każdego miejsca:
.htaccess
Złośliwe reguły wyglądają zwykle tak jak poniżej. Warunek sprawdza nagłówek Referer lub User-Agent, a reguła przenosi na obcą domenę:
RewriteCond %{HTTP_REFERER} (google|bing|yahoo|facebook) [NC]
RewriteCond %{HTTP_USER_AGENT} (android|iphone|mobile) [NC]
RewriteRule ^(.*)$ https://obca-domena.example/ [R=302,L]
Sprawdź wszystkie pliki .htaccess, nie tylko główny. Atakujący często dopisują je w podkatalogach albo zostawiają setki pustych linii, żeby złośliwa reguła znalazła się daleko poza ekranem edytora.
find . -name ".htaccess" -printf "%TY-%Tm-%Td %p\n" | sort
grep -rniE "http_referer|http_user_agent" --include=.htaccess .
Standardowy .htaccess WordPressa zawiera tylko blok # BEGIN WordPress … # END WordPress oraz reguły wpisane przez Ciebie lub wtyczki, np. cache czy wymuszenie HTTPS. Jego wzorcową treść znajdziesz w dokumentacji developer.wordpress.org.
index.php, wp-config.php i pliki PHP
Główny index.php WordPressa ma kilkanaście linii i ładuje wp-blog-header.php. Wszystko ponad to jest podejrzane. Przekierowania w PHP używają funkcji header("Location: …"), często zaciemnionej przez base64_decode lub złożenie nazwy z kawałków. Sprawdź też katalog wp-content/mu-plugins, bo pliki z niego ładują się zawsze i nie widać ich na zwykłej liście wtyczek.
wp core verify-checksums
grep -rlE "header\s*\(\s*['\"]Location|HTTP_REFERER|wp_redirect\s*\(\s*['\"]https?://" --include=*.php wp-content/
Drugie polecenie zwróci też legalne wtyczki, bo przekierowania to normalna funkcja WordPressa. Szukasz kodu, który przekierowuje na stały, obcy adres w zależności od nagłówków.
Adres strony w bazie danych
W tabeli wp_options ustawienia siteurl i home określają adres strony. Jeśli atakujący je zmieni, przekierowuje każdego, łącznie z Tobą przy próbie logowania. W phpMyAdmin:
SELECT option_name, option_value FROM wp_options
WHERE option_name IN ('siteurl','home');
Jeśli wartości są obce, popraw je w phpMyAdmin albo poleceniem wp option update home 'https://twojadomena.pl' i tak samo dla siteurl. Możesz je też tymczasowo wymusić w wp-config.php stałymi WP_HOME i WP_SITEURL.
Skrypty w treści i ustawieniach
Przekierowania w JavaScripcie często siedzą w bazie danych, dopisane do treści wpisów, widżetów albo pól motywu:
SELECT ID, post_title FROM wp_posts
WHERE post_content LIKE '%<script%' AND post_status = 'publish';
SELECT option_name FROM wp_options
WHERE option_value LIKE '%<script%' OR option_value LIKE '%fromCharCode%';
Obejrzyj każde trafienie. Kody Google Tag Managera, czatów i pikseli reklamowych są legalne. Szukasz skryptów ładowanych z nieznanych domen, długich ciągów znaków budowanych przez String.fromCharCode i odwołań do window.location.
Wtyczki i skrypty z obcych domen
Niektóre przekierowania pochodzą ze skryptu, który kiedyś był legalny: licznika, widżetu lub biblioteki ładowanej z cudzego serwera. Jeśli ten serwer zmieni właściciela albo zostanie przejęty, skrypt zaczyna przekierowywać na wszystkich stronach, które go używają. Usuń skrypty z domen, których nie potrafisz wyjaśnić, i zastąp je wersjami z oficjalnych źródeł.
DNS i rejestrator
Jeśli przekierowuje każdy adres w domenie, także taki, którego nie ma na serwerze, problem leży poza stroną. Sprawdź, na jaki adres IP wskazuje domena i czy zgadza się z adresem serwera w panelu hostingu:
dig +short twojadomena.pl A
dig +short www.twojadomena.pl
whois twojadomena.pl
Zwróć uwagę na datę wygaśnięcia domeny, na włączone przekierowanie (przekierowanie WWW lub „forwarding”) w panelu rejestratora i na to, czy ktoś nie zmienił serwerów DNS. Jeśli domena jest zarejestrowana na byłego wykonawcę i nie masz do niej dostępu, zobacz artykuł Domena zarejestrowana na wykonawcę.
Naprawa krok po kroku
-
Zrób kopię i zapisz dowody
Pobierz pliki i bazę w obecnym stanie. Zapisz wynik polecenia
curlz przekierowaniem i adres docelowy. Przyda się do porównania po naprawie i przy prośbie o sprawdzenie w Google. -
Zmień hasła i wyloguj sesje
Hasło do hostingu, FTP, bazy danych i kont administratorów. Nowe klucze WordPressa:
wp config shuffle-salts. Usuń konta administratorów, których nie znasz. -
Usuń kod przekierowania
Popraw
.htaccess, przywróć oryginalnyindex.php, usuń skrypty z bazy, poprawsiteurlihome. Lepiej niż czyścić pojedyncze pliki jest podmienić rdzeń, wtyczki i motyw na świeże kopie, tak jak opisuję w poradniku Wirus na stronie WordPress. -
Znajdź mechanizm, który odtwarza przekierowanie
Jeśli po poprawce przekierowanie wraca, coś je przywraca. Szukaj plików PHP w
wp-content/uploads, nieznanych zadań w crontabie hostingu i zaplanowanych zadań WordPressa:find wp-content/uploads -type f -name "*.php" crontab -l wp cron event list --fields=hook,next_run_relative -
Zamknij lukę
Zaktualizuj WordPressa, wtyczki i motywy, usuń nieużywane i porzucone dodatki. Bez tego kroku przekierowanie wróci, bo automaty znajdą tę samą dziurę.
-
Sprawdź ponownie i zgłoś do Google
Powtórz testy z okna prywatnego, telefonu i
curl. Wyczyść pamięć podręczną wtyczki cache i CDN, bo mogą wciąż serwować stare, zainfekowane strony. Jeśli Google oznaczył stronę, poproś o sprawdzenie w Search Console. Szczegóły w artykule Strona zawiera szkodliwe programy.
Gabinet usługowy dostaje od klientek wiadomości, że strona na telefonie „otwiera loterię”. Właścicielka sprawdza na swoim komputerze i nic nie widzi. Test curl z nagłówkami telefonu nie pokazuje przekierowania, więc źródłem jest JavaScript. W tabeli wp_options w ustawieniach motywu, w polu na własny kod w stopce, siedzi skrypt ładowany z obcej domeny. Działa tylko raz dla danego urządzenia. Po jego usunięciu, aktualizacji motywu i zmianie haseł przekierowanie znika.
Niewinne przyczyny, które wyglądają podobnie
Nie każde przekierowanie to włamanie. Zanim zaczniesz czyścić stronę, wyklucz te przyczyny:
| Objaw | Prawdopodobna przyczyna | Co zrobić |
|---|---|---|
| Przekierowuje na stary adres strony lub adres tymczasowy | Źle ustawione siteurl i home po przeprowadzce | Popraw adres w bazie lub w wp-config.php |
| Przeglądarka pokazuje błąd o zbyt wielu przekierowaniach | Pętla HTTPS: wymuszenie HTTPS w .htaccess, we wtyczce i w CDN naraz | Zostaw jedno miejsce wymuszania HTTPS, ustaw adres strony na https:// |
Przekierowuje z www na wersję bez www lub odwrotnie | Normalna konfiguracja | Nic, jeśli kończy się na Twojej domenie |
| Wyskakuje reklama lub nowa karta z ofertą | Wtyczka lub sieć reklamowa z agresywnymi formatami | Wyłącz wtyczkę reklam i sprawdź, czy problem znika |
| Przekierowuje tylko jedną podstronę | Reguła we wtyczce do przekierowań, wpisana kiedyś celowo | Sprawdź listę przekierowań we wtyczce |
Niewinne przekierowania kończą się na Twojej domenie i działają tak samo dla każdego. Złośliwe prowadzą na obcą domenę i zwykle tylko dla części odwiedzających.
Kiedy nie robić tego samemu
Jeśli znalazłeś jedną regułę w .htaccess i po jej usunięciu przekierowanie nie wraca przez kilka dni, prawdopodobnie poradziłeś sobie sam. Oddaj sprawę specjaliście, gdy:
- przekierowanie wraca po każdej poprawce,
- nie potrafisz go wywołać, a klienci wciąż je zgłaszają,
- to sklep, a przekierowanie dotyka płatności lub koszyka,
- problem dotyczy domeny lub DNS i nie masz dostępu do rejestratora.
Koszty opisuję w artykule Ile kosztuje usunięcie wirusa ze strony.
Klienci lądują na kasynie, a Ty nie wiesz dlaczego?
Wywołuję przekierowanie, znajduję jego źródło i mechanizm, który je odtwarza, a potem zamykam lukę. Odwirusowanie kosztuje 499 zł netto, zgłoszenia przyjmuję 24/7, a po czyszczeniu daję 30 dni gwarancji czystości.
Najczęstsze pytania
Dlaczego przekierowanie widzą klienci, a ja nie?
Złośliwy kod zwykle pomija zalogowanych administratorów, osoby, które już raz zostały przekierowane, i wejścia bez odnośnika z wyszukiwarki. Ty wchodzisz na stronę z zakładki, będąc zalogowanym, więc widzisz normalną stronę. Sprawdź ją w oknie prywatnym, na telefonie przez dane komórkowe i wchodząc z wyników Google.
Czy przekierowanie może być winą hostingu albo domeny?
Tak, choć rzadziej niż infekcja strony. Jeśli przekierowuje cała domena, także adresy, których nie ma na serwerze, sprawdź rekordy DNS i to, czy domena nie wygasła. Wygasła lub przejęta domena może kierować na zupełnie inny serwer, a pliki Twojej strony są wtedy nietknięte.
Czy wystarczy poprawić plik .htaccess?
Rzadko. Przekierowanie w .htaccess jest często odtwarzane przez osobny plik PHP albo zadanie cron. Jeśli po poprawce przekierowanie wraca po kilku minutach lub godzinach, szukaj mechanizmu, który je przywraca, i luki, przez którą został wgrany.
Czy przekierowanie na kasyno szkodzi pozycjom w Google?
Tak. Google może oznaczyć stronę jako niebezpieczną, pokazać ostrzeżenie w wynikach albo zindeksować spamowe adresy. Im dłużej przekierowanie działa, tym dłużej trwa powrót do normy. Po wyczyszczeniu sprawdź raport „Problemy dotyczące bezpieczeństwa” w Search Console.