Уведомление о безопасности Content Views
Если вы получили от меня письмо со ссылкой на эту страницу, значит ваш сайт, по всей видимости,
использует версию плагина Content Views – Post Grid & Filter (плагин WordPress от Content
Views / PT Guy, который лежит у вас в файлах по пути
/wp-content/plugins/content-views-query-and-display-post-page/), попадающую в затронутый
диапазон известной проблемы безопасности. На этой странице описано, в чём состоит проблема, как
определить, насколько она значима для вашего сайта, как проверить свою версию, не будучи
введённым в заблуждение, и как обновиться.
Речь идёт о CVE-2026-15361: SQL-инъекции в обработке предпросмотра плагином. Она затрагивает все выпуски до версии 4.5 и исправлена в 4.5, выпущенной 28 июля 2026 года. Если у вас установлена версия старше 4.5, обновите Content Views до 4.5.1 или новее, являющейся текущим выпуском на момент написания (4 августа 2026 года). Для этой проблемы не опубликована оценка CVSS, поэтому я не буду её называть, и мне неизвестен какой-либо публично доступный код эксплойта для неё.
Более старой безопасной версии не существует. Это не изъян, который появился где-то в середине истории плагина и был впоследствии исправлен. Я проверил каждый опубликованный релизный тег в истории плагина, от самого раннего, датированного 2014 годом, до версии 4.4 включительно, и затронутый код присутствует во всех них. «Моя установка слишком старая, чтобы быть затронутой» здесь не работает как оправдание. Единственные версии, которые не затронуты, это 4.5 и новее.
Прежде всего, оговорка, которая определяет, насколько это важно для вашего сайта, потому что я предпочитаю сразу её обозначить, а не позволить уведомлению звучать серьёзнее, чем оно есть на самом деле: этим изъяном может воспользоваться только тот, кто вошёл в систему на вашем сайте. Не имеет значения, что обычно может делать его учётная запись, достаточно самой низкой роли WordPress, но учётная запись у него быть обязана. Поэтому вопрос, который определяет вашу подверженность риску, это не какая-либо настройка плагина, а кто может получить учётную запись на вашем сайте. Я могу узнать версию вашего плагина из публичного файла и увидеть, отдаёт ли WordPress свою стандартную страницу регистрации, но я не могу увидеть, у кого есть учётные записи на вашем сайте, поэтому это уведомление является предупреждением на всякий случай, а не подтверждённой находкой о вас.
Обратите внимание, чем эта оговорка не является. Нет ни настройки для отключения, ни функции для снятия с публикации, ни конфигурации, которая выводила бы вас из зоны риска. Затронутый обработчик регистрируется при каждой установке затронутой версии, независимо от того, размещали ли вы когда-либо сетку постов на странице. Если вы будете искать галочку, которую можно снять, вы её не найдёте, потому что её не существует. Исправлением является обновление.
Пару слов о срочности, поскольку это условное уведомление. Если единственный, у кого есть учётная запись на сайте, это вы, и больше никто не может её получить, обновление является обычным плановым обслуживанием плагина. Если ваш сайт принимает регистрации от других людей, пожалуйста, отнеситесь к этому как к приоритетной задаче, и учтите, что регистрация принимает больше форм, чем очевидная: магазин на WooCommerce, плагин для управления членством или форумом, блог с несколькими авторами и отдельная страница регистрации создают учётные записи без какого-либо участия собственной регистрационной формы WordPress.
Если у вас открыта для посетителей стандартная страница регистрации WordPress, а она вам не нужна, разумным промежуточным шагом будет её отключить, поскольку это сужает круг тех, кто может добраться до этой проблемы. При этом, пожалуйста, не считайте это полным решением проблемы. Закрытие регистрации закрывает лишь одну из нескольких дверей к учётной записи и никак не затрагивает уже существующие учётные записи. Именно обновление плагина фактически устраняет проблему.
Также стоит точно обозначить, чем эта проблема является, а чем нет. Она позволяет тому, у кого есть учётная запись с низкими правами, читать данные из базы данных вашего сайта, которые его учётная запись не должна видеть. Это стоит исправить, поскольку база данных WordPress хранит такие вещи, как адреса электронной почты пользователей и хеши паролей, а на некоторых сайтах также записи участников или клиентов. Но это не захват прав администратора, это не способ выдать себе учётную запись администратора, и это не удалённое выполнение кода. Это более узкая проблема, чем случаи полной компрометации, о которых я пишу в других материалах, и я предпочитаю честно обозначить масштаб, чем оставить у вас впечатление более пугающее, чем это оправдано фактами.
Это изъян плагина, а не ядра WordPress. Полностью обновлённый WordPress не защитит вас, если сам плагин Content Views остаётся на затронутой версии.
Это письмо настоящее?
Да. Это добросовестное уведомление в рамках ответственного раскрытия от независимого исследователя безопасности. Я не прошу у вас денег, паролей или доступа к сайту и не пытался в него проникнуть, зарегистрироваться на нём или что-либо эксплуатировать.
Всё, что я сделал, это посмотрел страницы и файлы, которые ваш сайт отдаёт любому посетителю (так же, как публична ваша главная страница), и отметил номер версии, который публикует плагин. Одной из страниц, которые я прочитал, была стандартная страница регистрации WordPress вашего сайта, чтобы увидеть, открыта ли она для посетителей, и чтение этой страницы было единственным, что я с ней сделал. Я специально не отправлял эту форму, не создавал учётную запись, не входил в систему и не отправлял ничего в затронутую функцию. Ничто в этой проверке не затрагивает ваши данные, вашу панель управления или какую-либо закрытую часть сайта (подробнее ниже, в разделе Что я делал и чего не делал).
Если вы хотите убедиться, кто я, контактные данные приведены внизу этой страницы и на странице Обо мне.
Почему это важно
Content Views создаёт на вашем сайте сетки, списки и слайдеры постов, чтобы вы могли отображать отфильтрованную подборку записей или страниц без написания кода. Частью того, как он это делает, служит обработчик запроса, который отрисовывает предпросмотр сетки на основе переданных ему настроек.
В затронутых версиях этот обработчик проверяет токен безопасности и на этом останавливается. Он никогда не проверяет, разрешено ли отправителю запроса им пользоваться, а сам токен не является секретом: плагин публикует его для каждого посетителя сайта. Затем обработчик строит запрос к базе данных из настроек, взятых прямо из запроса. Следствие в том, что тот, у кого есть не более чем учётная запись с самыми низкими правами на вашем сайте, может управлять этим запросом и прочитать из вашей базы данных данные, которые его учётной записи видеть не положено.
Повторю предварительное условие, поскольку это как раз та часть, которую легче всего понять неверно в любую сторону: учётная запись, а не настройка. Для того чтобы обработчик стал достижим, ничего включать не нужно, и нет настройки, которая выводила бы затронутую версию из зоны риска. Всё, что стоит между затронутой установкой и этой проблемой, это просто то, может ли кто-то, кроме вас, войти в систему. На сайте, где зарегистрироваться может кто угодно, это не такое уж препятствие. На сайте, где пользователь только вы, это настоящий барьер.
И обратная сторона, которая важна не меньше: сайт с закрытой регистрационной формой WordPress не становится тем самым безопасным. Учётные записи появляются множеством путей, и достаточно любого из них.
Я описываю это на том уровне, который нужен владельцу сайта, чтобы действовать, и не глубже. Я не публикую подробностей, которые позволили бы кому-то это воспроизвести, и прошу вас не пробовать это ни на своём сайте, ни на чужом. Проверка номера вашей версии, как описано ниже, даёт всё необходимое, чтобы решить, что делать.
Если в моём письме упоминалась эта проблема, значит версия, о которой сообщает ваш сайт, старше 4.5. Я не проверял, эксплуатируем ли именно ваш сайт, и не могу увидеть, у кого на нём есть учётные записи. Всё, что я наблюдал, это версия и то, отдаётся ли посетителям ваша страница регистрации.
Затронут ли я?
Всё сводится к одному вопросу: какая у вас версия Content Views?
Пару слов о том, какой именно это плагин, поскольку название используется не только им. Это
уведомление касается бесплатного плагина, опубликованного на WordPress.org, папка которого
называется content-views-query-and-display-post-page. Тот же разработчик отдельно продаёт
линейку Pro. Если папка вашего плагина именно такая, читайте дальше.
Из панели управления WordPress (главный источник):
- Войдите в консоль WordPress (обычно по адресу
yourdomain.com/wp-admin). - Перейдите в Плагины, затем Установленные плагины.
- Найдите Content Views – Post Grid & Filter, запись, папка которой называется
content-views-query-and-display-post-page, и посмотрите версию, указанную под её названием.
Из публичного манифеста (без входа в систему): откройте в браузере
yourdomain.com/wp-content/plugins/content-views-query-and-display-post-page/README.txt
и прочитайте строку Stable tag: ближе к началу файла. Это один из двух публичных
источников, которые я читал.
Обратите внимание на заглавные буквы в этом имени файла. Плагины WordPress обычно поставляют
файл в нижнем регистре, readme.txt, и именно такой адрес большинство вводит по привычке. Пакеты
4.x этого плагина поставляют файл как README.txt, заглавными буквами, поэтому на хостинге,
чувствительном к регистру, адрес в нижнем регистре возвращает 404, и кажется, будто файла там нет.
Он там есть. Прежде чем делать выводы, попробуйте написание заглавными буквами.
Из исходного кода вашей страницы (без входа в систему): откройте исходный код своей главной страницы и найдите собственные клиентские файлы плагина строго по следующим путям:
/wp-content/plugins/content-views-query-and-display-post-page/public/assets/js/cv.js?ver=...
/wp-content/plugins/content-views-query-and-display-post-page/public/assets/css/cv.css?ver=...
Число после ?ver= у этих файлов и есть собственная версия плагина. При стандартной
установке они загружаются на каждой странице внешней части сайта, независимо от того, есть ли на
ней сетка постов, поэтому обычно достаточно вашей главной страницы. На очень старых установках те
же два файла называются public.js и public.css, и к ним применяется то же правило.
Ловушка, которой здесь стоит избегать, и в неё легко попасть. Этот плагин поставляет вместе с
собой копии нескольких сторонних библиотек внутри собственной папки плагина, и у каждой из них
собственный, совершенно не связанный номер версии. В исходном коде вашей страницы может
обнаружиться Bootstrap версии 3.3.5 или 3.3.0, Select2 версии 3.4.5, html5shiv версии 3.7.0,
respond.js версии 1.4.2 и bootstrap-paginator версии 0.5, и все они будут находиться по путям,
начинающимся с папки плагина Content Views. Оператор, который ищет в исходном коде страницы папку
плагина и читает первое попавшееся значение ?ver=, легко может решить, что версия плагина
«3.3.5», а затем ломать голову, как это соотносится с 4.5. Это никак не соотносится. Число вроде
3.3.5 или 0.5 на пути bootstrap или select2 относится к версии совершенно другого программного
компонента. Читайте версию только с cv.js или cv.css (либо public.js / public.css на очень
старой установке), и игнорируйте любой другой ?ver= на странице.
Если вам вообще не удаётся получить читаемый номер из исходного кода страницы, это обычное дело и
ни о чём не говорит: плагины кеширования и оптимизации нередко удаляют значение ?ver= из
адресов файлов или объединяют файлы в один общий скрипт. В этом случае надёжным публичным
источником является README.txt, а экран в панели управления из первого способа проверки всегда
даёт ответ.
Затем примените это правило, учитывая, что версии сравниваются численно, а не по алфавиту, так что 4.10 будет новее, чем 4.9, даже если как текст это выглядит меньшим числом:
- Всё, что старше 4.5: затронуто. Обновляйтесь. Нет такой границы, ниже которой более старый выпуск снова становится безопасным.
- 4.5 или новее: уже исправлено в части этой проблемы. Текущим выпуском на момент написания является 4.5.1, и лучше всего установить самую свежую доступную версию.
Как обновиться
Плагин бесплатный, по-прежнему опубликован и активно поддерживается, так что исправление сводится к обычному обновлению. Самый безопасный путь: обновиться средствами самого WordPress, предварительно сделав резервную копию.
- Сделайте резервную копию сайта (файлы и базу данных), прежде чем что-либо менять. Большинство хостинг-провайдеров предлагают резервное копирование в один клик, либо воспользуйтесь плагином резервного копирования для WordPress.
- В панели управления WordPress перейдите в Консоль, затем Обновления, либо в Плагины, затем Установленные плагины. Если обновление Content Views есть в списке, установите его отсюда.
- Если вам удобнее командная строка, WP-CLI делает то же самое:
wp plugin update content-views-query-and-display-post-page(команда использует имя папки, а не отображаемое название). - Если обновление не появляется, последний выпуск можно взять напрямую со страницы плагина в каталоге WordPress.org, Content Views – Post Grid & Filter, и обновиться через Плагины, затем Добавить плагин, затем Загрузить плагин.
- После обновления подтвердите новый номер версии (4.5.1 или новее), используя описанные выше способы, и проверьте, что ваши сетки постов и любые фильтры на них по-прежнему отображаются нормально.
Раз уж вы этим занялись, стоит убедиться, что ядро WordPress и остальные ваши плагины тоже обновлены, поскольку тот же принцип относится ко всем.
После обновления
Обновление до 4.5.1 или новее закрывает проблему, и для большинства сайтов на этом всё заканчивается. Эта страница является предупреждением на всякий случай, а не отчётом об инциденте: у меня нет возможности узнать, произошло ли что-то на вашем сайте, и я не проверял.
Стоит сделать две небольшие вещи, пока обновление ещё свежее:
- Подтвердите, что версия действительно изменилась, используя тот из описанных выше способов проверки, который вам удобнее, и откройте страницу, где отображается одна из ваших сеток постов, чтобы убедиться, что она по-прежнему отображается.
- Если у вас была открыта регистрация WordPress и она вам не нужна, подумайте о том, чтобы её закрыть. Это общая гигиена, а не исправление этой проблемы, которую уже устранило обновление, и стоит помнить, что другие плагины на вашем сайте всё равно могут создавать учётные записи.
Вы заметите, что на этой странице нет чек-листа «считайте, что вас скомпрометировали», и это сделано намеренно, а не по недосмотру. Эта проблема даёт лишь достижимое чтение базы данных с учётной записи с низкими правами. Она не передаёт никому учётную запись администратора и не запускает код на вашем сервере, поэтому проверка администраторов и смена паролей, которые я рекомендую после изъянов класса «захват сайта», здесь были бы непропорциональны. Обновитесь, подтвердите и продолжайте работу.
Что я делал и чего не делал
Чтобы полностью прояснить, на чём основана проверка за моим письмом, вот она целиком. Я читал страницы и файлы, которые ваш сайт и так отдаёт каждому посетителю:
- вашу главную страницу и адреса файлов, указанные на ней;
- публичный файл
README.txtплагина внутриwp-content/plugins/content-views-query-and-display-post-page/; - стандартную страницу регистрации WordPress вашего сайта по адресу
/wp-login.php?action=register, чтобы увидеть, открыта ли она для посетителей. Это опубликованная страница, и чтение этой страницы было единственным, что я сделал.
Я не отправлял эту регистрационную форму, не создавал учётную запись и не входил в систему на вашем сайте. Я не отправлял ничего в затронутую функцию. Именно на этом последнем пункте я хочу расставить акценты предельно ясно: проблема представляет собой точку внедрения SQL-инъекции, а отправка полезной нагрузки в чужую базу данных не относится к тому, чем этот проект занимается, ни в лаборатории, ни на практике. Ничего не было отправлено, протестировано или проэксплуатировано, и ничто не коснулось вашей панели управления WordPress, вашей базы данных или какой-либо закрытой части сайта.
Я также намеренно не публикую подробностей, которые помогли бы кому-то воспользоваться этой проблемой. Описание выше останавливается на уровне, нужном владельцу сайта, и я не даю ссылок ни на какой демонстрационный код.
Это наблюдение по версии: ваш сайт сообщает версию старше 4.5. Это не утверждение, что ваш сайт был эксплуатируем на момент проверки. Поскольку для использования этой проблемы требуется, чтобы кто-то был авторизован в системе, а увидеть, у кого есть учётные записи на вашем сайте, я не могу, сайт из затронутого диапазона вполне может быть вообще не уязвим, а также отдельно может быть защищён другими средствами, например межсетевым экраном веб-приложений или бэкпортированным исправлением.
У меня нет вебмастера / я не справляюсь
Если сайтом занимаетесь не вы, перешлите, пожалуйста, эту страницу тому, кто им занимается (вашему веб-разработчику, агентству или хостинг-провайдеру). Шаги выше он узнает сразу.
Если вы ведёте сайт сами и застряли, я с удовольствием бесплатно подскажу вам направление. Напишите по контактам ниже.
Контакты
Evan Harris, исследователь безопасности
- Эл. почта: security@mail.mcpsec.dev
- X: @Evan__Harris
- GitHub: eharris128
- LinkedIn: Evan Harris
Я обращаюсь по таким вопросам исключительно ради того, чтобы помочь операторам защитить свои сайты. Если вы предпочитаете больше не получать от меня писем, просто сообщите, и я это учту.
Источники
Официальные бюллетени и отслеживание
Разработчик / плагин
</content>