Почему вирус на WordPress возвращается после удаления

VozniNet | Практическое руководство

Сайт очистили, защитный плагин больше не находит угроз, но через несколько часов подозрительный PHP-файл появляется снова. Иногда возвращается перенаправление на чужой сайт, а иногда проблема заметна только посетителям, которые приходят из поиска.

Скрытый источник заражения под слоями сайта вызывает новое повреждение внешне чистой страницы.

Повторное заражение WordPress обычно связано с одной из трёх причин: остался компонент, восстанавливающий вредоносный код; злоумышленник снова использует незакрытую уязвимость или действующий доступ; заражение возвращается из резервной копии либо другого сайта в том же аккаунте. Отдельно нужно проверить, действительно ли код появился заново: старую заражённую страницу может продолжать показывать кеш.

Ниже разбираем первые действия, проверку через панель хостинга и диагностику для администратора. Под «вирусом» подразумеваем вредоносный код, скрытый доступ, перенаправления и поисковый спам. Точную причину устанавливают по файлам, журналам и поведению сайта.

Раздел 01

Что сделать в первые 30 минут

Сначала ограничьте ущерб и сохраните данные для расследования. Если сайт перенаправляет посетителей на опасные страницы или есть признаки вмешательства в оплату, согласуйте с хостингом временную изоляцию сайта либо отключение пострадавшей функции. Ограничивать активную атаку нужно сразу, не дожидаясь полного выяснения причин.

  1. Зафиксируйте время и часовой пояс, адрес проблемной страницы, условия появления симптома, скриншоты и сообщения сканера. Запишите, какие файлы уже удаляли и какие действия предшествовали возвращению проблемы.
  2. Сохраните файлы, базу данных и доступные журналы в защищённом месте вне публичной папки сайта. Пометьте копию как заражённую: она нужна для анализа и не считается чистой резервной копией.
  3. Ограничьте посторонний доступ к панели WordPress, хостингу и средствам управления сервером. При захвате аккаунта восстанавливайте контроль вместе с провайдером через доверенное устройство.
  4. Проверьте, затронуты ли другие сайты, почта и интеграции в том же аккаунте. Для дальнейшего исследования подготовьте изолированную копию с контролируемым выполнением кода и сетевыми подключениями.
  5. Составьте список доступов для отзыва и перевыпуска: WordPress, панель хостинга, SSH/SFTP, база данных, почта, ключи API. Секреты, которые могли быть раскрыты во время очистки, потребуется заменить в доверенной среде.
Раздел 02

Как отличить повторное заражение от старых симптомов

Время и условия возвращения проблемы помогают выбрать первую проверку. Сами по себе они не доказывают определённый механизм.

Что наблюдаете Возможное объяснение Первая проверка
Файл возникает заново после запроса к сайту Оставшийся загрузчик либо продолжающаяся внешняя атака Сопоставить появление файла, запросы и точки запуска кода
Проблема возвращается по расписанию Запланированное задание или очередь Проверить WP-Cron, cron хостинга и фоновые задачи
Заражение возникает после восстановления Заражённый архив или незакрытый доступ Проверить копию, возвращённые компоненты и события после запуска
Редирект виден гостям, но не администратору Условное срабатывание или разные версии страницы в кеше Сравнить сеансы без авторизации и условия перехода
Файлы не меняются, но видна старая заражённая страница Кеш WordPress, сервера, CDN или браузера Сравнить актуальный ответ сервера и кеширующие слои

Если сохранилось только неправильное отображение страницы, сравните ответ исходного сервера и кеширующих слоёв с помощью администратора или поддержки. После фиксации симптомов очистите соответствующий кеш и повторите проверку. Возвращение файла на диске или вредоносной записи в БД требует отдельного расследования; кеш браузера такого изменения не объясняет.

Проверьте сайт без авторизации, с мобильного устройства и при переходе из поисковой выдачи. Некоторые заражения скрывают симптомы от администратора или реагируют на источник перехода. Отсутствие проблемы в одном сеансе не означает, что её нет у других посетителей.

Раздел 03

Почему WordPress заражается снова

Сохранился способ повторного проникновения

