Содержание статьи
W3 Total Cache — один из самых известных плагинов для WordPress, предназначен для кеширования и повышения производительности сайта. Ускоряет загрузку страниц сайта за счет кеширования различных компонентов (страницы, объекты, базы данных, браузерный кеш). Причем каждый компонент имеет свои тонкие настройки. Плагин установлен более чем на миллионе WordPress-сайтов.
warning
Статья имеет ознакомительный характер и предназначена для специалистов по безопасности, проводящих тестирование в рамках контракта. Автор и редакция не несут ответственности за любой вред, причиненный с применением изложенной информации. Распространение вредоносных программ, нарушение работы систем и нарушение тайны переписки преследуются по закону.
В этой статье мы разберем недавнюю уязвимость CVE-2025-9501, которая кроется в динамических фрагментах W3TC. Наша цель — подтвердить возможность атаки и посмотреть, почему она работает.
W3 Total Cache поддерживает так называемые динамические фрагменты — специальные маркеры mfunc и mclude, которые позволяют выполнять PHP-код или подключать файлы даже внутри полностью закешированной HTML-страницы. Эта возможность предназначена для вывода пользовательских данных (например, имени авторизованного пользователя или содержимого корзины) без отключения серверного кеширования целиком.
Если такие фрагменты не использовать или использовать некорректно, возможна типичная ошибка кеширования: персональные данные одного пользователя могут быть сохранены как статические и показаны другим. Это логическая проблема конфигурации — еще не сама уязвимость.
Суть уязвимости CVE-2025-9501 в другом. Плагин обрабатывает маркеры mfunc и mclude без жесткой привязки к источнику контента: ему неважно, были ли они добавлены разработчиком в шаблон или попали в страницу из пользовательского ввода. При определенных условиях это позволяет злоумышленнику внедрить такие маркеры и добиться выполнения произвольного PHP-кода на сервере, то есть привести к удаленному выполнению кода.
Вот пример того, как может выглядеть вставка макросов:
<?-- mfunc secret -->...PHP code...<?-- /mfunc secret --><?-- mclude secret -->./path/to/file.php<?-- /mclude secret -->Подготовка лаборатории
Для теста можешь установить любую версию WordPress. Движок никак не защищает от инъекции, поэтому в зоне риска — любой сайт с плагином W3 Total Cache версии ниже 2.18.13.
Поправь php., чтобы плагин можно было загрузить из архива. Слишком маленькие значения констант приведут к ошибке «Ссылка устарела».
upload_max_filesize = 128M
post_max_size = 128M
memory_limit = 1024M
max_execution_time = 300
max_input_time = 300
Не забудь рестартануть Apache.
Качаем плагин:
curl -LO https://downloads.wordpress.org/plugin/w3-total-cache.2.8.12.zip
И устанавливаем, загрузив архив через админку WordPress.
После активации переходим в раздел Performance. Плагин автоматически редиректит на мастер установки. Жмем Decline, чтобы отказаться от сбора данных о работе плагина. Затем найдем ссылку skip this setup guide, чтобы отключить мастер установки. В Performance → General Settings включаем Page Cache и сохраняем изменения (синяя кнопка вверху).

Теперь нужно добавить поддержку динамических фрагментов. Плагин W3TC смотрит на константу W3TC_DYNAMIC_SECURITY: если она есть, ищет вставки кода на страницах сайта. Ищем в wp-config. строку define( и добавляем перед ней
// Значение 'secretic' привел для примера. Можно указать любое значение, которое не порушит регулярное выражение функции _has_dynamic*()define('W3TC_DYNAMIC_SECURITY', 'secretic');Если нет константы WP_CACHE, проверь права на папку с WordPress. Права на папки должны быть 755, на файлы — 644. Иначе обнови права и переустанови плагин.
Продолжение доступно только участникам
Материалы из последних выпусков становятся доступны по отдельности только через два месяца после публикации. Чтобы продолжить чтение, необходимо стать участником сообщества «Xakep.ru».
Присоединяйся к сообществу «Xakep.ru»!
Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее
