Защита сайта на Joomla от взлома: 5 слоёв обороны и уязвимости 2026

Защита сайта на Joomla от взлома
Защита Joomla: диагностика, очистка и настройка ограничений на веб-сервере.

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

Краткий ответ

Лечение Joomla после взлома состоит из пяти этапов: изолировать сайт и сохранить копию, закрыть уязвимый вход, найти и удалить вредоносный код в файлах и базе, заменить доступы и проверить работу сайта, затем включить постоянную защиту. Вредоносный код может остаться в шаблоне, модулях или настройках базы, поэтому одной проверки папки images недостаточно. Правила Nginx или Apache ниже блокируют запуск PHP в каталогах загрузок, но не заменяют обновление Joomla и расширений.

Что сделать в первые 30 минут

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

  1. Сохраните отдельную копию файлов сайта, дамп базы данных и журналы веб-сервера. Не перезаписывайте существующие резервные копии.
  2. Зафиксируйте время обнаружения, подозрительные URL, имена файлов и учётные записи. Эта информация поможет найти точку входа.
  3. Смените пароли администратора Joomla, панели хостинга, SSH или FTP, базы данных и почты. Удалите неизвестных пользователей с правами администратора.
  4. Закройте выполнение PHP в папках, куда можно загружать файлы. Это снижает риск повторного запуска веб-шелла ещё до полной очистки.

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

Шаг 1. Закройте вход, через который могли попасть на сайт

Обновление закрывает известную уязвимость, но не удаляет уже загруженный код. В панели Joomla откройте «Система → Обновление Joomla» и «Система → Управление → Расширения». Обновите ядро и используемые расширения до поддерживаемых версий. Неиспользуемые компоненты, плагины, шаблоны и языки лучше удалить через штатный менеджер расширений.

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

Что проверить Где искать Что сделать
Версия Joomla Панель администратора, «Система → Информация о системе» Обновить до поддерживаемой версии после резервной копии.
Расширения и шаблоны «Система → Управление → Расширения» Обновить используемые, удалить ненужные, отключить сомнительные до проверки.
Плагины com_ajax «Система → Плагины», фильтр по группе ajax Отключить то, что не используется. Для собственных обработчиков добавить проверку прав и CSRF-токена.
Учётные записи «Пользователи → Управление» Удалить неизвестные учётные записи и проверить группы доступа.

Шаг 2. Запретите запуск PHP в папках загрузок

Папки images, media, files, tmp, cache и logs предназначены для изображений, вложений, временных файлов и журналов. В нормальной Joomla PHP-код в них запускаться не должен. Если уязвимое расширение загрузит туда веб-шелл, правило ниже вернёт ошибку 403 вместо выполнения файла.

Nginx: куда вставить правило

Добавьте фрагмент в блок server конфигурации сайта, до общего обработчика PHP. В HestiaCP это обычно пользовательские файлы конфигурации домена nginx.conf_* и nginx.ssl.conf_*. Если сайт работает по HTTP и HTTPS, правило должно быть в обоих конфигурационных файлах. После изменения проверьте конфигурацию командой nginx -t и только затем перечитайте Nginx.

location ~* ^/(images|media|files|tmp|cache|logs|administrator/(logs|cache))/.+\.(php|phtml|phar|php[0-9]*)$ {
  deny all;
  return 403;
}

Если расширение хранит вложения в отдельной папке, добавьте её в список. Пример: images/baforms/uploads. Не запрещайте PHP в каталогах расширения целиком, пока не убедитесь, что там действительно не выполняется штатный код Joomla.

Apache: куда вставить правило

Добавьте фрагмент в корневой файл .htaccess Joomla, рядом с другими правилами RewriteRule и до стандартного правила перенаправления на index.php. Правило действует только если на хостинге разрешён mod_rewrite. На сервере с доступом к виртуальному хосту надёжнее также отключить переопределение правил в папках загрузки через AllowOverride None.

RewriteEngine On
RewriteRule ^(images|media|files|tmp|cache|logs|administrator/(logs|cache))/.+\.(php|phtml|phar|php[0-9]*)$ - [F,L,NC]

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

Защита папок загрузки Joomla от запуска PHP-файлов
Веб-сервер должен блокировать запуск исполняемых файлов в каталогах, предназначенных для загрузок.

Шаг 3. Найдите подозрительные файлы без удаления

Подключитесь к серверу по SSH и начните с файлов, которые появились незадолго до инцидента, а также с PHP в каталогах, предназначенных для загрузок. Выполняйте команды из корня Joomla, где лежат configuration.php и папки administrator, images, plugins.

find . -type f -name "*.php" -mtime -14 -print
find images media files tmp cache logs -type f -name "*.php" -print
grep -RInE "base64_decode|gzinflate|eval[[:space:]]*\(|shell_exec|assert[[:space:]]*\(" .

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