Вредоносный файл удалён, но уязвимый плагин, небезопасная загрузка файлов или украденные учётные данные остаются доступными атакующему. Он может заново записать код. Проверяют версии компонентов, разрешения, пользователей, активные сессии и интеграции с доступом к сайту.

Остался компонент восстановления

Один вредоносный компонент может создавать другой при открытии страницы, входе в админку или выполнении фоновой задачи. Копии и загрузчики размещают в плагинах, теме, настройках PHP и базе данных. Ранним загрузчиком называют код, который выполняется до обычных плагинов WordPress; его нужно учитывать, даже если список расширений выглядит чистым.

Заражена резервная копия или соседний проект

Код может возвращаться из архива, созданного после взлома, или из другой доступной установки: /old/, /backup/, тестового поддомена, забытой копии магазина. Если приложения имеют общую область записи, очистки одного каталога недостаточно. Проверять нужно весь затронутый аккаунт, включая устройства людей, управляющих им.

Три объёмные композиции: проникновение извне, скрытый источник внутри системы и заражённая сохранённая копия.
Заражение может вернуться при повторном проникновении, из оставшегося вредоносного кода или из заражённой копии.
Раздел 04

Проверка через панель хостинга без SSH

Владелец сайта может собрать сведения через файловый менеджер, phpMyAdmin и раздел запланированных заданий. Начинайте с сохранённой копии. В файловом менеджере включите показ скрытых файлов, иначе .user.ini и .htaccess могут быть не видны.

  • Запишите имя, путь и время изменения возвращающегося файла. Сохраните его для проверки, не открывая через URL.
  • Просмотрите корневой каталог и wp-config.php, папку wp-content/mu-plugins, специальные файлы в wp-content и пользовательские загрузки. Сначала выясните происхождение неизвестных объектов.
  • Проверьте список пользователей и задания в панели хостинга. При подозрении на скрытого администратора передайте специалисту копию БД: список внутри WordPress может быть подменён.
  • Найдите старые установки и тестовые поддомены. Уточните, какие из них используют тот же аккаунт и могут записывать файлы основного сайта.
  • Сохраните названия и версии тем и плагинов, сведения об обновлениях и использованной резервной копии.
Раздел 05

Где искать источник повторного заражения

Проверяют происхождение файла, его содержимое и способ запуска. Специальные файлы WordPress, называемые drop-in, подключают отдельные функции, например кеширование или работу с БД. Они могут принадлежать законному плагину или хостингу.

Где проверить Что установить
Корень сайта и wp-config.php Происхождение неизвестных файлов, изменений конфигурации и подключений стороннего кода.
wp-content/mu-plugins Назначение обязательных плагинов, которые загружаются автоматически, и подключаемых ими файлов.
db.php, advanced-cache.php, object-cache.php в wp-content Какой компонент создал каждый специальный файл и соответствует ли его код доверенной версии.
.user.ini, php.ini и .htaccess Неожиданные подключения PHP, правила обработки файлов и перенаправления.
Тема, дочерняя тема и сохранённые PHP-сниппеты Неутверждённые изменения и код, который выполняется из настроек или записей БД.
wp-content/uploads Назначение неизвестных исполняемых файлов, способ их появления и возможность запуска.
База данных и фоновые задания Неизвестных пользователей, опции, внедрённый контент, источники регистрации задач и вызываемые функции.
Старые установки и соседние сайты Общие права записи, доступные из интернета копии, уязвимые компоненты и общие секреты.
Раздел 06 · Для администратора

Пошаговая диагностика для администратора

Команды ниже предназначены для проверки собственного сайта. Примеры shell-команд рассчитаны на Linux и выполняются из корня установки WordPress. Путь и префикс таблиц нужно сверить с конкретной установкой. Команды не выполняют автоматическую очистку.

Шаг 1 Проверить ядро и отдельно конфигурацию сайта

Linux / WP-CLI · проверка
wp core verify-checksums

Команда сравнивает файлы ядра с официальными контрольными суммами и не загружает обычное окружение WordPress. Учитывайте версию и язык установленной сборки. Сообщение Success: WordPress installation verifies against checksums. подтверждает совпадение проверенных файлов с эталоном.

