В начале апреля 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:N | Network | Атака через сеть, никакого физического доступа |
| AC:L | Low | Нет особых условий для эксплуатации |
| PR:N | None | Аутентификация не требуется |
| UI:N | None | Жертве не нужно ничего делать |
| C:H | High | Полная компрометация конфиденциальности |
| I:H | High | Полная компрометация целостности |
| A:H | High | Полная компрометация доступности |
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-эндпоинта загрузки файлов |
| Execution | Unix Shell (T1059.004) | Выполнение команд через загруженный PHP-шелл |
| Persistence | Web Shell (T1505.003) | Установка веб-шелла в директории uploads |
| Privilege Escalation | Valid Accounts (T1078) | DB-credentials из wp-config.php для доступа к БД и другим системам |
| Defense Evasion | Obfuscated Files or Information (T1027) | Обфускация шелла для обхода WAF и сканеров |
| Defense Evasion | File Deletion (T1070.004) | Удаление логов и следов загрузки |
| Credential Access |
Ссылка скрыта от гостей
| Извлечение DB-credentials из wp-config.php |
| Command and Control | Ingress 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), убедитесь:- Включена функция «Real-Time Firewall Protection»
- Firewall работает в режиме «Extended Protection» (через
.htaccess/.user.ini) - Включена опция «Block PHP execution in uploads directory»
Анализ патча: что исправили в версии 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 содержимого файла
Харденинг: защита от несанкционированной загрузки файлов WordPress
Немедленные действия
- Обновите плагин до 3.3.27 - приоритет номер один. Проверьте версию: WordPress Dashboard → Plugins → Ninja Forms - File Uploads.
- Запретите выполнение 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:
# В секции server {} или location {}
location ~* /wp-content/uploads/.*\.php$ {
deny all;
return 403;
}
- Если немедленное обновление невозможно - временно деактивируйте расширение 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
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
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 = плагин не установлен или закрыт
- Слой 1: своевременное обновление плагинов
- Слой 2: WAF-правила, блокирующие загрузку PHP
- Слой 3: серверная конфигурация, запрещающая выполнение PHP в uploads
- Слой 4: мониторинг файловой системы и логов
- Слой 5: сетевая сегментация, ограничивающая доступ к хостинг-среде
.htaccess с php_flag engine off не даст шеллу исполниться. А если он как-то обойдёт и это - inotifywait поднимет алерт за секунды.Проверьте свой WordPress прямо сейчас:
find /var/www/html/wp-content/uploads/ -name "*.php" -ls. Если вывод непустой - у вас проблема. CVE-2026-0740 с CVSS 9.8 напоминает: один непроверенный параметр в функции загрузки файла превращает тысячи сайтов в плацдарм для атакующих. Обновляйте плагины, закрывайте выполнение PHP в директориях загрузки и мониторьте появление новых файлов.
Последнее редактирование модератором: