0887 371 498 support@itservice-bg.net
От стара Joomla към нов сайт (част 1): анализ на компрометирания сайт
13.08.2026 · Самуил Арсов · Hosting

От стара Joomla към нов сайт (част 1): анализ на компрометирания сайт

Тази поредица описва реален случай от практиката ни: как за един ден пресъздадохме от нулата официалния сайт на голяма общинска администрация, работил години наред върху остаряла и компрометирана Joomla, и как мигрирахме над две хиляди статии в чист нов сайт, без да губим съдържание и без дълъг престой. Заради поверителност навсякъде използваме измисления домейн novsaitobshtina.bg вместо реалния.

Първата част е за диагнозата — защо старият сайт беше не просто стар, а невъзможен за поддръжка, и защо решихме да го изградим наново, а не да го „кърпим“.

Какво заварихме

Сайтът работеше на Joomla 3.9.18 — версия, излязла преди години и отдавна извън поддръжка (end-of-life). За седем години на практика не беше обновяван: нито ядрото, нито разширенията. Това само по себе си е проблем за сигурността, но в конкретния случай беше само върхът на айсберга.

Правило от практиката: сайт на държавна или общинска администрация не е място, където се експериментира на живо. Именно затова заварената система беше замразена — никой не смееше да я пипне, за да не я счупи, и с всяка изминала година тя ставаше все по-опасна.

Сайтът беше компрометиран

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

  • Уеб шел (backdoor uploader) — PHP файл, маскиран като изображение (започваше с GIF89a), който позволяваше на нападателя да качва и изпълнява произволни файлове.
  • Спам doorway към онлайн казино — отделен файл, който пренасочваше посетители и търсачки към чуждестранен хазартен сайт. Датите показваха, че пробивът е стар с месеци — тоест през цялото това време част от авторитета на общинския домейн в Google е работил за чуждо казино.

Как е влязъл нападателят

Входната точка беше уязвимост в популярния редактор JCE (Joomla Content Editor) — стара версия с известна дупка в profiles.import, която позволява неоторизирано качване на файлове. Персистенцията (задържането) беше реализирана изтънчено: през подхвърлени профили в самия редактор, конфигурирани да разрешават качване на .php в директорията с изображения. Тоест дори да изтриеш шела, редакторът остава отворена врата за следващия.

Показателно за динамиката на такъв пробив: сайтът беше реинфектиран часове след първото почистване — автоматизиран бот сканира постоянно за точно тази уязвимост и качва нов шел веднага щом намери отворен вектор. Заключението е важно: почистването на файлове без затваряне на входа е загубена битка.

Защо не можеше просто да се обнови

Логичният въпрос е: щом версията е стара, защо не се обнови до нова Joomla? В теорията — да. В практиката архитектурата на сайта го правеше почти невъзможно:

Пречка Защо блокира обновяването
Търговски шаблон на Gantry 4 Целият външен вид зависеше от framework, който съществува само за Joomla 3. В по-нова Joomla сайтът остава без дизайн.
com_k2 и специфични компоненти Част от съдържанието се държеше в структури, които не мигрират автоматично към новите версии.
Над 100 разширения Всяко от тях е потенциална спирачка при миграция. Мнозинството отдавна не се поддържаха и нямаха версии за нова Joomla.
Държавен сайт на живо Всяка операция върху продукционната база носи риск от престой и загуба на данни — недопустимо за публична администрация.

С други думи, „обновяването на място“ на практика би било същата работа като изграждане наново, но с всичкия натрупан за годините боклук пренесен напред — стотици неизползвани разширения, компрометирана история и шаблон, който така или иначе трябва да се смени.

Първите спешни мерки

Преди каквото и да е решение за бъдещето, спряхме кръвотечението. Това е стандартната ни рутина при заварен компрометиран сайт:

  • Изолиране, не изтриване — зловредните файлове се преместват в карантина извън уеб директорията, със запис на контролни суми (доказателство, а не унищожаване на следи).
  • Затваряне на вектора — обновяване/премахване на уязвимия редактор и изтриване на подхвърлените профили.
  • Блокиране на изпълнение в директориите за качване чрез правило в .htaccess, което забранява всякакви PHP файлове — включително маскираните с двойно разширение:
<FilesMatch "(?i)\.ph(p[0-9]?|tml|ar|ps|t)">
    Require all denied
</FilesMatch>

Детайл, който лесно се пропуска: правилото трябва да е без анкор $ в края. Стар вариант с \.php$ хваща shell.php, но пропуска shell.php.gif — точно с този трик стана реинфекцията.

Освен това ограничихме административния панел по IP адрес и сменихме всички пароли — база данни, административни акаунти, достъп до сървъра.

Решението: чист сайт + миграция на данните

След като сайтът беше стабилизиран, решението беше взето заедно с ръководството на администрацията: нов сайт, изграден от нулата, в който се пренасят само данните — статии, категории, изображения, документи. Никакъв стар код, никакви стари разширения, никаква компрометирана история.

Аргументите бяха ясни:

  • Сайтът е чисто информативен — новини, обяви, документи. Няма сложна бизнес логика, която да пренасяме.
  • Мнозинството от стотиците разширения изобщо не се използваха — те бяха баласт, натрупан през годините.
  • Нов сайт означава чиста основа за сигурност — актуална версия, минимум разширения, съвременен PHP.
  • Възможност да се подредят наново навигацията и съдържанието — за годините менюто и текстовете бяха станали нелогични и трудни за четене.

В следващата част описваме самата миграция — как инсталирахме новата Joomla в същата база данни, без да пипаме старите таблици, и как пренесохме над две хиляди статии с чист SQL, включително два капана, които крият половината статии и лесно те карат да мислиш, че миграцията се е провалила.

📚 Поредица: от стара Joomla към нов общински сайт