Сообщение File doesn't verify against checksum означает несовпадение, которое нужно исследовать. Причиной может быть внедрение кода, разрешённая доработка или неверно выбранный эталон. Сохраните файл и сравните изменения до замены.

Успешная проверка ядра не подтверждает чистоту всего сайта. Отдельно изучите wp-config.php: неожиданные include и require, посторонний код, изменения настроек и подключаемых путей. В некоторых установках этот файл расположен на уровень выше каталога WordPress. Не публикуйте его содержимое: там находятся секреты доступа.

Для плагинов из официального каталога на изолированной копии используйте:

Linux / WP-CLI · проверка
wp plugin verify-checksums --all

Если для плагина нет контрольных сумм, это означает отсутствие эталона для данной проверки. Платные и собственные плагины, темы и утверждённые доработки сравнивают с доверенными архивами или репозиторием. Отсутствие эталона нельзя засчитывать как успешную проверку.

Шаг 2 Проверить загрузки и специальные файлы

Linux / WP-CLI · проверка
find wp-content/uploads -type f \
  \( -iname '*.php' -o -iname '*.phtml' \) -print
find wp-content/mu-plugins -maxdepth 2 -type f -print
find wp-content -maxdepth 1 -type f \
  \( -name 'db.php' -o -name 'advanced-cache.php' \
  -o -name 'object-cache.php' \) -print

Первая команда показывает файлы с указанными расширениями в загрузках, вторая — содержимое обязательных плагинов в пределах выбранной глубины, третья — несколько специальных файлов WordPress. Если mu-plugins отсутствует, соответствующая команда сообщит об этом.

Для каждой находки выясните, кто её установил, откуда она запускается и какие другие объекты использует. Поиск ограничен перечисленными путями, расширениями и глубиной: пустой результат не исключает заражение в другом месте или под другим именем.

Шаг 3 Проверить раннюю загрузку PHP

Linux / WP-CLI · проверка
grep -RIn -E 'auto_prepend_file|auto_append_file' \
  --include='.user.ini' --include='php.ini' \
  --include='.htaccess' .

Команда ищет директивы, способные подключать код до или после основного PHP-скрипта. Результат содержит путь, номер строки и найденное значение. Исследуйте целевой файл и происхождение настройки; законное защитное ПО также может использовать такие механизмы.

Поиск из каталога сайта не охватывает все серверные настройки. Конфигурацию PHP-FPM, виртуального хоста и настройки вне этой папки проверяет администратор или хостинг. Значения .user.ini могут кешироваться: при удалении файла, который ещё указан в активной директиве, PHP-запросы могут завершаться ошибкой. Порядок отключения подключения и обновления конфигурации нужно согласовать с администратором.

Шаг 4 Сопоставить изменения с журналами

Linux / WP-CLI · проверка
find wp-content -type f -name '*.php' -mtime -7 -print

Команда выбирает PHP-файлы с временем изменения за последние семь суток. Сопоставьте список с обновлениями, развёртыванием сайта и восстановлением копий. Время файла можно подменить; штатное обновление, наоборот, меняет много законных объектов.

В журналах обращений ищут запросы к необычным PHP-путям, загрузки и обращения к административным маршрутам рядом со временем события. Запрос и запись файла, совпавшие по времени, ещё не доказывают причинную связь. Обычный access log не обязан показывать процесс, записавший файл; для этого может потребоваться системный аудит. Отсутствие записи в сохранившихся журналах не исключает атаку.

Шаг 5 Проверить базу данных и сохранённые сниппеты

Исследуйте копию БД напрямую через SQL-клиент или phpMyAdmin. Так можно проверить записи независимо от списка пользователей и меню, которые показывает потенциально скомпрометированный WordPress.

SQL · чтение данных
SELECT ID, user_login, user_registered
FROM wp_users
ORDER BY ID DESC;

Запрос выводит пользователей, но не определяет их права. Сверьте записи с утверждённым списком и проверьте метаданные полномочий в wp_usermeta; для Multisite учитывайте устройство сети. Префикс wp_ приведён как пример и может отличаться.