Какие каталоги проверять в первую очередь

  • images, media, files, tmp, cache: PHP, файлы с двойным расширением и неизвестные .htaccess.
  • templates и plugins: новые или изменённые PHP-файлы, вставки JavaScript с обфускацией, незнакомые include и require.
  • Корень сайта: index.php, .htaccess, configuration.php и файлы с похожими именами, например configuration.php.bak.
  • administrator: новые файлы и неизвестные расширения, особенно если они появились одновременно с инцидентом.

Шаг 4. Проверьте базу данных, а не только файлы

После взлома вредоносный JavaScript нередко живёт в настройках шаблона, параметрах модулей или тексте материалов. Он возвращается на сайт даже после замены файлов, поэтому базу нужно просматривать отдельно. Перед любым редактированием выгрузите SQL-дамп.

В phpMyAdmin или другом клиенте базы по очереди проверьте таблицы с вашим префиксом: template_styles, modules, content, extensions. Ищите конструкции fromCharCode, eval(, base64_decode, _0x, неожиданные внешние домены и скрытые iframe. Префикс таблиц у Joomla может быть не jos_, поэтому замените его на фактический.

SELECT id, template, params
FROM prefix_template_styles
WHERE params LIKE '%fromCharCode%'
   OR params LIKE '%eval(%'
   OR params LIKE '%_0x%';

SQL-запрос выше только ищет записи, ничего не удаляет. Перед очисткой подозрительной строки сравните её с резервной копией, датой изменения и кодом шаблона. Если неясно, какая часть параметров штатная, передайте специалисту экспорт конкретной записи, а не весь дамп с персональными данными.

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

Шаг 5. Безопасно восстановите ядро Joomla и расширения

Когда точка входа закрыта и список подозрительных файлов составлен, замените ядро Joomla на чистый дистрибутив той же, а затем актуальной поддерживаемой версии. Это безопаснее, чем пытаться вручную восстановить каждый системный файл. Не перезаписывайте без проверки configuration.php, папку images и доработки шаблона: там могут находиться рабочие настройки и пользовательские данные.

  1. Сделайте контрольный дамп базы и копию файлов после изоляции.
  2. Обновите Joomla штатным способом из панели администратора или по инструкции хостинга.
  3. Переустановите используемые расширения из официальных архивов разработчиков.
  4. Проверьте журнал ошибок, форму обратной связи, авторизацию, отправку писем, поиск и основные посадочные страницы.
  5. Повторно выполните поиск подозрительных файлов и строк в базе.

Шаг 6. Защитите собственный com_ajax-обработчик

Обработчик com_ajax не получает ограничения доступа автоматически только потому, что метод находится в административном расширении. Если вы поддерживаете собственный ajax-плагин, проверка должна находиться в самом начале публичного метода обработчика, до любой работы с входными данными или файлами.

Откройте PHP-файл метода onAjax... вашего плагина, обычно он находится в папке plugins/ajax/имя_плагина или в его классе расширения. Вставьте проверку сразу после открытия метода. Замените com_example на имя своего компонента и адаптируйте код под версию Joomla и архитектуру плагина.

<?php
public function onAjaxMyplugin()
{
  $user = \Joomla\CMS\Factory::getUser();
  if ($user->guest || !$user->authorise('core.manage', 'com_example')) {
    throw new \RuntimeException('Access forbidden', 403);
  }
  \Joomla\CMS\Session\Session::checkToken('request') or throw new \RuntimeException('Invalid token', 403);
  // Основная логика обработчика
}

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

Шаг 7. Смените доступы и настройте регулярную защиту

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

  • Смените пароли Joomla, хостинга, SSH или FTP, базы данных, почтовых ящиков и внешних сервисов.
  • Измените секретный ключ Joomla после проверки совместимости с интеграциями, которые могут его использовать.
  • Включите двухфакторную аутентификацию для администраторов и удалите ненужные учётные записи.
  • Отключите самостоятельную регистрацию, если она не нужна проекту.
  • Настройте внешние резервные копии и периодически проверяйте, что из них можно восстановить чистый сайт.
  • Подключите WAF или защитное расширение как дополнительный слой, а не как замену обновлениям.

Комментарий специалиста INSIB

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

Нужна помощь с лечением сайта на Joomla

Проведём диагностику, найдём точку входа, очистим файлы и базу, настроим защиту и проверим восстановление сайта.

Обсудить задачу

Частые вопросы

Можно ли просто восстановить сайт из резервной копии?

Можно только после проверки даты и чистоты копии. Если резервная копия сделана после взлома или уже содержит вредоносный код, восстановление вернёт проблему.

Достаточно ли обновить Joomla и расширения?

Нет. Обновление закрывает известную уязвимость, но не удаляет веб-шелл, скрипт в шаблоне или изменённую запись базы данных.

Почему PHP в папке images опасен?

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

Нужно ли менять пароль базы данных?

Да, если есть вероятность доступа атакующего к configuration.php, резервным копиям или панели хостинга. После смены не забудьте обновить параметры подключения в configuration.php.

Что делать, если я не уверен в подозрительном файле?

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

Поможет ли WAF?

WAF блокирует часть известных атак и полезен как дополнительный барьер. Он не заменяет обновления, ограничение выполнения PHP и проверку уже заражённого сайта.

Что важно запомнить

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