Кейс · апрель 2026

Подрядчик ушёл, а заявки не приходят. Что мы нашли за 14 часов

Средний бизнес поручил независимый аудит сайта на Bitrix в день, когда инициировал расторжение договора с прежним SEO-подрядчиком. За 14 часов активной работы были обнаружены скрытый канал доступа в корне сайта, модуль перехвата уведомлений о заявках, подменённый счётчик Метрики и десяток открытых архивов с резервными копиями.

«За 4 месяца — два клиента»
сообщение заказчика — в день, когда расторгался договор с прежним подрядчиком. С этой одной фразы аудит перешёл в срочный режим.
14 часов
от полевого этапа до отчёта
1
скрытый канал нейтрализован
20
заявок без ответа
33 ГБ
доказательств с SHA-256

Контекст

Поручение на аудит поступило в день, когда заказчик инициировал расторжение договора с прежним SEO-подрядчиком.

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

Внешние ограничения определили темп:

Поэтому методика строилась с приоритетом на сохранение доказательств и минимизацию необратимых действий.

Хронология

Критическая фаза от триггерного сообщения до проверки ловушки — 9 часов 31 минута. Среднее время отклика заказчика на запросы исполнителя в активной фазе — около двух минут. Без такого темпа бизнес-согласований компрессия аудита в одни сутки была бы невозможна.

Что нашли

Перед детальным разбором — хронология значимых событий в инфраструктуре сайта, восстановленная по HTTP-заголовкам, API Яндекса и временным меткам в базе данных.

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

ДатаСобытие
02.01.2023Заказчиком создан собственный счётчик Яндекс.Метрики
06.03.2023Стандартный файл spread.php существует в служебной директории CMS (легитимная обёртка)
20.03.2024Создан архив с резервной копией сайта 12 ГБ. В корне сайта файла spread.php ещё нет
27.03.2024В HTML-коде сайта подменён счётчик Метрики на чужой идентификатор
11.04.2024В базе данных отключена капча на четырёх формах. В тот же час — волна ботовых заявок
30.05.2024Изменён robots.txt — снят запрет индексации служебной директории CMS (день в день со вступлением в силу 420-ФЗ)
17.09.2025, 17:18Установлен сторонний модуль перехвата уведомлений о заявках с сайта
24.03.2026Последний вход прежнего подрядчика в админку. В этот же день создана резервная копия сайта 14 ГБ
27.04.2026Заказчик передаёт доступы исполнителю
29.04.2026, 22:00В корне сайта обнаружен PHP-скрипт spread.php — скрытый канал доступа

1. Полная копия сайта 12 ГБ — открыта для скачивания

Главная находка обнаружена в первые минуты сканирования: архив /public_html.zip объёмом 12 ГБ был доступен по прямому адресу без авторизации.

Внутри — полная файловая структура сайта: исходный код, CMS-модули, конфиги, база данных, выгрузки заявок, фотоархив. Срок действия в HTTP-заголовках был выставлен до 29 апреля 2027 года — то есть архив должен был оставаться доступным ещё год.

При построчном анализе SQL-дампа из утёкшего архива установлено: реальных субъектов персональных данных в утечке — 26 уникальных лиц. С поправкой на ботовые записи, тестовые заявки самого подрядчика и групповые дубли. Это и есть юридически значимый объём — категория «Б» по ПП №1286, упрощённая процедура уведомления (менее 100 субъектов).

HTTP/1.1 200 OK Server: nginx/1.28.3 Content-Type: application/zip Content-Length: 13 105 763 537 Last-Modified: Wed, 20 Mar 2024 14:18:42 GMT Expires: Thu, 29 Apr 2027 15:31:23 GMT Cache-Control: max-age=31536000 Accept-Ranges: bytes

2. Десять архивов с резервными копиями и три служебных скрипта в корне

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

