«Казино-спам» на вашем сайте: как работает скрытый захват и что делать (полное руководство для 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 в базе.
Цепочка заражения:
- Первичный доступ → в
functions.phpтемы добавляется небольшой обфусцированный код. - Загрузка полезной нагрузки → из
wp_optionsизвлекается base64-payload (часто под видом опции вродеwp_footers_logic). - Исполнение → payload декодируется и запускается через
eval(); еслиeval()запрещён — создаётся кэш-файлwp-content/cache/style.datи оттуда исполняется. - Инъекция контента → при определённых запросах агент подтягивает спам-страницы с доменов атакующих и динамически встраивает в ответы.
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-clicore 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 |
Профилактика: как не попасть снова
- Минимум зависимостей: удалите неиспользуемые плагины/темы; ставьте только из проверенных источников.
- Авто-патчи и стейджинг: критические апдейты — быстро, фичи — через стенд.
- WAF + Bot Management: блочите подозрительные паттерны, L7-защита.
- FIM & DB-мониторинг: алерты на любые изменения в core/темах/плагинах/
wp_options. - Правильные права/структура: запрет исполнения PHP в
uploads,cache; корректные владельцы/маски. - Резервные копии: ежедневные бэкапы с оффсайт-хранением и периодическим тестовым восстановлением.
- Обучение команды: фишинг/доступы/секреты/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-план — и ваши шансы остаться чистыми (и видимыми в поиске) резко вырастут.
