«Казино-спам» на вашем сайте: как работает

screenshot 2025 11 11 111839

«Казино-спам» на вашем сайте: как работает скрытый захват и что делать (полное руководство для WordPress)

Ключевые слова (SEO): казино-спам, взлом WordPress, shadow directories (теневые директории), инъекция контента, spam SEO, реинфекция, eval в PHP, wp_options, функции functions.php, WAF, очистка сайта от вирусов, санкции Google, скрытые каталоги Apache/Nginx, компрометация плагинов.


Кратко: почему у легального сайта внезапно появляются запросы «online casino», «slot games»

В 2025 году массово фиксируется тихий захват сайтов под SEO-спам азартных игр. Злоумышленники не ломают дизайн и не «роняют» сайт — они незаметно подменяют контент для поисковиков и ботов, сохраняя нормальный вид для обычных пользователей. В результате сайт:

  • начинает ранжироваться по «casino/slots»;
  • рискует получить санкции Google;
  • теряет доверие клиентов и позиции.

Как устроена атака: от «теневых директорий» до базы данных WordPress

1) Shadow directories (теневые директории) — скрытая подмена страниц на уровне сервера

Сценарий: у вас есть реальная страница yoursite.com/about-us/.
Атакующий создаёт физическую папку about-us/ в файловой системе. Сервер (Apache/Nginx) сначала ищет файлы на диске → находит папку злоумышленника → отдаёт спам-контент.
WordPress не видит запрос вообще.

Итог: посетители «на глаз» всё ещё видят нормальный сайт, а поисковые роботы — страницы казино.

2) Переезд в БД: эволюция атаки под WordPress

По результатам расследований (в т.ч. Sucuri) злоумышленники всё чаще уходят от папок к хранению payload в базе.

Цепочка заражения:

  1. Первичный доступ → в functions.php темы добавляется небольшой обфусцированный код.
  2. Загрузка полезной нагрузки → из wp_options извлекается base64-payload (часто под видом опции вроде wp_footers_logic).
  3. Исполнение → payload декодируется и запускается через eval(); если eval() запрещён — создаётся кэш-файл wp-content/cache/style.dat и оттуда исполняется.
  4. Инъекция контента → при определённых запросах агент подтягивает спам-страницы с доменов атакующих и динамически встраивает в ответы.

3) Механизм самовосстановления (реинфекция)

Вредонос размножается: небольшие «триггеры» в нескольких плагинах проверяют наличие основного кода. Если вы очистили functions.php, «спящие» фрагменты восстанавливают payload в тему и даже в первый активный плагин.
Это «гидра»: удалили один фрагмент — выросли два.


Чем это грозит бизнесу (и почему это критично)

  • Санкции поисковиков: фильтры/деиндексация за спам-контент.
  • Юридические риски: в чувствительных отраслях (медицина, финансы, образование) наличие контента азартных игр может нести регуляторные последствия.
  • Эскалация компрометации: доступ к сайту могут перепродать — сегодня казино-спам, завтра скимминг карт.
  • Потеря доверия: восстановление репутации и SEO-позиций может занять месяцы.

Признаки компрометации (IOC): что поискать в первую очередь

  • Неожиданные URL в индексе: .../casino/, .../slots/, .../bet/ и пр.
  • В админке всё «чисто», но в site:ваш_домен видны странные страницы.
  • Опции WP с base64-строками: wp_footers_logic, theme_*_options, «наборы» без привязки к реальным плагинам.
  • Изменённый functions.php, появление файлов в wp-content/cache/ (например, style.dat).
  • Подозрительные физические папки, совпадающие с реальными путями страниц.
  • В журналах — обращения к внешним доменам, которых нет в вашем коде.

Быстрый план действий (IR-план): от изоляции к восстановлению

Шаг 0. Режим изоляции

  • Включите техработы / запрет индексации (временно), снимите бэкап текущего состояния.
  • Ограничьте доступ (basic-auth, IP-лист) на время работ.

Шаг 1. Проверка серверной части

  • Файловая система: найдите физические папки, совпадающие с реальными URL (теневые директории).
    Удалите/переместите в карантин, проверьте .htaccess, конфиги Nginx.
  • Права и владельцы: проверьте owner/group, запретите запись веб-сервером туда, где это не нужно (принцип минимальных привилегий).

