VPSРейтинг
Безопасность1 ноября 2026 · 9 мин

CVE-2026-9843: удаление файлов через плагин форм WordPress — как проверить и закрыть

Популярный плагин, который сохраняет в базу заявки с форм Contact Form 7, WPforms и Elementor, до версии 1.5.1 включительно позволяет удалить на сервере любой файл — в том числе wp-config.php, после удаления которого сайт можно перехватить. Заявку-ловушку отправляет кто угодно, без входа на сайт. Ниже — как за минуту понять, стоит ли плагин у вас, и три разных способа закрыть дыру, от самого быстрого до варианта «обновиться нельзя».

Кратко, если нет времени читать

  • Что уязвимо: плагин «Database for Contact Form 7, WPforms, Elementor forms» (папка и имя в WP-CLI — contact-form-entries), все версии до 1.5.1 включительно.
  • Чем опасно: неавторизованный посетитель сохраняет заявку с подделанным путём к файлу; когда администратор открывает её в админке, файл удаляется. Удаление wp-config.php ведёт к захвату сайта. Оценка опасности — 8.1 из 10.
  • Как проверить: посмотрите версию плагина — в админке на странице «Плагины», командой wp plugin get contact-form-entries --field=version или в файле плагина. Версия 1.5.1 и ниже — вы под угрозой.
  • Как закрыть: обновите плагин до последней версии (сейчас 1.5.5). Если обновиться прямо сейчас нельзя — деактивируйте плагин, это убирает уязвимость сразу.

1. Что это за уязвимость и чем она опасна

Плагин «Database for Contact Form 7, WPforms, Elementor forms» решает одну задачу: сохраняет в базу данных WordPress заявки, которые приходят через формы других плагинов. У него около 60 тысяч активных установок. В версиях до 1.5.1 включительно он недостаточно проверяет путь к файлу перед его удалением — и из-за этого посторонний человек может добиться удаления произвольного файла на сервере.

Опасность не в самом удалении, а в том, какой файл можно удалить. Если это wp-config.php — файл с паролем к базе и секретными ключами, — WordPress теряет настройки и при следующем открытии предлагает пройти установку заново. Злоумышленник, который и вызвал удаление, проходит эту установку первым, подключает сайт к своей базе и получает полный контроль. Так удаление одного файла оборачивается захватом всего сайта.

ИдентификаторCVE-2026-9843
ПлагинDatabase for Contact Form 7, WPforms, Elementor forms (contact-form-entries)
Уязвимые версии1.5.1 и все, что ниже
Исправлено в1.5.2 (ставьте последнюю — 1.5.5)
ТипВыход за пределы каталога (path traversal) → удаление произвольного файла
Оценка CVSS 3.18.1 из 10 (высокая)
Нужен ли вход на сайтНет — заявку отправляет неавторизованный посетитель
Условие срабатыванияАдминистратор открывает или сохраняет отравленную заявку

Уязвимость опубликована 20 июня 2026 года, её зарегистрировала команда Wordfence по заявке исследователя под псевдонимом daroo. К моменту публикации исправленная версия 1.5.2 уже вышла, так что обновление доступно всем.

2. Касается ли это вас: как найти плагин и версию

Проверка сводится к одному вопросу: установлен ли плагин contact-form-entries и какая у него версия. Версия 1.5.1 или ниже — вы под угрозой. Ниже три способа; выберите тот, что вам доступен. Важная деталь: название плагина в разных местах выглядит по-разному — в админке это «Contact Form Entries», в каталоге WordPress.org — длинное «Database for Contact Form 7, WPforms, Elementor forms», а в файлах и командах — короткое contact-form-entries. Это один и тот же плагин.

Способ 1. Через админку (подойдёт всем)

Войдите в панель WordPress, откройте раздел «Плагины» и найдите в списке «Contact Form Entries». Номер версии написан прямо под названием плагина. Если рядом WordPress показывает «Доступна новая версия» — значит, установленная устарела, и это само по себе повод обновиться. Если плагина в списке нет, он у вас не установлен и эта уязвимость вас не касается.

Способ 2. Через WP-CLI (точно и удобно для многих сайтов)

Если у вас есть доступ по SSH и установлен WP-CLI, зайдите в каталог сайта (туда, где лежит wp-config.php) и спросите версию напрямую:

Вернёт номер версии; если плагина нет — сообщит, что он не найден
wp plugin get contact-form-entries --field=version

