ВЮ Баланс
ГлавнаяКейсыМеньше двух суток от выхода патча до взлома: разбор атаки на WordPress
Безопасность
менее 2 суток
от выхода патча до взлома сайта
Июль 2026

Меньше двух суток от выхода патча до взлома: разбор атаки на WordPress

Производственная компания · сайт на WordPress
Безопасность сайтов
менее 2 суток
от выхода патча до взлома сайта
10
чужих администраторов нашли и удалили
~40
вредоносных объектов ушло в карантин

Задача

Клиент обратился с типичной жалобой: хостинг прислал уведомление о вирусе, а в панели Google Search Console появился незнакомый подтверждённый владелец. Сайт производственной компании, WordPress, около двадцати плагинов, живой трафик из поиска. Логи веб-сервера были включены буквально в момент обращения, то есть история запросов отсутствовала. Нужно было понять, как злоумышленник попал на сайт и что успел сделать, вычистить всё до последнего файла и закрыть точку входа — не сломав при этом работающий сайт.

С чего всё началось

Три наблюдения клиента на момент обращения:

  1. 1Антивирус хостинга нашёл файл в каталоге плагинов с именем вида «system-monitor» и случайным хвостом из символов.
  2. 2В файловом менеджере несколько папок имели сегодняшнюю дату изменения, хотя никто ничего не трогал.
  3. 3В Google Search Console появился чужой владелец, подтверждённый через HTML-файл в корне сайта.
Третий пункт — самый показательный. Подтверждение прав в Search Console нужно не для того, чтобы навредить сайту. Оно нужно, чтобы следить за индексацией своего спама на чужом домене. То есть сайт уже работал на кого-то ещё.

Точка входа: не плагин, а само ядро

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

Гипотеза оказалась ложной. Установленная версия была новее уязвимой, а следы работы файлового менеджера датировались временем после появления первого чужого администратора. Это был инструмент закрепления, а не вход.

Настоящей точкой входа оказалось ядро WordPress. Свежая на тот момент уязвимость CVE‑2026‑63030 (кампания получила имя wp2shell) — связка путаницы маршрутов в REST API и SQL‑инъекции в параметре выборки записей. Эксплуатация не требует ни аутентификации, ни действий пользователя: злоумышленник напрямую создаёт администратора и загружает код.

17 июля
Выходит патч — уязвимость становится публичной
18 июля
На GitHub появляется рабочий эксплойт — готовый инструмент атаки
19 июля, ночь
Начинается массовое сканирование интернета
19 июля, 04:52
На сайте создан первый чужой администратор
Таймлайн кампании wp2shell и взлома сайта клиента — от публикации патча до вторжения прошло меньше двух суток
От публикации патча до взлома конкретного сайта прошло меньше двух суток. Это ключевая цифра всего кейса: окно между «уязвимость стала известна» и «её начали массово эксплуатировать» сегодня измеряется часами, а не неделями.

Хронология захвата

Дальше сайт больше недели жил своей жизнью. Восстановленная картина:

  1. 19 июля
    Созданы два администратора с именами, похожими на служебные аккаунты — расчёт на то, что владелец примет их за системные
  2. 19–21 июля
    Ещё три администратора от других инструментов: судя по почтовым доменам в профилях, сайт нашли и заняли несколько разных групп
  3. 21 июля
    В каталоге плагинов разворачиваются два поддельных плагина: веб-шелл для выполнения команд и файловый менеджер для загрузки файлов
  4. 22 июля
    Появляется must-use плагин — такие WordPress загружает всегда и не показывает в обычном списке — и ещё один шелл под видом кэширующего плагина
  5. 25–26 июля
    Новые администраторы с именами вида «administrator» с числовым хвостом, шеллы расползаются по каталогам изображений
  6. 27 июля
    Массовая правка времени изменения у сотен файлов и подтверждение чужих прав в Search Console
10
чужих учётных записей администратора
~40
вредоносных объектов к моменту обращения

Три приёма, которые стоит знать

1. Подделка дат изменения файлов

Самый неприятный сюрприз. Вредоносные файлы имели даты 2022–2024 годов — то есть выглядели как древние, давно лежащие и потому безобидные. На деле весь этот код появился в течение одной недели: злоумышленник массово проставлял файлам произвольное время изменения — простая операция, доступная любому, у кого есть выполнение команд.

Что нашлиДата на файлеНа самом деле
Веб-шелл под видом плагинаянварь 2024эта неделя
Каталоги с данными для спаманоябрь 2022эта неделя
Даты изменения файлов подделаны: «древние» находки на деле появились в течение одной недели
При разборе взлома нельзя опираться на даты файлов. Стандартный приём «покажи, что менялось за последнюю неделю» даёт ложную картину: свежие бэкдоры — оставленные взломщиком «чёрные ходы» — в неё не попадают, зато попадают безобидные файлы, которых кто-то коснулся.

2. Вредоносный .htaccess, защищающий от конкурентов

В корне сайта лежал переписанный файл настроек сервера с необычной логикой: он запрещал выполнение всех PHP‑файлов, кроме короткого белого списка. В списке были системные файлы WordPress — и полтора десятка чужих имён.

# Схема вредоносного .htaccess (не дословный код)
# Выполнение PHP запрещено всем…
<FilesMatch "\.php
quot;> Deny from all </FilesMatch> # …кроме системных файлов и бэкдоров первой группы <FilesMatch "^(index|wp-login|defaults|mah|networks|…)\.php
quot;> Allow from all </FilesMatch>
Белый список из полутора десятков имён: чужие бэкдоры работать перестали, свои — остались. Системный wp-cron.php в список не попал, и плановые задачи WordPress молча умерли

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

3. Плагин «Security Patch», закрывающий ту самую дыру

Самая изящная находка. В каталоге must-use плагинов лежал файл, который представлялся как «Security Patch — усиление REST API». И он действительно закрывал доступ к уязвимому маршруту — для всех, кроме тех, кто знает секретный заголовок с паролем.

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

Ради чего всё затевалось

Не ради разрушения. Сайт превратили в инструмент для чужого SEO.

Живой посетитель

Видит обычный сайт компании — ничего подозрительного

Поисковый робот

Получает спам-страницы под чужие коммерческие запросы

Маскировка (клоакинг): один и тот же адрес отдаёт разный контент — поэтому владелец может долго не замечать, что сайт работает на чужое SEO
  • В главный файл сайта был вшит код, подгружающий контент с внешнего сервера. Он проверял, кто пришёл, и отдавал спам только поисковым роботам — обычный посетитель видел нормальный сайт.
  • В корне лежало около десятка файлов-дорвеев, генерирующих страницы под чужие коммерческие запросы. К моменту разбора их уже активно обходили Googlebot и краулеры ИИ-сервисов — спам попал в индекс.
  • В каталогах изображений и внутри легитимных плагинов были рассажены дополнительные точки входа. Папки для них назывались правдоподобно: cloudflare, nextjs, jquery3 — на беглый взгляд не отличить от настоящих.

Ущерб здесь репутационный и поисковый: чужие страницы в индексе, риск санкций поисковиков, подтверждённый чужой владелец в Search Console.

Что помогло всё восстановить

Главным инструментом расследования оказался git‑репозиторий — система контроля версий, которую мы сами завели за несколько месяцев до инцидента, просто для более удобной разработки.

Поскольку датам файлов доверять было нельзя, а логов не было, единственным надёжным эталоном стало «состояние сайта на момент последнего коммита». Сравнение с ним дало исчерпывающий ответ: какие файлы изменены, какие добавлены и как выглядели оригиналы. Больше того — оно опровергло первоначальную версию. По датам казалось, что сайт заражён с 2022 года; сравнение с репозиторием показало, что на момент коммита сайт был полностью чист, и всё уложилось в одну неделю.

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

Что мы сделали

  • Собрали улики до любых изменений: архив вредоносных файлов и дамп базы — это нужно и для разбора, и на случай, если что-то пойдёт не так
  • Удалили десять чужих администраторов — в первую очередь: через админку злоумышленник может залить всё заново за минуту
  • Изолировали вредоносный код: не удаление, а перенос в карантин за пределы публичной папки — операция обратимая, а улики сохраняются
  • Восстановили изменённые файлы из чистых версий
  • Обновили ядро WordPress до версии с исправлением — до этого шага сайт оставался уязвим, и его могли взломать повторно в любую минуту
  • Обновили плагины и удалили неиспользуемые: неактивный плагин — это всё ещё исполняемый код, доступный по прямой ссылке
  • Сменили секретные ключи в конфигурации, чтобы разлогинить всех, включая злоумышленника
  • Запретили выполнение PHP в каталогах загрузок и изображений: туда попадают файлы от пользователей, и исполняемому коду там делать нечего
  • Настроили для спам-страниц, попавших в индекс, ответ «страница удалена навсегда» (код 410) — так поисковики выбрасывают их быстрее, чем при обычной ошибке 404
  • Отозвали чужой доступ в Search Console вручную: удаление файла подтверждения уже подтверждённые права не отзывает
  • Починили оформление, которое «поехало» после обновления плагинов: нужные стили когда-то были вписаны прямо в файлы плагина, и обновление их стёрло. Перенесли правки в тему — туда, где они переживают обновления, — а заодно нашли и устранили ошибку, из-за которой часть стилей годами не применялась на мобильных устройствах

