Безопасность

Сайт на WordPress взломали: пошаговый план за вечер

МаксимИнженер по WordPress · 10+ лет с WordPress и WooCommerce14 мин чтения37 просмотров

Google пишет «вредоносное ПО», с телефона редирект на казино, в админке чужой пользователь. Спокойный план восстановления за вечер — не «установите антивирус на ПК».

В статье
  • Как понять, что сайт действительно взломан
  • План восстановления: 8 шагов за один вечер
  • Шаг 1. Внешняя проверка — 5 минут
  • Шаг 2. Снять «грязный» бэкап перед очисткой

Нужна помощь — аудит и очистка.

Сайт на WordPress взломали: пошаговый план за вечер

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

Как понять, что сайт действительно взломан

Признаки взлома WordPress
Search Console, редирект с 4G и чужие админы — три сигнала, с которых начинаем.

«Взломан» — это не только дефейс с турецким флагом во весь экран. В 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 часов спокойной работы. По шагам:

  1. Внешняя проверка (5 минут).
  2. Снять полный бэкап «как есть» (15 минут).
  3. Закрыть сайт от посетителей (5 минут).
  4. Сменить все пароли и ключи (20 минут).
  5. Найти и удалить вредоносные файлы (60–120 минут).
  6. Переустановить ядро, темы и плагины из чистых источников (30 минут).
  7. Проверить БД и пользователей (20 минут).
  8. Закрыть дыру, через которую вошли (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 (будете знать, что именно искать).

Сканирование сайта Sucuri SiteCheck
Sucuri SiteCheck за минуту показывает заражённые пути — до правок по FTP.

Шаг 2. Снять «грязный» бэкап перед очисткой

Главное правило: никогда не чистите без бэкапа заражённой версии. Если что-то пойдёт не так, или вирус окажется хитрее — вы сможете откатиться и попробовать другую тактику. Плюс «грязный» бэкап — это вещдок, если позже придётся разбираться с хостингом или платёжными системами.

Сделайте две копии:

  • Файлы — через FTP/SFTP или из панели хостинга (cPanel → File Manager → Compress). Должен получиться один .zip или .tar.gz со всем содержимым корневой папки.
  • База данных — через phpMyAdmin (Export → Quick → SQL) или mysqldump из консоли.

Скачайте оба файла к себе на компьютер, положите в папку backup-vzlom-YYYY-MM-DD/. Только теперь можно приступать к очистке.

Бэкап заражённого WordPress перед очисткой
Архив файлов + дамп БД «как есть» — обязателен до удаления малвари.

Шаг 3. Закрыть сайт от посетителей

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

Самый быстрый способ — добавить в начало .htaccess (Apache):

Закрытие сайта на время очистки вируса
503 на время очистки — поисковики не штрафуют за короткое техническое окно.
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. Сменить ВСЕ пароли и ключи

Смена паролей после взлома WordPress
Пароли FTP, БД, wp-config salt и всех админов — до удаления малвари.

Это надо сделать до того, как вы начнёте чистить файлы. Иначе атакующий, имея валидный логин админа, вернётся через 30 минут после вашей уборки.

Меняем в таком порядке:

  1. Пароль FTP/SFTP на хостинге — через панель управления. Сразу же отключите старые FTP-аккаунты, которые не используются.
  2. Пароль cPanel/ISPmanager/Plesk — основная учётка хостинга.
  3. Пароль пользователя БД — через панель хостинга → MySQL Users. После смены обновите DB_PASSWORD в wp-config.php.
  4. Соль в wp-config.php — сгенерируйте новые ключи на api.wordpress.org/secret-key/1.1/salt/ и замените блок из 8 строк AUTH_KEY, SECURE_AUTH_KEY и т.д. Это автоматически разлогинит всех текущих пользователей, включая злоумышленника.
  5. Пароли всех админов и редакторов WordPress — через Пользователи → Все. Удалите неизвестных вам пользователей с правами выше «Подписчик».
  6. Если был доступ через 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, чтобы вирус не успел перехватить процесс.

  1. Ядро WordPress. Скачайте свежую версию с ru.wordpress.org/download. Удалите на сервере папки wp-admin/ и wp-includes/ полностью. Закачайте на их место свежие из архива. Файлы в корне (index.php, wp-login.php, xmlrpc.php и т.д.) тоже замените — кроме wp-config.php и .htaccess.
  2. Темы. Удалите все темы, кроме активной. Активную — скачайте свежей версии (с официального магазина: Envato, ThemeForest, GitHub автора) и замените полностью. Если у вас были правки в дочерней теме — сравните каждый файл через diff (например, в VSCode) и перенесите только свои изменения.
  3. Плагины. Удалите папку wp-content/plugins/ целиком. Затем заново установите только те плагины, которыми реально пользуетесь, — из официального репозитория WordPress или с сайта вендора. Это лучший момент, чтобы выкинуть 3–5 плагинов, про которые вы давно забыли.
  4. mu-plugins. Загляните в wp-content/mu-plugins/ — если папка существует и вы не создавали её сами, удалите её полностью. mu-plugins подгружаются ядром без проверок — любимое место для бэкдоров.
  5. Загрузки (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 дней.

Поделиться: Telegram VK
Сложный случай?

Опишите ситуацию — поможем

Только WordPress. Если статья не закрыла вопрос — напишите, посмотрим конкретно ваш сайт.

Если есть — поможет быстрее оценить задачу.
Необязательно · до 10 МБ · PNG, JPG, PDF, ZIP
Удобный канал связи

URL сайта и краткое описание задачи. Чем больше деталей, тем точнее оценка.

Не передаём третьим лицам · Политика