SQL · чтение данных
SELECT option_name, LENGTH(option_value) AS size_bytes
FROM wp_options
ORDER BY size_bytes DESC
LIMIT 30;

Вторая выборка показывает только 30 самых крупных параметров. Большие настройки часто законны, а небольшая вредоносная запись в эту выборку не попадёт. Используйте её как вспомогательную проверку вместе с поиском конкретных индикаторов, а не как проверку чистоты БД.

Изучите неизвестные опции, содержимое записей и метаданных, настройки активных плагинов. Если установлены средства управления PHP-сниппетами, проверьте сохранённый код и условия его исполнения. Наличие такого инструмента само по себе не свидетельствует о взломе.

Если удалённая учётная запись восстанавливается, расширенная проверка может включать триггеры БД — действия, автоматически выполняемые сервером базы при определённых событиях. Их назначение и права проверяет специалист. Не запускайте найденные фрагменты кода и не передавайте выгрузки с секретами в публичные сканеры.

Шаг 6 Проверить фоновые задания

На изолированной копии с контролируемым запуском WordPress:

Linux / WP-CLI · проверка
wp cron event list --fields=hook,next_run_gmt,recurrence

Поле hook содержит имя события, next_run_gmt — ближайшее время выполнения в GMT, recurrence — сведения о повторении. Для неизвестного события установите, какой компонент его зарегистрировал и какую функцию оно вызывает. Незнакомое имя не является основанием для удаления.

Отдельно проверьте cron в панели хостинга, пользовательский crontab и фоновые очереди приложений. WP-Cron и системный cron — разные механизмы. После отключения одного другой может продолжать выполнять код без посещения сайта человеком.

Шаг 7 Проверить способы первоначального доступа

Сверьте версии WordPress, тем, плагинов и PHP с поддерживаемыми версиями и сообщениями разработчиков об уязвимостях. Проверьте отключённые расширения, старые установки, API-интеграции и права записи. Небезопасный компонент может оставаться доступным даже после очистки основных файлов.

Проверьте пользователей WordPress, хостинг, SSH/SFTP, почту администратора, доступы к БД и устройства сотрудников. Результат диагностики должен отделять подтверждённую точку входа от предположений. Удаление обнаруженного файла не закрывает оставшийся путь загрузки нового кода.

Раздел 07

Как удалить заражение и восстановить сайт

Если компоненты восстанавливают друг друга, удаление отдельных файлов при продолжающемся выполнении заражённого кода может не дать результата. Работы проводят после сохранения материалов расследования и ограничения вредоносной активности.

Точный инструмент извлекает красный источник из многослойной системы, а очищенные компоненты проходят проверку.
Очистка включает поиск источника, устранение причины и проверку восстановленного сайта.
  1. Определите границы инцидента. Установите, затронуты ли только файлы сайта или также БД, соседние проекты, аккаунт хостинга и сервер.
  2. Остановите обнаруженные способы запуска. Учитывайте ранние подключения PHP, обязательные плагины, тему и фоновые задания. Для магазина заранее согласуйте порядок обслуживания и сохранения текущих заказов.
  3. Удалите связанные компоненты и хранилища вредоносного кода. Одновременно проверьте записи БД, неизвестные аккаунты и задания. При подтверждённых признаках закрепления в общей памяти или системных процессах подключите администратора сервера.
  4. Восстановите компоненты из доверенных источников и закройте выявленные уязвимости. Не переносите неизвестные файлы и настройки в новую установку автоматически. Сохраните необходимые законные доработки после проверки.
  5. Отзовите раскрытые пароли, ключи и токены, завершите старые сессии. Выполняйте замену через доверенные устройства. Если секрет использовался в ещё заражённой среде, считайте возможным его повторное раскрытие.
  6. Проверьте сайт на изолированной копии: вход, формы, оплату, письма, API, фоновые задачи и перенаправления. После очистки обновите нужные кеши и повторите проверку как обычный посетитель.
  7. Верните сайт в работу с контролем файлов, учётных записей и журналов. Сохраните возможность восстановления проверенной конфигурации и список выполненных изменений.
Раздел 08