Архивы (auth.zip, cabinet.zip, cart.zip, gallery.zip, info.zip, news.zip, product.zip, projects.zip, sales.zip, tariffs.zip) — фрагменты разделов сайта на разных датах: от ноября 2022 до февраля 2023. Скрипты — fixit.php, spread.php, readme.php — не относятся к стандартной поставке CMS и не имеют контроля доступа.

3. spread.php — скрытый канал доступа (бэкдор / чёрный ход)

Один из служебных скриптов оказался полноценным скрытым каналом доступа: публичный адрес без авторизации, при обращении к которому пароль главного администратора заменяется на пароль, прописанный прямо в коде этого скрипта. То есть атакующий заранее знает, на какое значение сбросится пароль, — и в любой момент может войти под админом, обратившись к одному адресу. Этот тип закладок принято называть «теневым сбросом»: скрытый механизм восстановления доступа, переживающий любую штатную смену паролей со стороны владельца.

В стандартной поставке Bitrix есть легитимный файл bitrix/spread.php — однострочная обёртка для модуля массовых рассылок:

require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/spread.php");

Этот файл существует в любой инсталляции Bitrix с начала 2010-х. Любой разработчик с опытом видел его сотни раз и не относится к нему с подозрением.

Атакующий использовал то же самое имяspread.php, — но положил свой PHP в корень сайта, где штатного файла с таким именем быть не должно. При беглом просмотре корневого перечня файл выглядит как ожидаемый системный — это эксплуатация привычки восприятия Bitrix-разработчика.

В резервной копии сайта от 20 марта 2024 года в корне такого файла нет — значит, добавлен позднее этой даты. Размер файла — 276 863 байта, в основной части — копия исходного HTML главной страницы для маскировки ответа; меньшая часть кода выполняла подмену пароля.

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

4. Подмена счётчика Метрики и накрутка ботами

27 марта 2024 года счётчик Метрики на сайте был заменён на идентификатор, не принадлежащий заказчику. С этой же даты в БД сайта начали поступать заявки с признаками автоматизированного поведения.

Из 386 заявок, накопленных в базе за период, 87 пришлись на апрель 2024 года и имели типичные маркеры накрутки: одинаковые временные интервалы, шаблонные имена, отсутствие источника перехода. Реальный поток заявок до подмены счётчика — 2-13 в месяц.

Сама по себе подмена счётчика делает аналитику в Метрике непригодной для принятия решений: владелец сайта видит чужую картину трафика, а накрутка ботов — встроена в контур чужого аккаунта.

5. Модуль webprostor.smtp — почему «за 4 месяца — два клиента»

17 сентября 2025 года в 17:18 МСК на сайт установлен сторонний модуль, перехватывающий уведомления о заявках. Технически он подменял механизм отправки исходящей почты: письма уходили через сторонний почтовый сервер с переписанным полем «От» и без сохранения журнала отправок. Для владельца это означает простую вещь — заявка на сайте оставлена, но уведомление о ней до него не доходит.

Заказчик передал служебный лог самого модуля (webprostor.smtp_logs.xls) за период с 17 сентября 2025 года по 12 марта 2026 года. По этому логу — 20 попыток отправки уведомлений о заявках; в каждой из 20 строк поле «Отправлено» пустое, что соответствует ошибке доставки. То есть за полгода 20 потенциальных клиентов оставили заявки на сайте, и ни один ответ от компании до них не дошёл.

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

Динамика реальных заявок до и после установки модуля — по записям в базе данных сайта:

ПериодЗаявок в месяц
август 202513 (до установки модуля)
сентябрь 20257 (5 до 17-го числа + 2 после)
октябрь 20251
ноябрь – декабрь 20250
январь – март 20261 – 3

Обрыв потока реальных заявок начался в день установки модуля и не восстановился до момента аудита.

6. Как подрядчик подстраивается под изменения 152-ФЗ — за ваш счёт

Пять технических правок инфраструктуры сайта в 2024-2025 годах пришлись строго на окна между принятием поправок к 152-ФЗ и их вступлением в силу.

