Письмо из Google Search Console в пятницу вечером, а в понедельник реклама ведёт на домен с редиректом на казино — так начинается типичный вечер восстановления. В практике 9 из 10 взломов тихие: витрина жива, а в фоне спам и doorways. Ниже — план на 3–5 часов без паники.
Как понять, что сайт действительно взломан

«Взломан» — это не только дефейс с турецким флагом во весь экран. В 9 случаях из 10 заражение тихое: сайт работает, продаёт, выглядит как обычно, но в фоне раздаёт спам, редиректит мобильных пользователей на казино, или показывает в выдаче Google посторонние страницы про виагру и казахские дипломы. Если видите хотя бы один признак из списка ниже — действуйте по этому плану, не откладывая на завтра.
- Google Search Console прислал письмо «Обнаружено вредоносное ПО» или «Этот сайт может быть взломан».
- В выдаче рядом с Вашим доменом всплыли страницы вроде
/wp-content/uploads/2019/cheap-jerseys.htmlили японские/китайские иероглифы в title. - Хостинг прислал уведомление о превышении CPU, рассылке спама с домена или подозрительных процессах.
- С мобильного через 4G сайт редиректит на сторонний URL, а с десктопа — открывается нормально (классика «cloaking»-вирусов).
- В админке появились незнакомые пользователи с правами Administrator.
- Антивирус браузера (Касперский, Защитник Windows, Safe Browsing) блокирует доступ к сайту.
- Сайт стал тормозить без видимой причины, а в логах PHP — десятки запросов к
eval(),base64_decode(),gzinflate().
Если хотя бы одно «да» — переходите к плану. Если сомневаетесь — пройдите шаг 1, он бесплатный и занимает 5 минут.
План восстановления: 8 шагов за один вечер
Общее время — 3–5 часов спокойной работы. По шагам:
- Внешняя проверка (5 минут).
- Снять полный бэкап «как есть» (15 минут).
- Закрыть сайт от посетителей (5 минут).
- Сменить все пароли и ключи (20 минут).
- Найти и удалить вредоносные файлы (60–120 минут).
- Переустановить ядро, темы и плагины из чистых источников (30 минут).
- Проверить БД и пользователей (20 минут).
- Закрыть дыру, через которую вошли (30 минут).
Шаг 1. Внешняя проверка — 5 минут
Прежде чем лезть в файлы, проверьте сайт снаружи. Это бесплатно и покажет масштаб бедствия.
- Sucuri SiteCheck (sitecheck.sucuri.net) — вбейте домен, через 30 секунд получите список найденных вредоносов и заражённых файлов.
- Google Safe Browsing (
transparencyreport.google.com/safe-browsing/search) — покажет, попал ли сайт в чёрный список Google. - Search Console → Безопасность и ручные меры — официальная позиция Google по вашему домену.
- Откройте сайт с мобильного через инкогнито и 4G (не Wi-Fi!) — половина современных вирусов прячется именно от Wi-Fi-IP и десктопных User-Agent.
- В поиске Google вбейте
site:Вашдомен.руи пролистайте 5–10 страниц. Если среди результатов есть страницы, которых вы не создавали — это «doorway»-вирус.
Зафиксируйте результаты в текстовом файле — пригодятся для шага 5 (будете знать, что именно искать).

Шаг 2. Снять «грязный» бэкап перед очисткой
Главное правило: никогда не чистите без бэкапа заражённой версии. Если что-то пойдёт не так, или вирус окажется хитрее — вы сможете откатиться и попробовать другую тактику. Плюс «грязный» бэкап — это вещдок, если позже придётся разбираться с хостингом или платёжными системами.
Сделайте две копии:
- Файлы — через FTP/SFTP или из панели хостинга (cPanel → File Manager → Compress). Должен получиться один
.zipили.tar.gzсо всем содержимым корневой папки. - База данных — через phpMyAdmin (Export → Quick → SQL) или
mysqldumpиз консоли.
Скачайте оба файла к себе на компьютер, положите в папку backup-vzlom-YYYY-MM-DD/. Только теперь можно приступать к очистке.

Шаг 3. Закрыть сайт от посетителей
Пока сайт заражён — каждый посетитель получает дозу вируса, а Ваша репутация в Google падает быстрее, чем вы успеваете очистить сайт. Закройте сайт на 503 (временно недоступен) — поисковики не накажут, если 503 продержится день-два.
Самый быстрый способ — добавить в начало .htaccess (Apache):

RewriteEngine On
RewriteCond %{REMOTE_ADDR} !^123\.45\.67\.89$
RewriteCond %{REQUEST_URI} !\.(css|js|png|jpg|svg)$
RewriteRule ^(.*)$ /maintenance.html [R=503,L]
ErrorDocument 503 /maintenance.html
Header always set Retry-After "86400"
Где 123.45.67.89 — ваш IP (узнать на 2ip.ru). В maintenance.html в корне сайта — простая страница «Технические работы, вернёмся в течение суток».
Если используете Nginx — спросите хостинг, как им включить maintenance, либо временно смените DNS на «заглушку».
Шаг 4. Сменить ВСЕ пароли и ключи

Это надо сделать до того, как вы начнёте чистить файлы. Иначе атакующий, имея валидный логин админа, вернётся через 30 минут после вашей уборки.
Меняем в таком порядке:
- Пароль FTP/SFTP на хостинге — через панель управления. Сразу же отключите старые FTP-аккаунты, которые не используются.
- Пароль cPanel/ISPmanager/Plesk — основная учётка хостинга.
- Пароль пользователя БД — через панель хостинга → MySQL Users. После смены обновите
DB_PASSWORDвwp-config.php. - Соль в
wp-config.php— сгенерируйте новые ключи на api.wordpress.org/secret-key/1.1/salt/ и замените блок из 8 строкAUTH_KEY,SECURE_AUTH_KEYи т.д. Это автоматически разлогинит всех текущих пользователей, включая злоумышленника. - Пароли всех админов и редакторов WordPress — через
Пользователи → Все. Удалите неизвестных вам пользователей с правами выше «Подписчик». - Если был доступ через GitHub/Bitbucket — отзовите токены деплоя.
Шаг 5. Найти и удалить вредоносные файлы
Самая ёмкая часть. Подключитесь по SSH, если есть. Если нет — через FTP-клиент с возможностью поиска (FileZilla → плагин File Search, либо Total Commander).
5.1. Стандартные «маркеры» заражения
Через SSH запустите эти команды в корне сайта (всё в одной строке):
find . -name "*.php" -newer wp-config.php -print
find . -name "*.php" -mtime -30 -print
grep -rEl "eval\s*\(base64_decode|gzinflate\s*\(base64|str_rot13\s*\(" .
grep -rEl "@?\\\$_(POST|GET|REQUEST|COOKIE)\s*\[.*\]\s*\(" .
Что показывают команды:
- Первая — все PHP-файлы, изменённые позже, чем
wp-config.php. Если вы давно не правили config, то всё «свежее» — подозрительно. - Вторая — все PHP, изменённые за последние 30 дней.
- Третья — классические обфускации:
eval(base64_decode(…)),gzinflate,str_rot13. 99% бэкдоров используют одну из этих конструкций. - Четвёртая — паттерн
$_POST['x']($_POST['y'])— типичная «маленькая шелл-команда» в одну строку.
5.2. Где они обычно прячутся
wp-content/uploads/— здесь PHP-файлов быть не должно вообще. Любой.phpвнутри uploads — вирус.wp-content/plugins/в папках, которых нет в админке (например,wp-content/plugins/zzzz/,wp-content/plugins/.cache/).wp-includes/— файлы вродеwp-vcd.php,class-wp-cache.php(с подделкой под ядро).- Файлы с маскировкой:
wp-config-backup.php,wp-login.bak.php,license.phpв плагинах,.htaccessвнутриuploads. - Внедрения в
functions.phpтемы (часто в самом конце или после?>). - Внедрения в
index.phpиwp-load.php— обычно одна-две строки в начале файла.
5.3. Что НЕ чините — заменяйте
Заражённые файлы ядра WordPress, тем и плагинов не «чистят» — их удаляют целиком и ставят заново из чистого источника. Это шаг 6.
Шаг 6. Переустановить ядро, темы и плагины
Заходить в админку для этого не нужно — всё делается по FTP, чтобы вирус не успел перехватить процесс.
- Ядро WordPress. Скачайте свежую версию с ru.wordpress.org/download. Удалите на сервере папки
wp-admin/иwp-includes/полностью. Закачайте на их место свежие из архива. Файлы в корне (index.php,wp-login.php,xmlrpc.phpи т.д.) тоже замените — кромеwp-config.phpи.htaccess. - Темы. Удалите все темы, кроме активной. Активную — скачайте свежей версии (с официального магазина: Envato, ThemeForest, GitHub автора) и замените полностью. Если у вас были правки в дочерней теме — сравните каждый файл через diff (например, в VSCode) и перенесите только свои изменения.
- Плагины. Удалите папку
wp-content/plugins/целиком. Затем заново установите только те плагины, которыми реально пользуетесь, — из официального репозитория WordPress или с сайта вендора. Это лучший момент, чтобы выкинуть 3–5 плагинов, про которые вы давно забыли. - mu-plugins. Загляните в
wp-content/mu-plugins/— если папка существует и вы не создавали её сами, удалите её полностью. mu-plugins подгружаются ядром без проверок — любимое место для бэкдоров. - Загрузки (uploads). Здесь оставляем медиа, но удаляем все
.php,.phtml,.html,.htaccessфайлы. И сразу запрещаем выполнение PHP в этой папке — кладём.htaccessвwp-content/uploads/:
<Files *.php>
Require all denied
</Files>
Шаг 7. Проверить базу данных и пользователей
Файлы вы почистили, но вирус мог оставить «закладки» в БД. Через phpMyAdmin откройте таблицы и проверьте:
wp_users— все логины и email. Подозрительных удаляйте (черезПользователи → Всев админке, не SQL-запросом — нужны связанные правки вwp_usermeta).wp_usermetaс ключомwp_capabilities— найдите всех, у кого значение содержитadministrator. Их должно быть ровно столько, сколько вы знаете.wp_options, опцияsiteurlиhome— должны быть ваш домен, без чужих доменов и постфиксов.wp_options, опцияactive_plugins— массив с путями к плагинам, которых вы только что установили заново. Лишних быть не должно.- В
wp_postsсделайте SQL-запрос:
Если что-то нашлось — открывайте каждую запись и чистите.SELECT ID, post_title, post_status FROM wp_posts WHERE post_content LIKE '%<script%' OR post_content LIKE '%eval(%'; - Запланированные задачи WP-Cron. Поставьте плагин WP Crontrol и пройдитесь по списку хуков. Любой незнакомый хук с именем вроде
wp_check_hash_action,nullbyte_hook,cleaner_task— это бэкдор, который восстанавливает файлы вируса даже после вашей очистки.
Шаг 8. Закрыть дыру, через которую вошли
Если этого не сделать — через неделю всё повторится. В 95% случаев вход был через одну из этих дверей:
- Слабый пароль админа. Решается длинным паролем (16+ символов) + двухфакторкой (плагин WP 2FA или Wordfence Login Security).
- Уязвимый плагин/тема устаревшей версии. Зайдите на wpscan.com, вбейте имя плагина и сравните с вашей версией. Все плагины — на самые свежие версии, заброшенные (нет апдейтов больше 2 лет) — удалите.
- Брутфорс
/wp-login.phpили/xmlrpc.php. Закройте XML-RPC, если не используете (плагин Disable XML-RPC), а наwp-login.phpпоставьте лимит попыток (Limit Login Attempts Reloaded). - Дыра в кастомной теме. Если делал фрилансер «по дешёвке» — проверьте загрузку файлов, AJAX-endpoint'ы, обработку
$_GET/$_POSTбезesc_*иwp_verify_nonce. - Скомпрометированный компьютер админа. Если на вашем ПК есть троян, ворующий пароли FTP, — никакая чистка сайта не спасёт. Прогоните Malwarebytes + Kaspersky Rescue Disk, и только потом меняйте пароли.
После закрытия дыры — поставьте один (только один!) комплексный плагин безопасности: Wordfence, Sucuri Security или iThemes Security. Сразу включите файервол, сканер целостности файлов и нотификации на email.
Шаг 9. Снять блокировку и попросить пересмотр
После того как Sucuri SiteCheck показал «чисто», уберите maintenance-редирект из .htaccess. И если сайт был помечен Google как опасный:
- Search Console → Безопасность и ручные меры → Запрос на проверку. Опишите, что именно сделали (бэкап, чистка файлов, переустановка ядра, смена паролей, закрытая уязвимость). Обычно Google снимает пометку за 24–72 часа.
- Если попали в Yandex Webmaster → раздел «Безопасность и нарушения» — там тоже есть кнопка «Перепроверить».
- Если хостинг блокировал сайт за рассылку спама — напишите в поддержку с тем же отчётом.
Чек-лист «после взлома», чтобы не повторилось
- Автообновления ядра WordPress включены (
define('WP_AUTO_UPDATE_CORE', true);вwp-config.php). - Минор-обновления плагинов — автоматом, мажорные — раз в неделю с предварительным бэкапом.
- Бэкапы раз в сутки, хранятся в облаке (не на том же хостинге!). Подходят UpdraftPlus + Google Drive, BackWPup + Яндекс.Диск, либо встроенные бэкапы хостинга с выгрузкой наружу.
- Запрет на выполнение PHP в
uploadsпрописан (см. шаг 6). - На
wp-login.phpстоит лимит попыток + двухфакторка для админов. - В
wp-config.phpзапрещено редактирование файлов из админки:define('DISALLOW_FILE_EDIT', true);. - Раз в месяц — внешняя проверка через Sucuri SiteCheck (можно поставить мониторинг с уведомлением на email).
- Список плагинов раз в квартал — ревизия. Всё, что не использовалось 3 месяца — удалить.
Когда лучше не делать самому
Если хотя бы один из пунктов про вас — зовите специалиста, не теряйте время:
- Сайт коммерческий, простой стоит больше 10 000 ₽ в сутки — каждый час «методом тыка» окупит работу профи.
- Заражение возвращается после чистки 2–3 раз подряд — значит бэкдор сидит в неочевидном месте (БД, cron, кастомный плагин, mu-plugins).
- Платёжный шлюз заблокировал приём оплат из-за вируса — нужен официальный отчёт о санации.
- Сайт — интернет-магазин с персональными данными покупателей. По 152-ФЗ вы обязаны установить факт утечки и уведомить Роскомнадзор в течение 24 часов с момента обнаружения.
Если хотите, чтобы ваш сайт привели в порядок «под ключ»: чистый аудит, удаление вируса, закрытие дыры и настройка защиты от повторного заражения — посмотрите услугу «Безопасность WordPress» или напишите в Контактах. Восстановление в среднем — 4–8 часов, гарантия на повторное заражение — 30 дней.



