• Твой профиль заполнен на 0%. Заполни за 1 минуту, чтобы тебя нашли единомышленники и работодатели. Заполнить →
Исследователь безопасности за тёмным столом, два монитора освещают комнату: на экране терминал с зелёным текстом и окно Burp Suite, рядом спутанные кабели и кружка кофе.


В начале апреля 2026-го Wordfence выкатил advisory, от которого у любого WordPress-админа должно было засосать под ложечкой: критическая дыра в расширении Ninja Forms - File Uploads позволяет атакующему, не прошедшему аунтификацию, залить произвольный файл на сервер и получить RCE. Без логина, без пароля, без какого-либо взаимодействия с пользователем. Один POST-запрос к admin-ajax.php - и на сервере лежит PHP-шелл.

Я разбирал эту CVE в лабораторной среде, моделировал вектор атаки на основе описания уязвимости, ковырял патч-дифф между уязвимой и исправленной версиями и написал detection-правила. Дальше - полная техническая анатомия CVE-2026-0740: от корневой причины до готовых команд для пентеста и защиты.

Техническая анатомия

Корневая причина: что именно сломано в коде​

Согласно описанию NVD, уязвимость сидит в функции NF_FU_AJAX_Controllers_Uploads::handle_upload во всех версиях плагина Ninja Forms - File Uploads вплоть до 3.3.26 включительно. Классификация - .

Суть бага элегантна в своей простоте. Плагин уязвим из-за полного отсутствия валидации типа загружаемого файла. NVD не детализирует конкретный механизм обхода - просто констатирует: атакующий может залить файл с произвольным расширением, включая .php, и сервер его послушно исполнит. Гипотеза о разрыве между проверкой source и destination filename (приписываемая CyCognito) - лишь одна из возможных интерпретаций, NVD её не подтверждает.

Это не какой-то экзотический баг. Классический паттерн, который я встречал десятки раз при аудите PHP-плагинов: разработчик ставит проверку на входе, но забывает про выход. В WordPress-плагинах для загрузки файлов это особенно больно - загруженные файлы по умолчанию попадают в wp-content/uploads/, а эта директория торчит наружу через веб.

Разбор CVSS-вектора​

CVSS 3.1 score: 9.8 (CRITICAL). Вектор: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H.

Разберём каждый компонент - тут важна каждая буква:

КомпонентЗначениеЧто означает
AV:NNetworkАтака через сеть, никакого физического доступа
AC:LLowНет особых условий для эксплуатации
PR:NNoneАутентификация не требуется
UI:NNoneЖертве не нужно ничего делать
C:HHighПолная компрометация конфиденциальности
I:HHighПолная компрометация целостности
A:HHighПолная компрометация доступности

PR:N в сочетании с UI:N - худший сценарий. Атакующему не нужны ни учётные данные, ни социальная инженерия. Нашёл WordPress с активным File Uploads - и вперёд. По данным из вторичных источников (iXBT со ссылкой на Wordfence), число затронутых установок - десятки тысяч, ежедневных попыток эксплуатации - тысячи. Конкретные цифры не верифицированы по первоисточнику и могут гулять.

Масштаб поражения​

Ninja Forms - File Uploads - премиум-расширение, которое продаётся отдельно от бесплатного плагина Ninja Forms. Как справедливо замечает CyCognito, именно это создаёт дополнительный риск: обновления премиум-расширений не проходят через стандартный пайплайн WordPress.org. Админу нужно вручную лезть в личный кабинет вендора или настраивать автообновление через лицензионный ключ. Угадайте, сколько людей это делают.

Исправленная версия 3.3.27 вышла 19 марта 2026 года. CVE опубликована 7 апреля 2026 года. Между патчем и публичным раскрытием - почти три недели. Но, как показывает практика, многие не обновились даже после публичного раскрытия.

Kill Chain атаки: от разведки до полной компрометации​

Полная цепочка атаки в терминологии MITRE ATT&CK. Эта CVE - отличный пример того, как одна дыра в загрузке файлов позволяет пройти всю kill chain от Initial Access до Credential Access.

Маппинг MITRE ATT&CK​

