Сайт заражён вирусом: что делать владельцу

Если сайт заражён, владельцу нужно сделать три вещи: снять полную копию файлов и базы данных, ничего не удалять в админке самому и передать сайт специалисту. Чистка без поиска механизма, который восстанавливает заразу, бесполезна — файлы возвращаются за секунды. Точка входа обычно одна: устаревший или пиратский плагин.
Сайт этой управляющей компании мы делали несколько лет назад. Потом он жил сам по себе: без сопровождения, без нас. А недавно клиент написал мне снова — сайт стал вести себя странно. Ни договора, ни абонентки между нами не было. Я никуда не делся, так что разбираться пошли вместе.
Дальше — то, что из этой истории пригодится вам, если вы сейчас гуглите то же самое. Без советов «зайдите на сервер»: вы не обязаны в этом разбираться. Разбираться должен тот, кому вы отдадите сайт. Ваша задача проще — не сделать хуже и понять, правильно ли его чинят.
Насколько всё плохо, если сайт заражён?
Обычно хуже, чем кажется по симптомам. В этом случае нашлось около 600 вредоносных файлов: программы для удалённого доступа, генераторы спам-страниц, скрипты загрузки новой заразы, закладка в настройках сервера и посторонний администратор в базе. Следы уходили на несколько лет назад. При этом контент — тексты страниц и настройки — оказался цел.
Вот это и есть главное, что стоит понять про заражение: оно почти никогда не бывает свежим.
Владелец замечает проблему, когда сайт начал перебрасывать посетителей на чужие страницы или выпал из поиска. А внутрь зашли давно — здесь следы уходили на годы. Всё это время сайт спокойно работал, показывал клиентам телефон и параллельно рассылал спам.
Отдельная неприятность: в системе лежал файл со списком паролей от баз нескольких сайтов. Открытым текстом. Все их пришлось считать утёкшими.
Хорошая новость тоже есть, и она важная. Зараза жила в файлах, а не в текстах страниц: контент, картинки и настройки в базе были чистыми. Позже это сильно помогло — восстанавливать было из чего.
Что нельзя трогать самому, чтобы не сделать хуже?
Ничего не удалять до того, как снята полная копия файлов и базы. Самая дорогая ошибка — удалить лишнего пользователя: WordPress спросит, удалить его материалы или передать другому автору, и невнимательный ответ отправит страницы в корзину. Чистить файлы по одному тоже бессмысленно: пока работает механизм восстановления, они вернутся.
Про эту ошибку расскажу на себе, потому что сделал её сам — уже под конец, когда основное было позади.
В базе было два администратора. Один — стандартный admin, самый предсказуемый логин, который перебирают первым. Удалить его — мысль правильная. WordPress спросил: удалить материалы пользователя или передать другому автору. Я не придал вопросу значения.
Через минуту от сайта осталось 6 страниц из тридцати с лишним. Главная слетела — вместо неё показывалась случайная запись. Из меню пропала половина пунктов. Следом выяснилось, что уехали и медиафайлы: почти 200 штук, включая баннер и PDF-отчёты.
Секунду я сидел с мыслью, что своими руками угробил то, что мы восстанавливали часами…
Спасли две вещи. Копия, снятая в самом начале. И то, что WordPress не стирает страницы насмерть, а кладёт в корзину — все 30 нашлись там и вернулись штатной кнопкой, с прежними адресами, так что ссылки в меню снова заработали. Медиа подняли из копии. Потерь — ноль.
Вывод обидно простой: если WordPress при удалении о чём-то спрашивает — прочитайте вопрос. А лучше не удаляйте ничего, пока сайт не в порядке и пока нет копии.