Что вступало в силу:

Дата правкиЧто сделано на сайтеЗакон
07.03.2024Скрыты три поля контактной формы (email, тип запроса, текст)420-ФЗ, в силу 30.05.2024
27.03.2024Подмена счётчика Метрики420-ФЗ, в силу 30.05.2024
11.04.2024Отключена капча на четырёх формах — открыта возможность ботового потока420-ФЗ, в силу 30.05.2024
30.05.2024Изменён robots.txt — снят запрет индексации служебной директории CMS420-ФЗ — день в день со вступлением в силу
17.09.2025Установлен модуль перехвата уведомлений о заявках134-ФЗ, принят 30.05.2025, в силу 30.11.2025

Что объединяет эти правки. Каждая отдельная — обычная задача подрядчика: «настроить капчу», «обновить счётчик», «добавить SMTP-модуль». Их совокупность во времени — нет.

Каждая правка делает сайт менее эффективным как бизнес-канал: формы упрощаются, заявки не доходят, аналитика уходит чужому. И одновременно — снижает фактический объём реальных персональных данных, попадающих в БД сайта: меньше полей в формах, ботовый поток разбавляет реальные заявки фейковыми именами и телефонами, перехваченные уведомления отрезают канал реального общения с клиентом.

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

Случайная синхронизация пяти разнородных правок с двумя законодательными окнами на трёхлетнем интервале — статистически малое событие. Интерпретацию этого совпадения исполнитель оставляет заказчику.

Как работали

Методика строилась на трёх принципах: доказательства прежде всего, нейтрализация без удаления, превентивная защита параллельно с аудитом.

Доказательства прежде всего

Каждая находка зафиксирована тремя способами: прямой HTTP-снимок ответа сервера, снимок Wayback Machine для исторической верификации, SHA-256 на скачанные артефакты. Итоговый архив доказательств — 33 ГБ, 16 разделов, хеш на каждый файл; ссылки и фрагменты включены в отчёт со ссылками на индекс архива.

Нейтрализация вместо удаления

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

Превентивная зачистка доступов

В CMS были обнаружены четыре «лишних» административные учётные записи. Поскольку процедура расторжения договора с прежним подрядчиком ещё не была завершена, эти записи удалены превентивно — до завершения процедуры, чтобы исключить возможность последующего входа. Пароль базы данных сменён синхронно, резервная копия сайта (12 ГБ) и четыре tar-архива из служебной директории CMS сохранены локально.

Что закрыто

Закрыто
Скрытый канал нейтрализован
spread.php заменён на ловушку. Журналирование, оповещение почтой, маскировка ответа.
Закрыто
Доступы зачищены
Четыре «лишних» учётные записи администратора удалены, пароль БД сменён, открытые архивы закрыты в nginx.
Зафиксировано
Архив доказательств
33 ГБ, 16 разделов, SHA-256 на каждый артефакт. Хранится у исполнителя на защищённом носителе.
Передано
Отчёт 14 разделов
100 страниц, со ссылками на доказательства. Сводное описание установленных обстоятельств — отдельным разделом.
Подготовлено
Регуляторные документы
Первичное уведомление (24 ч) и отчёт о расследовании (72 ч) — готовы к копированию в форму pd.rkn.gov.ru. Категория «Б», 26 субъектов. Решение об отправке за заказчиком.

Что из этого следует

Передача сайта без аудита — слепое доверие

Архивы с резервными копиями, служебные скрипты, перехват уведомлений, подмена счётчиков — всё это не видно из админки CMS. Без специального аудита смена подрядчика проходит так, как будто никаких следов не остаётся.

Доказательства важнее, чем удаление

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

Окно расторжения — это окно риска

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

Александр Колонтай · независимый IT-аудитор · mantis.by · 30 апреля 2026

Сменили подрядчика на сайте?

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

hello@mantis.by На главную