Как выбрать резервную копию после взлома

Используйте проверенную чистую копию с подходящей точкой восстановления. Обычно стремятся выбрать наиболее свежую подтверждённо чистую копию до компрометации, чтобы сократить потерю данных. Дата первого видимого симптома не равна дате проникновения, а самый старый архив не становится безопасным автоматически.

Восстановите выбранную копию отдельно, проверьте файлы, БД, пользователей и задания. До возврата сайта закройте уязвимость, через которую могла произойти атака, и обновите нужные компоненты. Для магазина отдельно спланируйте перенос заказов и других изменений после даты архива, проверяя их целостность.

Раздел 09 · Кейс VozniNet

Как мы устранили возвращающийся редирект на сайт казино

В одном из проектов VozniNet посетителей сайта перенаправляло на ресурс онлайн-казино. После очистки кода сайт снова выглядел исправным, но затем перенаправление возвращалось. Найти источник проблемы помогла проверка журналов событий.

Почему первоначальной очистки оказалось недостаточно

Мы очищали код, после чего нежелательный переход исчезал. Однако этот результат был временным: позднее редирект возникал снова. Повторение показало, что выполненная очистка не устранила проблему полностью. Нужно было выяснить, где и когда происходили действия, связанные с возвращением перенаправления.

Как помог анализ журналов

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

По результатам проверки мы локализовали источник и выполнили дополнительную очистку. На этом этапе работа уже опиралась на сведения из журналов, которые помогли определить, что требовало устранения. Именно этой информации не хватало при первоначальной очистке кода.

Оптическая линза над пластинами журнала событий помогает проследить красный путь к источнику перенаправления на сайте.
В описанном случае анализ журналов помог локализовать источник возвращающегося перенаправления.

Что изменилось после устранения источника

После очистки выявленного источника проблему с перенаправлением на казино удалось устранить. В этом случае решающим шагом стал анализ логов: он помог связать повторяющийся симптом с действиями на сайте и найти участок, который требовал дополнительной проверки.

Раздел 10

Как проверить результат очистки

Проверка должна охватывать как признаки заражения, так и обычную работу сайта. Результаты фиксируют вместе с ограничениями: какие компоненты проверены, где нет эталона и какие журналы недоступны.

Область проверки Что подтвердить
Файлы и конфигурация Ядро сверено с эталоном; темы, плагины, специальные файлы и настройки проверены с учётом законных доработок.
База данных и задачи Выявленные внедрения и неизвестные доступы устранены; оставшиеся задания имеют подтверждённое назначение.
Способы проникновения Найденные уязвимости закрыты, раскрытые секреты отозваны, старые сессии прекращены. Неустановленные обстоятельства перечислены отдельно.
Работа сайта Проверены вход, формы, оплата, письма и интеграции; законные функции сохранились.
Повторное появление Вредоносные компоненты не восстанавливаются после проверяемых запросов и фоновых циклов; контроль изменений продолжается.
Посетители и поиск Проверены гостевые сеансы, мобильные переходы, кеши, значимые URL и отчёты Search Console.
Раздел 11

Что проверить в Google после взлома

После технической очистки нужно убрать последствия поискового спама и убедиться, что полезные страницы доступны для обхода. Изменение показов и кликов помогает оценить ущерб, но не подтверждает чистоту сервера.

  • Проблемы безопасности. Изучите замечания в Google Search Console. Если они есть, запросите проверку после устранения причин и заражённых объектов. Отсутствие предупреждения не заменяет собственную диагностику.
  • Меры, принятые вручную. Проверьте этот отчёт отдельно: он отличается от проблем безопасности. Если мера применена, выполните требования соответствующего уведомления.
  • Спамные URL. Адреса удалённых страниц, созданных атакующим и не имеющих полезной замены, обычно должны возвращать 404 или 410. Не перенаправляйте их массово на главную. Полезные страницы очищают и восстанавливают с корректным содержимым и ответом 200.
  • Условия индексирования. Проверьте robots.txt, noindex, canonical, Sitemap и внутренние переходы. Удалите внесённые злоумышленником ограничения, подмены и спамные адреса. Один запрет обхода в robots.txt не является способом гарантированно убрать URL из поиска.
  • Содержимое и перенаправления. Проверьте заголовки, описания, текст и маршруты переходов. Различайте текущий ответ сайта и старые сведения в выдаче, которые ещё не обновились после повторного обхода.
  • Результат восстановления. Проверьте важные URL и наблюдайте за индексированием, показами и кликами по страницам и запросам. Зафиксируйте дату очистки, чтобы сопоставлять изменения с дальнейшей динамикой.