Антивирус-плагин или ручной разбор — чем лечить?
Плагин-сканер помогает заметить заражение, но при массовом заражении его недостаточно: он не видит процесс, который восстанавливает файлы, и не закрывает точку входа. Надёжнее сравнение с эталоном — взять официальные версии ядра, плагинов и темы и найти все отличия. Любое расхождение в системных файлах становится кандидатом на заражение.
| Плагин-сканер | Разбор с эталоном | |
|---|---|---|
| Что находит | Известные ему сигнатуры | Любое отличие от официальной версии |
| Механизм восстановления | Не видит | Находит проверкой |
| Точка входа | Не закрывает | Закрывает |
| Когда хватает | Свежая одиночная зараза | Массовое и давнее заражение |
Просить «найди вирусы» — плохая идея. А что искать-то?
Файлы ядра WordPress, официальных плагинов и тем — стандартные, их чистые версии лежат в открытом доступе. Берём эталон той же версии, сравниваем — и всё, что отличается, попадает под подозрение. Метод скучный, зато почти без ложных срабатываний.
Скажу честно: руками я эту работу не делал. Разбирал сайт с ИИ-агентом в терминале — он читал файлы, сравнивал с эталонами, искал следы. Всё, что удаляет или меняет, я смотрел сам, прежде чем разрешить. Инструмент хороший, но кнопки «почини» там нет: агент делает ровно то, что ему поставили.
Как понять, что сайт чистят правильно?
Правильная чистка идёт в жёстком порядке: полная копия до любых действий, анализ без запуска подозрительных файлов, поиск механизма восстановления, чистка, закрытие точки входа, смена всех паролей и ключей. Если подрядчик начинает с удаления файлов и не может объяснить, откуда зараза возвращается, работа сделана наполовину.
Вы не обязаны разбираться в устройстве заразы. Но четыре вопроса задать можете, и по ответам сразу видно, кто перед вами.
Копия снята до того, как вы что-то тронули? Если нет — стоп. Копия нужна дважды: как эталон для сравнения и как страховка. Меня она спасла именно во втором качестве.
Нашли, откуда зараза возвращается? Вот главный вопрос. У нас часть файлов удалялась нормально, а несколько ключевых возвращались за секунды. На сервере сидел «сторож».
Искали мы его дольше, чем чистили всё остальное. Проверили расписание задач — пусто. Проверили, не возвращаются ли файлы от захода на сайт: удалили и не заходили. Вернулись всё равно. Значит, на сервере что-то работает постоянно, само по себе.
Так и оказалось: три вредоносных процесса висели в памяти сервера часами и жрали ресурсы. Их запустили когда-то давно, и они просто жили — без расписания, без автозапуска. Поэтому обычные проверки их и не находили. Остановили — и контрольная проверка: удаляю файл, жду. Не вернулся.
Вот с этой секунды чистка вообще имеет смысл. До неё — нет.
Точку входа закрыли? Вычистить и оставить дыру — значит заразиться снова. Про неё ниже.
Пароли сменили все? Хостинг, сервер, база, администраторы. При таком заражении они почти наверняка утекли, и старый пароль — это открытая дверь.
Почему сайт заразился и как не поймать снова?
Точкой входа оказался пиратский платный плагин. Такие плагины не лечатся: вредоносный код часто вшит в них изначально, поэтому вариантов два — легальная версия или удаление. Второй постоянный источник риска — устаревшие версии. Сайт годами обрастает плагинами, каждый стареет, и однажды через один из них заходят.
Весь дизайн сайта держался на платном плагине-конструкторе. Пиратском. Он же, судя по всему, и был дырой.
Кто и когда его поставил — теперь не установить. За годы через сайт проходит много рук, и это обычная история, а не чья-то вина. Важно другое: почистить такой плагин нельзя. Только убрать.
Убрали — и сайт открылся голым текстом без вёрстки. Дизайн-то держался на нём. Покупать лицензию клиент не планировал, так что дизайн пересобрали на бесплатных аналогах: данные вёрстки в базе были целы, точные цвета нашлись в файлах темы, а прежний вид — в веб-архиве, там сохранились копии сайта за годы. Вернули 85–90%.
Один в один без платных плагинов не выйдет, и я не буду делать вид, что выйдет: сложные ленты и слайдеры были завязаны именно на платные компоненты. Но 85–90% — это узнаваемый рабочий сайт, а не заглушка.
И вот тут то, ради чего я всё это пишу. Сайт живёт годами. Обрастает плагинами. Каждый из них стареет. Дыра — вопрос времени, а не невезения.
Так же тихо на сайте годами висят и другие риски — например, шрифты Google, за которые в Германии приходит Abmahnung, или отсутствующие Impressum и Datenschutz. Никто не замечает, пока не прилетит.
Разовая чистка это не закрывает. Закрывает другое: обновления, резервные копии и живой человек, который смотрит за сайтом.
Кому отдать сайт, чтобы не остаться с ним один на один?
Тому, кто будет на связи и через год, и через три. Разовая чистка возвращает сайт в рабочее состояние, но не мешает следующей дыре: плагины продолжают стареть. Регулярное сопровождение — обновления, резервные копии, защита, мелкие правки — обходится дешевле, чем одно лечение массового заражения, и снимает вопрос «кому теперь писать».
Клиент написал мне через несколько лет после того, как мы сделали сайт. Без договора, без абонентки. Я оказался на месте — и сайт вычистили.
Это, если честно, и есть вся моя позиция. Мы делаем сайты и ведём их дальше: резервные копии, обновления, защита, правки. Не ради того, чтобы вы платили каждый месяц, а чтобы через три года вам было кому написать.
Частые вопросы
Типичные признаки: посетителей перебрасывает на чужие сайты, в поиске появляются страницы, которых вы не создавали, браузер или хостинг показывает предупреждение, сайт заметно замедлился. Часто владелец узнаёт последним — от клиента или из письма хостера. Точный ответ даёт сравнение файлов сайта с официальными версиями тех же ядра, плагинов и темы.
При свежей одиночной инъекции — иногда да. При массовом заражении плагина недостаточно: он не видит процесс в памяти сервера, который восстанавливает удалённые файлы, и не закрывает точку входа. Сканер помогает заметить проблему, но лечение требует сравнения с эталоном, поиска механизма восстановления и переустановки ядра и плагинов из официального источника.
Между разными аккаунтами изоляция обычно работает, и вычищенный сайт соседи повторно не заражают. Но если несколько сайтов живут на одном аккаунте, заражение одного — проблема всех: они рассылают спам, и хостинг может заблокировать аккаунт целиком за вредоносную активность. Вывод: сайты на общем аккаунте лечат все вместе.
Да, все: панель хостинга, доступы к серверу, база данных, администраторы сайта. При массовом заражении пароли почти наверняка утекли, и старые становятся ключом для повторного входа. Смена секретных ключей WordPress вдобавок завершает все активные сессии, включая любые оставшиеся у злоумышленника.