Охота на невидимку: как мы нашли и вырезали скрытый SEO-спам (казино-дорвей) с сайта на WordPress
Обычный вечерний аудит логов веб-сервера неожиданно перерос в полноценное расследование. Всё началось со странных строчек в
access_log одного из сайтов ([ваш сайт]):text
"66.249.65.105 ... GET /?o=36973124435 HTTP/1.1" 200
"66.249.65.105 ... GET /?x=47275860160 HTTP/1.1" 200
Используйте код с осторожностью.
IP-адрес принадлежит официальному Googlebot, а вот мусорные GET-параметры (
?o=..., ?x=...), отдающие код 200 — классический почерк так называемого японского или гэмблинг-дорвея. Хакеры взламывают сайт, подсовывают поисковикам тысячи фейковых ссылок на казино и продвигают их за счет репутации вашего домена.Когда открыли страницу сайта и заглянули в её текстовое содержимое, подозрения подтвердились на 100%: в самом низу висела целая пачка ссылок на букмекерские конторы и онлайн-казино (
1хБет, 1Win, mostbet, pinko). При этом глазами обычный посетитель их не видел.Делюсь пошаговой инструкцией, как мы вычисляли, где прячется эта зараза, и как её обезвредили.
Шаг 1. Поиск по файлам (Первая осечка)
Логично было предположить, что вирусный код вшит в
footer.php темы или в ядро WordPress. Прогнали поиск по всем файлам сайта по ключевым словам казино:bash
grep -rnE "1Win|mostbet|cruks|pinko" /home/[ваш сайт]/public_html/
Используйте код с осторожностью.
Результат: Пусто (кроме легитимного черного списка спамеров внутри плагина статистики).
Проверили файлы на популярные функции обфускации (
eval, base64_decode, gzinflate, str_rot13) в папках тем и wp-includes — там тоже оказались только стандартные библиотеки самого WordPress. Стало ясно: в открытом виде в файлах сайта этих ссылок нет.Шаг 2. Притворяемся Googlebot через
curlМногие современные вирусы работают по принципу клоакинга: обычным людям и админам они отдают чистую страницу, а спам-ссылки показывают только тогда, когда на сайт заходит поисковый робот.
Мы сделали запрос к главной странице через консоль, подменив
User-Agent на робота Google:bash
curl -s -A "Mozilla/5.0 (compatible; Googlebot/2.1; +http://google.com)" https://[ваш сайт] | grep -C 5 -iE "1Win|mostbet|cruks|1хБет"
Используйте код с осторожностью.
И вот тут карта вскрылась. В ответ посыпался чистый HTML-код, вшитый сразу после основного контента страницы:
html
<div style="position: absolute; left: -9966px;">
<p><a href="...">1хБет</a></p>
</div>
<p><a style="position: absolute; top: -9999px; left: -9999px;" href="...">1Win</a></p>
Используйте код с осторожностью.
Злоумышленники использовали классический трюк со смещением координат (
left: -9966px), чтобы вынести ссылки далеко за пределы экрана монитора, но оставить их видимыми для поисковых роботов.Шаг 3. Развязка — база данных и админка
Раз HTML-обертка выводилась прямо внутри тела статьи, а в PHP-файлах её не было, значит, код сидел напрямую в базе данных WordPress (таблица
wp_posts).- Зашли в админку WordPress -> раздел Страницы -> открыли главную страницу.
- Переключили редактор в режим «Текст» (HTML).
- В самом низу, сразу после основного текста, обнаружился тот самый хвост из десятков скрытых блоков .
- Вырезали всю эту грязь, обновили страницу и снова прогнали проверку через
curlс подстановкой Googlebot — в ответ пришла идеальная тишина.
Выводы и профилактика
- Меняем пароли и соли: Сразу после чистки сменили пароль администратора WordPress. Дополнительно в таких случаях стоит обновить ключи безопасности (
AUTH_KEY,SECURE_AUTH_KEY) вwp-config.php, чтобы принудительно сбросить все старые сессии. - Чистим кэш: Если на сайте стоит кэширующий плагин (вроде LiteSpeed Cache), его нужно обязательно сбросить, иначе поисковики продолжат видеть старую зараженную копию из кэша.
- Логи рулят: Регулярный просмотр
access_logи связка Fail2ban + Maldet позволяют поймать проблему на раннем этапе, пока сайт не улетел под фильтры поисковых систем.