AJAX - главная «слепая зона» безопасности
AJAX - главная «слепая зона» безопасностиВ 2026 году продолжается волна атак на Joomla-сайты. Ботнеты массово сканируют сети в поиске одной и той же уязвимости —отсутствия проверки прав доступа в AJAX-обработчиках.
Почему com_ajax стал идеальным «черным ходом» для хакеров и как защитить свой код? Разбираем анатомию ошибки.Как устроена уязвимость?com_ajax создавался как легкий маршрутизатор, чтобы плагины и модули могли обрабатывать AJAX-запросы без создания собственных роутов.
Главный капкан архитектуры —com_ajax НЕ проверяет авторизацию за вас.
Разработчики часто путают три разных уровня защиты:
1.CSRF-токен (Session::checkToken())— проверяет только то, что запрос отправлен с вашего сайта.Но он НЕ проверяет, кто его отправил.2.Аутентификация ($user->guest)— проверяет, залогинен ли пользователь.
3.Авторизация (ACL / authorise())— проверяет, имеет ли пользователь право выполнять действие.Реальные инциденты и уязвимости в Joomla:•Astroid Framework:Отсутствие авторизации в AJAX-обработчиках позволяет гостям и пользователям с минимальными правами вызывать служебные функции.
•Novarian Framework:Аналогичные «слепые зоны» в AJAX-маршрутизации, открывающие доступ к выполнению кода без проверки ролей.
•JoomShaper Helix3 (Волна взломов AntonKill):Массовый дефейс Joomla-сайтов через неаутентифицированный AJAX-эндпоинт фреймворка шаблона.
•AcyMailing:Повышение привилегий из-за отсутствия проверки прав во внутреннем роутере (уязвимость затрагивает Joomla 9.11.0 – 10.8.1).Как делать НЕЛЬЗЯ (уязвимый код):Session::checkToken() or die('Invalid Token');(Проверен только CSRF, но любой гость может удалить элемент).Как ДОЛЖНО быть (безопасный код):
$input = Factory::getApplication()->getInput();
$this->deleteItem($input->getInt('id'));Session::checkToken() or die('Invalid Token');
$app = Factory::getApplication();
$user = $app->getIdentity();
if (!$user->authorise('core.manage', 'com_yourcomponent')) {
throw new Exception('Access Denied', 403);
}
$this->deleteItem($app-> getInput()->getInt('id'));Чек-лист базовой проверки:•Если вы пишете код:Никогда не полагайтесь только на com_ajax. Всегда вызывайте $user->authorise() перед выполнением действия.
•Если вы администрируете сайты:Регулярно обновляйте фреймворки шаблонов (Astroid, Novarian, Helix) и сторонние расширения.
•Проверьте старый код:Наличие checkToken() в AJAX-хендлере не делает его безопасным!
Подробную хронологию разбора этой уязвимости читайте встатье на mySites.guru.Проверяете ACL на каждом AJAX-вызове в своих компонентах и плагинах?#joomla#php#security#webdev#cms#backend