Laravel · языковая школа · безопасность

Фрилансер ушёл.В проекте остались бэкдоры

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

бэкдоров и вредоносных вставок

120

после аудита и чистки

нагрузка на сервер

−92%

майнер удалён

заявок на пробное занятие

+48%

форма записи снова работает

Внешний вид сайта: направления, расписание и запись на пробное занятие

Снаружи — обычный сайт языковой школы. Внутри после конфликта с фрилансером оказались бэкдоры, вредоносный код и недоделанные задачи.

Как дошло до этого

Конфликт с фрилансером закончился бэкдорами в проекте

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

  1. 01

    Сайт делал фрилансер

    Частной языковой школе нужен был сайт на Laravel: направления, расписание, запись на пробное занятие и админка. Работу отдали на фриланс.

  2. 02

    Фрилансер закрыл работу не до конца

    Согласованную работу он закрыл не до конца. Из‑за этого начался конфликт, и языковая школа разорвала договор.

  3. 03

    После конфликта — бэкдоры

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

  4. 04

    Сайт начал сбоить

    Появились лишние файлы, ошибки, следы чужих правок в коде. Ранее сделанный функционал начал отваливаться.

Что нашли

Сайт был недоделан и опасен

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

Бэкдоры в PHP

В коде нашли скрытые вставки. Через них можно было обходить обычный вход в админку и сохранять доступ к файлам проекта даже после смены пароля.

Вредоносные скрипты

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

Майнер в проекте

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

Недоделанный функционал

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

Как решали

Сначала безопасность, потом доработки

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

01

Изолировали проект

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

02

Провели аудит

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

03

Вычистили код

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

04

Убрали лазейки

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

05

Доделали сайт

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

Результат

Школа снова вела набор через сайт

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

Вывод

Если уход от подрядчика закончился конфликтом — стоит проверить уровень безопасности ресурса

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

Очистим ваш проект от вирусов

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

Достаточно одного контакта.