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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-97286 — Технический бюллетень и proof of concept для CVE-2026-97286 — аутентифицированный хранимый XSS в плагине WordPress Strong Testimonials, с цепочкой атаки, PoC и анализом патча. | Kitploit
Инструменты/GitHubGitHub/rully2212/cve-2026-97286
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьСтатьи и ИсследованияОбучение и Образование
GitHubrully2212/cve-2026-97286

CVE-2026-97286

Технический бюллетень и proof of concept для CVE-2026-97286 — аутентифицированный хранимый XSS в плагине WordPress Strong Testimonials, с цепочкой атаки, PoC и анализом патча.

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

Популярное

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

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

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

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

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

CVE-2026-97286: Аутентифицированный хранимый XSS в Strong Testimonials

Аутентифицированный пользователь с ролью Contributor может сохранить контролируемые злоумышленником метаданные фото платформы в плагине WordPress Strong Testimonials. До версии 3.3.12 плагин выводил сохранённое значение внутри атрибута src изображения без контекстного экранирования. После того как администратор публикует созданный отзыв и запись, отображающую его, полезная нагрузка выполняется у посетителей, открывших эту запись, включая неаутентифицированных посетителей.

Это исследование проводилось в авторизованной локальной лаборатории и было раскрыто через Patchstack до публичного релиза.

Метаданные рекомендации

ПолеЗначение
CVECVE-2026-97286
ПродуктStrong Testimonials
ВендорWP Chill
Слаг плагинаstrong-testimonials
УязвимостьАутентифицированный хранимый межсайтовый скриптинг
Затронутые версии<= 3.3.11
Исправленная версия3.3.12
Требуемая привилегияContributor или выше
CWECWE-79: Ненадлежащая нейтрализация входных данных при генерации веб-страницы
CVSS v3.16.5 Medium — CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
ИсследовательRully Miftahur Rozaq
Дата отчёта16 сентября 2026 г.
Публичное раскрытие30 сентября 2026 г.

Patchstack классифицирует рекомендацию как низкоприоритетную, несмотря на то что присвоенная базовая оценка серьёзности CVSS v3.1 — Medium.

Краткое описание

Редактор отзывов принимает массив запроса custom и сохраняет каждый переданный ключ как метаданные записи. Ключи, отсутствующие в настроенном определении пользовательского поля, проходят через sanitize_text_field(). Это позволяет пользователю с ролью Contributor передавать зарезервированные плагином метаданные, такие как platform и platform_user_photo, при редактировании собственного отзыва.

Для поддерживаемых социальных платформ плагин извлекает platform_user_photo, проверяет, что URL возвращает HTTP-ответ 200, а затем подставляет исходную сохранённую строку в атрибут <img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/...">. Проверка HTTP-статуса не делает строку безопасной для HTML-атрибута. Кавычка во фрагменте URL может завершить src и внедрить обработчик события.

Подтверждённая цепочка атаки:

  1. Пользователь с ролью Contributor сохраняет созданные метаданные фото платформы в принадлежащем ему отзыве.
  2. Администратор публикует отзыв и обычную запись, которая его отображает.
  3. Плагин выводит созданное значение как часть тега изображения.
  4. JavaScript выполняется в источнике сайта, когда посетитель открывает опубликованную запись.

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

Воздействие

Успешная эксплуатация обеспечивает постоянное выполнение JavaScript в источнике затронутого WordPress на страницах, которые отображают созданный отзыв через уязвимый путь миниатюры. Код выполняется с привилегиями браузера и сессии WordPress посетителя, если таковая имеется.

Воспроизведённый путь требует публикации администратором, что объясняет метрику CVSS UI:R. В этом исследовании не были продемонстрированы неаутентифицированное внедрение, автоматическое выполнение на каждой странице сайта, повышение привилегий, кража cookie или полная компрометация сайта.

Тестируемая среда

Proof of concept был воспроизведён со следующей конфигурацией:

КомпонентКонфигурация
WordPress7.1
Strong Testimonials3.3.7, бесплатная редакция
ТемаTwenty Twenty-Five
Шаблон отображенияdefault-theme
МиниатюраВключена
PHP / ApachePHP 8.3.33 / Apache 2.4.68
База данныхMariaDB 11.4
Роль атакующегоContributor
Возможности атакующегоedit_posts=true, publish_posts=false, unfiltered_html=false

Версия 3.3.7 была точной версией, использованной в лаборатории. Публичная запись CVE определяет все версии до 3.3.11 включительно как затронутые, а версию 3.3.12 — как исправленную.

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

1. Неожиданные ключи метаданных сохраняются

В admin/class-strong-testimonials-post-editor.php метод save_details() перебирает каждую запись в отправленном массиве custom. Нераспознанный ключ попадает в общую ветку санитизации и затем сохраняется с помощью update_post_meta():

$custom = $_POST['custom'];

foreach ( $custom as $key => $value ) {
    // ...
    $sanitized_value = sanitize_text_field( $value );
    update_post_meta( $post_id, $key, $sanitized_value );
}

Настоящий обработчик выполняет проверки nonce и санитизацию для конкретных полей. Находка не полагается на обход этих проверок или редактирование чужого отзыва. Участник (Contributor) правомерно редактирует свой собственный отзыв, но передаёт зарезервированные ключи platform и platform_user_photo.

2. Проверка HTTP-статуса — это не экранирование вывода

В уязвимых версиях includes/functions-image.php читает platform_user_photo, выполняет проверку HTTP-статуса через wpmtst_is_valid_image_url() и вставляет исходную строку в HTML-атрибут:

$platform_user_photo = get_post_meta( $post_id, 'platform_user_photo', true );
if ( ! $platform_user_photo || ! wpmtst_is_valid_image_url( $platform_user_photo ) ) {
    return $img;
}

return sprintf(
    '<img src="https://raw.githubusercontent.com/rully2212/cve-2026-97286/main/%25s" %s %s/>',
    $platform_user_photo,
    $width ? "width='{$width}'" : '',
    $height ? "height='{$height}'" : ''
);

Фрагментная часть URL не отправляется на HTTP-сервер, но остаётся в строке, которая позже обрабатывается PHP. Таким образом, сервер может видеть безобидный URL, возвращающий HTTP 200, в то время как браузер получает значение, содержащее последовательность для выхода из атрибута.

3. Шаблон фронтенда доверяет сгенерированному HTML изображения

Шаблон default-theme вызывает wpmtst_get_thumbnail() и напрямую выводит возвращённую разметку изображения:

<figure class="wp-block-image wpmtst-testimonial-avatar">
    <?php echo $wpmtst_avatar_html; ?>
</figure>

Шаблон предполагает, что помощник уже сгенерировал безопасный HTML. В затронутых версиях помощник фотографий платформы не экранировал URL для своего контекста src.

Доказательство концепции

Воспроизводите эту проблему только в системе, которой вы владеете или которую вам явно разрешено тестировать.

Предварительные требования

  • Strong Testimonials <= 3.3.11 на авторизованном тестовом сайте WordPress.
  • Стандартная учётная запись Contributor.
  • Представление Display в Strong Testimonials, использующее default-theme с включёнными миниатюрами.
  • Учётная запись администратора для обычного шага публикации.

Шаги

  1. Войдите как Contributor и создайте новый черновик отзыва.

  2. Перехватите легитимный запрос сохранения POST /wp-admin/post.php с помощью перехватывающего прокси. Сохраните его полное тело формы, cookie сессии, свежий nonce WordPress, nonce плагина и ID отзыва, принадлежащего Contributor.

  3. Добавьте эти параметры в тело формы:

    custom[platform]=facebook
    custom[platform_user_photo]=http://wordpress/index.php?rest_route=/#" onerror="alert(1)" x="
    

    URL-кодированный фрагмент формы:

    &custom%5Bplatform%5D=facebook&custom%5Bplatform_user_photo%5D=http%3A%2F%2Fwordpress%2Findex.php%3Frest_route%3D%2F%23%22%20onerror%3D%22alert%281%29%22%20x%3D%22
    

    Имя хоста wordpress — это имя Docker-сервиса, используемое в локальной лаборатории. В другой авторизованной среде замените его на тестовую конечную точку, контролируемую исследователем, которая доступна из WordPress и возвращает HTTP 200. Не направляйте запросы на сторонние или чувствительные внутренние сервисы.

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