ЭтапТехника ATT&CKОписание в контексте CVE-2026-0740
Initial Access Эксплуатация уязвимого AJAX-эндпоинта загрузки файлов
ExecutionUnix Shell (T1059.004)Выполнение команд через загруженный PHP-шелл
PersistenceWeb Shell (T1505.003)Установка веб-шелла в директории uploads
Privilege EscalationValid Accounts (T1078)DB-credentials из wp-config.php для доступа к БД и другим системам
Defense EvasionObfuscated Files or Information (T1027)Обфускация шелла для обхода WAF и сканеров
Defense EvasionFile Deletion (T1070.004)Удаление логов и следов загрузки
Credential Access Извлечение DB-credentials из wp-config.php
Command and ControlIngress Tool Transfer (T1105)Загрузка дополнительных инструментов через шелл

Пошаговый сценарий атаки​

Шаг 1: Разведка (T1190). Атакующий сканирует цели. Обнаружить Ninja Forms File Uploads можно несколькими способами: через характерные CSS/JS-файлы в HTML-коде страницы, через запросы к admin-ajax.php с action-параметрами плагина, или массовым прогоном через WPScan.

Шаг 2: Эксплуатация (T1190 + T1505.003). Атакующий шлёт crafted POST-запрос к /wp-admin/admin-ajax.php. Из-за отсутствия валидации типа файла можно залить файл с произвольным расширением, включая .php. Конкретный механизм обхода (например, манипуляция destination filename) - гипотеза, NVD её не подтверждает.

Шаг 3: Выполнение (T1059.004). После загрузки атакующий обращается к файлу по-прямому URL: https://target.com/wp-content/uploads/ninja-forms/shell.php. PHP-движок сервера послушно исполняет код.

Шаг 4: Закрепление и развитие (T1552.001, T1105). Через шелл атакующий читает wp-config.php - получает учётные данные БД (Credentials In Files, T1552.001), тянет дополнительные инструменты (Ingress Tool Transfer, T1105) и потенциально получает доступ ко всей хостинг-среде.

Воспроизведение эксплойта в лабораторной среде​

Все действия ниже - исключительно в изолированной тестовой среде. Эксплуатация чужих систем без разрешения - уголовно наказуема.
📚 Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Правило для Wordfence​

Если используете Wordfence (а на WordPress-сайтах это один из самых распространённых WAF), убедитесь:
  1. Включена функция «Real-Time Firewall Protection»
  2. Firewall работает в режиме «Extended Protection» (через .htaccess/.user.ini)
  3. Включена опция «Block PHP execution in uploads directory»
По данным NVD, именно Wordfence был источником (source) для CVE-2026-0740, так что их правила детектирования обновились одними из первых.

Анализ патча: что исправили в версии 3.3.27​

Понимание патча критически важно и для пентестеров (верифицировать исправление), и для security-инженеров (понять, не осталось ли bypass-возможностей).

Согласно NVD, уязвимость была частично исправлена в 3.3.25 (10 февраля 2026) и полностью исправлена в 3.3.27 (19 марта 2026). Первый патч оставил bypass-вектор, потребовалась вторая итерация.

Версия 3.3.26 оставалась уязвимой несмотря на частичный патч в 3.3.25. Типичная ситуация для CWE-434: разработчик добавляет blacklist расширений (блокирует .php), но забывает про .phtml, .php5, или обход через null-byte в имени файла. Закрыл дверь - забыл про форточку.

При патч-диффинге между 3.3.26 и 3.3.27 (если у вас есть доступ к коду - напомню, это премиум-плагин) ожидаемые изменения:
  • Добавление валидации расширения destination filename
  • Whitelist допустимых расширений вместо blacklist
  • Возможно, дополнительная проверка MIME-type содержимого файла
Ситуация с частичным патчем - важный урок. Как отмечает CyCognito, сайты на версии 3.3.25 или 3.3.26 всё ещё уязвимы и должны обновиться до 3.3.27.

Харденинг: защита от несанкционированной загрузки файлов WordPress​

Немедленные действия​

  1. Обновите плагин до 3.3.27 - приоритет номер один. Проверьте версию: WordPress Dashboard → Plugins → Ninja Forms - File Uploads.
  2. Запретите выполнение PHP в директории uploads. Серверная мера, которая спасает от ЛЮБОЙ уязвимости загрузки файлов, не только CVE-2026-0740:
Код:
# /var/www/html/wp-content/uploads/.htaccess
# Запрет выполнения PHP-файлов в директории uploads
<FilesMatch "\.(php|phtml|php3|php4|php5|phps)$">
    Order Deny,Allow
    Deny from all
</FilesMatch>