Результат

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

Чек-лист: что сделать со своим сайтом сегодня

1Проверьте версию WordPress

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

2Просмотрите список пользователей

Все администраторы должны быть вам знакомы. Аккаунты со «служебными» именами — расчёт именно на то, что вы примете их за системные.

3Загляните в must-use плагины

WordPress загружает их всегда и не показывает в обычном списке — идеальное место для закрепления. В норме там либо пусто, либо то, что вы поставили сами.

4Проверьте целостность ядра

Штатными средствами WordPress это делается одной командой — и сразу показывает посторонние файлы.

5Удалите неиспользуемые плагины

Именно удалите, а не деактивируйте: неактивный плагин — это всё ещё исполняемый код, доступный по прямой ссылке.

6Включите логи веб-сервера заранее

Их отсутствие в этом кейсе стоило самой ценной части картины — точного вектора первого запроса.

7Заведите репозиторий

Даже для сайта без активной разработки: в момент инцидента он превращается в эталон, с которым можно сверить каждый файл.

Что осталось за кадром

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

Отдельно проверялось, не утекли ли учётные данные для отправки почты. Не утекли — и по приятной причине: сайт отправлял письма системными средствами, которым логин и пароль не нужны. Хранить было нечего.

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

Другие кейсы

Все кейсы
152-ФЗАналитика
60 минут
занял полный аудит сайта
Июль 2026

Аудит по требованиям РКН: нашли риски штрафов до 2,4 млн ₽ и устранили все

B2B-маркетплейс · стоматологические материалы

Задача. B2B-маркетплейс стоматологических материалов: клиники размещают заявки на закупку, поставщики отвечают предложениями с ценами. Задача звучала просто — «проверить сайт на соответствие требованиям Роскомнадзора». Требования к работе с персональными данными меняются по несколько раз в год: с сентября 2025 согласие оформляется только отдельным документом, а штраф за вход на сайт через иностранные сервисы — до 700 тысяч рублей — ввели буквально за две недели до нашей проверки. Сайт, который приводили в порядок год назад, сегодня может снова не соответствовать. И главное: обычно аудит заканчивается отчётом «что у вас не так», который ложится в стол, потому что исправлять сайт отчёт не умеет. Мы прошли путь целиком — от проверки до исправлений в коде работающего сервиса.

60 минут
занял полный аудит сайта
до 2,4 млн
потенциальных штрафов по найденным несоответствиям
0
сервисов Google осталось на сайте
Подробнее о кейсе
Telegram-ботАвтоматизация
24/7
приём регистраций и оплат
Июль 2025

Телеграм-бот для форума: регистрация и оплата участия без менеджера

Форум · Санкт-Петербург

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

24/7
приём регистраций и оплат
3 пакета
участия с оплатой прямо в Telegram
авто
закрытые материалы сразу после оплаты
Подробнее о кейсе
152-ФЗ
12 тестов
форм с боевыми данными перед публикацией
Май 2025

Требования Роскомнадзора: привели сайт в порядок и не сломали формы заявок

Стоматология · запись на приём

Задача. С 30 мая 2025 года выросли штрафы за нарушения при работе с персональными данными: только за отсутствие уведомления в Роскомнадзоре организации грозит до 300 тысяч рублей. К этой дате сайт нужно было привести в порядок — и при этом не сломать формы, через которые приходят заявки. Правка формы всегда риск: типичная поломка — в CRM приезжает телефон без последней цифры, то есть заявка есть, а дозвониться некуда. И узнают об этом обычно не сразу.

12 тестов
форм с боевыми данными перед публикацией
в срок
до 30 мая 2025 — дедлайна новых штрафов
до 300 тыс.
штраф за работу без уведомления РКН
Подробнее о кейсе

Хотите похожий результат у себя?

Расскажите о задаче — предложим решение и оценим сроки.