Если после очистки остаются проблемы с индексированием и доступностью страниц, их проверяют в рамках технического SEO-аудита. Пример состава такой работы — технический аудит сайта на 162 URL.

Раздел 12

Как снизить риск нового взлома

Поддерживайте WordPress, темы, плагины и серверное ПО на поддерживаемых версиях. Удаляйте ненужные расширения и старые установки, которые доступны из интернета. При изменении версии PHP заранее проверяйте совместимость сайта и интеграций.

Используйте индивидуальные аккаунты, минимально необходимые права и двухфакторную проверку для административного доступа. Разделяйте права записи и секреты разных проектов. Где это совместимо с сайтом, ограничьте исполнение PHP в каталогах пользовательских загрузок.

Храните резервные копии отдельно от публичных каталогов и регулярно проверяйте восстановление. Настройте уведомления об изменениях важных файлов, неизвестных администраторах и заданиях. Защитный плагин и WAF дополняют эти меры; правила защиты нужно проверять на ошибочные блокировки посетителей, платёжных интеграций и поисковых роботов.

Раздел 13

Вопросы о повторном заражении WordPress

Почему Wordfence не находит угроз а проблема остаётся

Результат зависит от охвата и возможностей проверки. Компонент может находиться вне просматриваемых путей, в БД или конфигурации, либо не распознаваться текущими правилами. Дополнительно проверьте, не показывает ли кеш старую заражённую страницу. Причину устанавливают сопоставлением нескольких признаков.

Поможет ли переустановка WordPress

Переустановка ядра не обязательно затрагивает wp-content, wp-config.php, БД, задания хостинга и доступы. Если источник находится там, заражение может вернуться. Объём восстановления определяют по границам инцидента.

Почему после удаления снова появляется администратор

Учётную запись может создавать оставшийся код, задача или новый запрос через действующий доступ. При соответствующих признаках проверяют и триггеры БД. Нужны прямое исследование таблиц, поиск механизма создания и проверка журналов; одного удаления пользователя недостаточно.

Почему смена пароля не остановила заражение

Могли сохраниться другие аккаунты, ключи API, активные сессии или доступ через хостинг. Вредоносный код внутри сайта также может работать без повторного входа по паролю. Проверять нужно весь затронутый набор доступов и способов запуска.

Нужно ли удалять обязательные плагины и файлы загрузок

Нет. В этих каталогах могут находиться обязательные функции хостинга и законные медиафайлы. Сначала сохраните копию и проверьте происхождение объектов. Удаляйте подтверждённые вредоносные компоненты с учётом зависимостей сайта.

Можно ли считать сайт безопасным через три дня после очистки

Три дня без симптомов — результат наблюдения за конкретным периодом. Для завершения работ нужны проверенные компоненты и доступы, устранённые выявленные способы проникновения, испытания фоновых задач и дальнейший мониторинг.

Раздел 14 · Помощь с сайтом

Когда обращаться за диагностикой WordPress

Если вредоносный файл появляется снова, источник запуска неизвестен или затронуты платежи и учётные записи, требуется проверка файлов, БД и окружения хостинга. Полезный результат такой работы — перечень подтверждённых находок, выполненных исправлений и контрольных проверок с указанием оставшихся ограничений.

Для первичной оценки в VozniNet пришлите адрес сайта, описание симптомов, время их появления, сведения о хостинге и список уже выполненных действий. Доступы согласовываются отдельно; пароли, архивы и журналы с персональными данными не отправляйте через публичные формы.

Связанные материалы: обновление PHP сайта и разбор ошибки 503 в WordPress. Ошибка 503 сама по себе не доказывает заражение.