Удобнее сразу увидеть и состояние, и наличие обновления одной строкой:

status — активен ли; update — available, если есть новее
wp plugin list --fields=name,status,version,update

Если сайтов на сервере много и каждый лежит в своём каталоге, пройдитесь по ним циклом — так вы за один проход увидите версию плагина на всех сайтах сразу:

Поправьте /var/www под свою структуру каталогов
for d in /var/www/*/; do
  if [ -f "$d/wp-config.php" ]; then
    echo "$d"
    wp --path="$d" --allow-root plugin get contact-form-entries --field=version 2>/dev/null || echo "  плагин не установлен"
  fi
done

Способ 3. Прямо в файлах (когда ни админки, ни WP-CLI нет)

Версию плагина можно прочитать прямо на диске — она записана в заголовке его главного файла. Сначала найдите, установлен ли плагин вообще и где именно:

Ищем папку плагина внутри каталогов plugins; при пустом ответе плагина нет
find /var/www -type d -path '*/plugins/contact-form-entries' 2>/dev/null

Для каждого найденного пути посмотрите строку Version в главном файле плагина — подставьте путь из предыдущей команды:

Напечатает, например: * Version: 1.5.1
grep -m1 -i 'version:' /var/www/site/wp-content/plugins/contact-form-entries/contact-form-entries.php

Цифры в ответе и есть установленная версия. Сравните с 1.5.1: если ваша равна ей или меньше — переходите к разделу 4 и закрывайте дыру.

3. Как это работает — коротко, чтобы реагировать правильно

Разбирать атаку по шагам здесь незачем, но общий механизм знать полезно: от него зависит, какие действия помогают, а какие бесполезны.

  • Заявку отправляет кто угодно. Форма на сайте открыта для всех, вход не нужен. В поле, куда обычно прикладывают файл, злоумышленник подставляет не файл, а путь с переходом вверх по каталогам — указатель на чужой файл за пределами папки загрузок. Плагин сохраняет это значение в базу как обычную заявку.
  • Удаление происходит при участии администратора. Файл стирается не в момент отправки формы, а когда администратор открывает или сохраняет эту заявку в панели. Поэтому атака и рассчитана на то, что вы рано или поздно заглянете в заявки.
  • Цель — удалить нужный файл. Удаление wp-config.php переводит сайт в режим установки и открывает дорогу к захвату; но вред можно нанести и стиранием других файлов.

Отсюда два практических вывода. Первый: пока плагин активен и не обновлён, не открывайте подозрительные заявки — отравленная могла быть сохранена заранее. Второй: исправленная версия добавляет строгую проверку пути перед удалением, поэтому обновление снимает угрозу полностью, а не маскирует её.

4. Быстрое решение: обновить плагин

Главное и достаточное действие — обновить плагин до версии 1.5.2 или новее. Дыру закрывает уже 1.5.2, но ставить стоит последнюю доступную версию: в выпусках после неё автор закрыл ещё несколько проблем. На момент этой статьи последняя версия — 1.5.5.

Через админку

Откройте раздел «Плагины», найдите «Contact Form Entries» и нажмите «Обновить» на его строке. Если кнопки обновления нет, а версия старая, откройте Консоль → Обновления и запустите проверку обновлений вручную — WordPress подтянет свежий список и покажет плагин там.

Через WP-CLI

На одном сайте — из его каталога:

Обновит плагин до последней версии из каталога WordPress.org
wp plugin update contact-form-entries

Сразу на всех сайтах сервера — тем же циклом, что и при проверке:

Поправьте /var/www под свою структуру каталогов
for d in /var/www/*/; do
  if [ -f "$d/wp-config.php" ]; then
    wp --path="$d" --allow-root plugin update contact-form-entries 2>/dev/null
  fi
done

Проверить, что обновление встало

После обновления убедитесь, что версия действительно сменилась — той же командой, что и при проверке:

Должно быть 1.5.2 или выше
wp plugin get contact-form-entries --field=version

В админке то же самое видно на странице «Плагины»: номер версии под названием обновится, а надпись о доступном обновлении исчезнет. Если число 1.5.2 или больше — дыра закрыта.

5. Если обновиться нельзя: деактивация и временная защита

Иногда обновить плагин сразу не выходит: сайт на старой версии WordPress, обновление ломает совместимость, подрядчик недоступен. В этом случае есть надёжная промежуточная мера — деактивировать плагин. Деактивированный плагин не подключает свой код, поэтому ни приём новых заявок, ни удаление файлов не выполняются. Уязвимость исчезает в тот же момент.

В админке это кнопка «Деактивировать» на строке плагина. Через WP-CLI — одна команда:

Данные заявок при деактивации не удаляются — остаются в базе
wp plugin deactivate contact-form-entries

Удалять плагин не нужно: деактивации достаточно, а сохранённые заявки останутся на месте. Когда появится возможность обновиться, включите плагин обратно уже на безопасной версии.

Если нельзя и деактивировать

Бывает, что плагин нужен прямо сейчас и выключить его тоже нельзя. Тогда до обновления держитесь двух правил. Во-первых, не открывайте и не сохраняйте в админке новые заявки, в происхождении которых не уверены, — именно это действие запускает удаление. Во-вторых, если перед сайтом стоит файрвол приложений (например, модуль защиты у хостинга или плагин-брандмауэр), включите в нём блокировку запросов с последовательностью ../ в значениях полей. Это не замена обновлению, а способ продержаться до него.

6. Проверить, не сработало ли уже

Закрыв дыру, стоит убедиться, что ею не успели воспользоваться. Публичных сообщений о массовой эксплуатации на момент статьи нет, но проверка занимает минуты и снимает вопрос.

Самое важное: на месте ли ключевые файлы

Главный признак успешной атаки — пропавший wp-config.php. Если сайт открывается нормально, а не предлагает пройти установку WordPress заново, этот файл на месте. Для надёжности проверьте его наличие напрямую (подставьте каталог своего сайта):

Должно напечатать путь к файлу; пустой ответ — файл отсутствует
ls -la /var/www/site/wp-config.php

Поискать заявки-ловушки в базе

Подделанное значение с переходом по каталогам сохраняется в таблице заявок плагина. Её можно просмотреть безопасным запросом только на чтение — он ничего не меняет, лишь показывает подозрительные строки:

Префикс таблиц обычно wp_ — замените на свой, если он другой
wp db query "SELECT lead_id, name, value FROM wp_vxcf_leads_detail WHERE value LIKE '%../%';"

Пустой ответ — в таком виде следов подделки не нашлось. Если строки нашлись и в поле value видны переходы ../ в пути к файлу, это заявка-ловушка: не открывайте её в админке, пока не обновили плагин, а после обновления удалите такие заявки через панель. На безопасной версии они уже не причинят вреда.

Если wp-config.php всё-таки удалён

Не проходите установку WordPress поверх рабочего сайта — так можно затереть данные и отдать сайт тому, кто и затеял атаку. Порядок другой: восстановите wp-config.php из резервной копии, затем на всякий случай смените пароль пользователя базы данных и обновите соль-ключи (секции AUTH_KEY и подобные) — их генерирует официальный сервис api.wordpress.org/secret-key/1.1/salt/. После этого обновите сам плагин, иначе дыра останется открытой.

7. Чтобы это не повторилось

Уязвимость в плагине — не редкость: это один из главных путей, которыми ломают сайты на WordPress. Отдельно взятую дыру вы закрыли, но защищает от следующей не разовое действие, а привычка.

  • Включите автообновления плагинов. На странице «Плагины» у каждого есть ссылка «Включить автообновления». Для критичного по безопасности плагина форм это разумный выбор: исправление приедет само, не дожидаясь, пока вы о нём узнаете.
  • Держите меньше плагинов. Каждый плагин — это чужой код с правами на вашем сайте. Плагины, которыми вы не пользуетесь, не деактивируйте, а удаляйте: даже выключенный плагин остаётся файлами на диске и может быть уязвим.
  • Делайте бэкапы и проверяйте их. Эта история — наглядный довод: удаление одного файла может стоить всего сайта, а резервная копия возвращает его за минуты. Копия, которую ни разу не восстанавливали, не считается рабочей, пока вы это не проверили.

Базовая защита самого сервера — SSH-ключи, файрвол, автоматическая блокировка ботов — разобрана в статье про безопасность VPS, а установка и обслуживание WordPress на своём сервере — в статье про WordPress на VPS. Про резервные копии, которые снимаются сами и хранятся отдельно от сервера, — разбор бэкапов на restic и rclone.

8. Частые вопросы

Если сайт пора переносить на свой сервер, где обновления и бэкапы в ваших руках, — тарифы под движок с базой собраны на отдельной странице.

Провайдеры под сайт на WordPress →