Шаг 2. Аудит WordPress

  • Сравните wp-core с эталоном (wp-cli core verify-checksums).
  • Просмотрите wp-content/themes/*/functions.php, все активные плагины (особенно «первый активный»).
  • Очистите/удалите обфусцированный код, base64-строки, неизвестные вызовы eval, assert, create_function, preg_replace /e.

Шаг 3. Аудит базы данных

Ищем «лишнее» в wp_options:

SELECT option_id, option_name, LENGTH(option_value) AS len
FROM wp_options
WHERE (option_value LIKE '%base64%' OR option_value REGEXP '^[A-Za-z0-9+/=]{200,}$')
   OR option_name LIKE '%footers%'
   OR option_name LIKE '%theme%'
ORDER BY len DESC;
  • Удаляем подозрительные опции (сначала экспорт!), чистим автозагрузку (autoload = 'yes') у сомнительных опций.

Шаг 4. Отключение каналов выполнения

  • В php.ini/.user.ini: по возможности запретить eval, allow_url_include=Off, allow_url_fopen=Off.
  • Включить open_basedir, disable_functions (по согласованию с хостингом).

Шаг 5. Обновления и пароли

  • Обновить ядро WP, темы, плагины.
  • Удалить ненужные и заброшенные (не обновлялись 6+ мес.).
  • Сменить все пароли: хостинг/SSH/FTP/DB/WP-админы.
  • Включить 2FA для админов.

Шаг 6. WAF и мониторинг

  • Включить Web Application Firewall (Cloudflare/AWS WAF/Wordfence/Sucuri) с правилами ботов и блокировкой C2-паттернов.
  • Подключить интегрит-мониторинг (контроль изменений файлов/БД).
  • Настроить алерты (email/Slack) при изменениях ядра/тем/плагинов.

Шаг 7. Проверка индекса и разбан

  • Принудительно переиндексируйте сайт, удалите спам-URL через GSC → Подача на пересмотр (Reconsideration) после полной очистки.

Таблица: где искать и что исправлять

Зона Что искать Действие
ФС Папки, совпадающие с реальными URL Удалить/карантин, запрет записи
Темы/плагины functions.php, obfuscated/base64, eval/assert Очистить/удалить, обновить
БД (wp_options) Длинные base64-значения, «левые» опции Экспорт → удалить/исправить
Кэш wp-content/cache/*.dat Очистить, запретить выполнение PHP
Сервер Подозрительные rewrite/alias, .htaccess Вернуть корректные конфиги
Доступ Пароли/ключи/токены Полная смена, включить 2FA
Защита Нет WAF/мониторинга Включить WAF, FIM, алерты
Поиск Спам-страницы в индексе Удалить URL, переобход, reconsideration

Профилактика: как не попасть снова

  1. Минимум зависимостей: удалите неиспользуемые плагины/темы; ставьте только из проверенных источников.
  2. Авто-патчи и стейджинг: критические апдейты — быстро, фичи — через стенд.
  3. WAF + Bot Management: блочите подозрительные паттерны, L7-защита.
  4. FIM & DB-мониторинг: алерты на любые изменения в core/темах/плагинах/wp_options.
  5. Правильные права/структура: запрет исполнения PHP в uploads, cache; корректные владельцы/маски.
  6. Резервные копии: ежедневные бэкапы с оффсайт-хранением и периодическим тестовым восстановлением.
  7. Обучение команды: фишинг/доступы/секреты/API-ключи.

Частые вопросы (FAQ)

Почему в админке всё чисто, а в Google — казино?
Потому что подмена идёт на уровне сервера (теневые директории) до входа в WordPress.

Удалил код из functions.php, а спам вернулся. Почему?
Сработал механизм реинфекции. Ищите «триггеры» в плагинах и опциях БД.

Достаточно ли антивирусного плагина?
Нет. Нужна комбинация: ручной аудит ФС/БД, WAF, мониторинг целостности, правильные права, пароли, обновления.

Сколько ждать восстановления позиций?
После полной очистки и заявки на пересмотр — от нескольких дней до нескольких недель. Зависит от масштаба инфекции и доверия домена.


Чек-лист для устранения спама с сайта

  • Включить техработы/ограничить доступ
  • Снять бэкап текущего состояния
  • Проверить и удалить теневые директории
  • Очистить functions.php, плагины, кеш-файлы
  • Проверить/очистить wp_options от base64-опций
  • Обновить ядро/темы/плагины, удалить лишнее
  • Сменить все пароли, включить 2FA
  • Включить WAF и мониторинг изменений
  • Очистить индекс от спама, отправить на пересмотр

Экспресс-аудит для выявления поискового спама

1.0 Резервные копии и «карантин»

# Файлы
tar -czf /root/backup_site_$(date +%F).tgz /var/www/your-site
# БД
mysqldump -u USER -p'PASS' --single-transaction DBNAME > /root/backup_db_$(date +%F).sql

Временно ограничьте доступ (Basic Auth / IP allowlist) и добавьте Disallow: / в robots.txt на период работ.

1.1 Поиск «теневых директорий» (shadow directories)

cd /var/www/your-site

# Список «подозрительных» каталогов в веб-корне (кроме стандартных)
find . -maxdepth 2 -type d ! -path "./wp-*" ! -path "./wp-content" ! -path "./." \
  | egrep -vi "(^.$|^./(wp-admin|wp-includes|wp-content|.git|vendor|assets|images|static)$)"

# Любые .php в uploads/cache — красный флаг
find wp-content/uploads -type f -name "*.php"
find wp-content/cache   -type f -name "*.php" -o -name "*.dat"

# Свежесозданные файлы/папки за последние 7 дней
find . -type f -mtime -7 | egrep -i "\.(php|phtml|ico|js|dat)$"
find . -type d -mtime -7

1.2 Сигнатуры вредоносного кода

# Частые «триггеры»: eval/base64/assert/system и obfuscation
grep -R --line-number --binary-files=without-match -E \
'(base64_decode|eval\(|assert\(|preg_replace\(.*/e|shell_exec|system\(|passthru\(|gzuncompress|gzinflate|str_rot13)' \
wp-content | sed -n '1,200p'

# Особенно — functions.php всех активных тем
ls -1 wp-content/themes/*/functions.php | xargs -I {} grep -nH -E '(eval\(|base64_)' {}

1.3 Сверка целостности ядра и плагинов

# Установите wp-cli, если нужно; затем:
wp core verify-checksums
wp plugin list --update=available
wp theme  list --update=available

1.4 Быстрый аудит базы (wp_options и автозагрузка)

Замените {prefix} на реальный префикс (часто wp_).

-- Длинные Base64/обфускация в опциях
SELECT option_id, option_name, LENGTH(option_value) len
FROM {prefix}options
WHERE option_value REGEXP '^[A-Za-z0-9+/=]{300,}$'
   OR option_value LIKE '%base64%'
ORDER BY len DESC
LIMIT 200;

-- Подозрительные «тематические» псевдо-настройки
SELECT option_id, option_name, LEFT(option_value,200) val
FROM {prefix}options
WHERE option_name REGEXP '(footers|headers|logic|cache|style|stat|track)'
   OR option_name LIKE 'wp\_%\_logic'
ORDER BY option_id DESC
LIMIT 200;

-- Опции в автозагрузке, похожие на мусор
SELECT COUNT(*) c, SUM(LENGTH(option_value)) bytes
FROM {prefix}options WHERE autoload='yes';

SELECT option_id, option_name, LENGTH(option_value) len
FROM {prefix}options
WHERE autoload='yes' AND LENGTH(option_value) > 50000
ORDER BY len DESC
LIMIT 100;

1.5 Журналы и внешние вызовы

Проверьте логи на неожиданные домены/реквесты:

# Access log
grep -E "http|https" /var/log/nginx/access.log* | grep -iE "(casino|slot|bet|/wp-json/|/xmlrpc.php)"
# Error log
grep -iE "(eval|malware|php fatal|segmentation|permission)" /var/log/nginx/error.log*

Итог

Это не единичные случаи: массовое сканирование, аккуратные подмены, самовосстанавливающийся вредоносный код и ставка на вашу замедленную реакцию. Хорошая новость — этот сценарий предсказуем, а значит защищаем. Комбинируйте, аудит WP и БД, WAF, интегрит-мониторинг и оперативный IR-план — и ваши шансы остаться чистыми (и видимыми в поиске) резко вырастут.