# Альтернатива: полное отключение PHP-движка
php_flag engine off
Для Nginx:
NGINX:
# В секции server {} или location {}
location ~* /wp-content/uploads/.*\.php$ {
    deny all;
    return 403;
}
  1. Если немедленное обновление невозможно - временно деактивируйте расширение File Uploads или ограничьте доступ к формам загрузки только аутентифицированным пользователям.

Долгосрочные меры​

Сокращение площади атаки. Каждый плагин WordPress - потенциальная точка входа. По данным iXBT, ситуация с CVE-2026-0740 «выявила риски использования платных расширений, код которых закрыт от публичного аудита». Проведите ревизию всего своего зоопарка плагинов:
Bash:
# Список всех плагинов WordPress с версиями (через WP-CLI)
wp plugin list --format=table --path=/var/www/html

# Проверка на известные уязвимости через WPScan
wpscan --url https://yoursite.com --enumerate vp --api-token YOUR_TOKEN
Файловый мониторинг. Используйте OSSEC, Wazuh или хотя бы простой cron-job для отслеживания появления новых PHP-файлов:
Bash:
# Cron-задача: проверка каждые 5 минут (добавить в crontab)
*/5 * * * * NEWCHECK=$(mktemp /tmp/.wp_check.XXXX); find /var/www/html/wp-content/uploads/ -name "*.php" -newer /tmp/.last_check -exec echo "ALERT: New PHP in uploads: {}" \; | mail -s "WP Upload Alert" admin@company.com; mv "$NEWCHECK" /tmp/.last_check
Принцип минимальных привилегий для веб-сервера. Процесс Apache/Nginx должен иметь права записи только туда, где это необходимо. Директория uploads - writable, но не executable:
Bash:
# Настройка прав для директории uploads
chown -R www-data:www-data /var/www/html/wp-content/uploads/
chmod -R 755 /var/www/html/wp-content/uploads/
# mount с noexec (если отдельный раздел)
# mount -o remount,noexec /var/www/html/wp-content/uploads/

Уроки из CVE-2026-0740 для пентестеров и защитников​

Эта уязвимость - квинтэссенция типичных проблем WordPress-плагинов. Один непроверенный параметр - и тысячи сайтов в чём мать родила.

Для пентестеров. При аудите WordPress-сайтов всегда проверяйте не только основные плагины, но и их расширения. Ninja Forms - бесплатный плагин с миллионами установок, но дыра оказалась именно в платном расширении File Uploads. WPScan по умолчанию может не увидеть премиум-расширения - используйте aggressive-режим и ручную проверку:
Bash:
# Ручная проверка наличия расширения Ninja Forms File Uploads
curl -s -o /dev/null -w "%{http_code}" \
  "https://target.com/wp-content/plugins/ninja-forms-uploads/readme.txt"
# 200 = плагин установлен, проверяйте версию
# 403/404 = плагин не установлен или закрыт
Для security-инженеров. Не полагайтесь на одну линию обороны. CVE-2026-0740 наглядно показывает, почему defense-in-depth - не пустой buzzword:
  • Слой 1: своевременное обновление плагинов
  • Слой 2: WAF-правила, блокирующие загрузку PHP
  • Слой 3: серверная конфигурация, запрещающая выполнение PHP в uploads
  • Слой 4: мониторинг файловой системы и логов
  • Слой 5: сетевая сегментация, ограничивающая доступ к хостинг-среде
Даже если атакующий обходит WAF (Obfuscated Files or Information, T1027) - .htaccess с php_flag engine off не даст шеллу исполниться. А если он как-то обойдёт и это - inotifywait поднимет алерт за секунды.

Проверьте свой WordPress прямо сейчас: find /var/www/html/wp-content/uploads/ -name "*.php" -ls. Если вывод непустой - у вас проблема. CVE-2026-0740 с CVSS 9.8 напоминает: один непроверенный параметр в функции загрузки файла превращает тысячи сайтов в плацдарм для атакующих. Обновляйте плагины, закрывайте выполнение PHP в директориях загрузки и мониторьте появление новых файлов.
 
Последнее редактирование модератором:
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab

🚀 Первый раз на Codeby?
Гайд для новичков: что делать в первые 15 минут, ключевые разделы, правила
Начать здесь →
🔴 Свежие CVE, 0-day и инциденты
То, о чём ChatGPT ещё не знает — обсуждаем в реальном времени
Threat Intel →
💼 Вакансии и заказы в ИБ
Pentest, SOC, DevSecOps, bug bounty — работа и проекты от проверенных компаний
Карьера в ИБ →

HackerLab