
أداة PoC بلغة Python للثغرة CVE-2026-94504، وهي ثغرة XSS مخزّنة غير مصادَق عليها في Ninja Forms <= 3.15.3. تقوم ببصم الإصدارات المصابة وتزرع حمولة عبر nf_ajax_submit.
Ninja Forms غير المصادق عليه XSS مخزن POC
Ninja Forms ≤ 3.15.3 — XSS مخزن غير مصادق عليه. يتم حفظ textarea عام غير RTE، ثم يتم html_entity_decode() له وكتابته في محرر الإرسال القديم بدون esc_textarea(). 3.15.4 يقوم بتهريبه. لا يلزم تسجيل الدخول لزرع الحمولة. يتم تشغيله عندما يفتح محرر ذلك الإرسال.
للاختبار المصرح به فقط. لا تقم بتشغيل هذا ضد أنظمة لا تملكها أو ليس لديك إذن باختبارها.
يتطلب: Python 3، المكتبة القياسية فقط.
python3 cve-2026-94504-ninja-forms-stored-xss.py -u http://TARGET --test
python3 cve-2026-94504-ninja-forms-stored-xss.py -u http://TARGET --plant
python3 cve-2026-94504-ninja-forms-stored-xss.py -u https://TARGET --test --insecure
python3 cve-2026-94504-ninja-forms-stored-xss.py -u TARGET --test
| العلم | ما يفعله |
|---|
-u / --url | عنوان URL الأساسي لـ WordPress (مطلوب). http:// أو https://. يتم تجربة اسم مضيف بدون مخطط كـ HTTPS أولاً، ثم HTTP. إعادة توجيه http→https تحافظ على POST. يتم إعادة محاولة شهادات TLS السيئة بدون التحقق؛ --insecure يتخطى التحقق من البداية |
--test | بصمة فقط. يقرأ readme.txt، يجد textarea عام غير RTE. لا يرسل |
--plant | nf_ajax_submit غير مصادق عليه. يملأ الحقول المطلوبة، يضع الحمولة في textarea، ويطبع عنوان URL للتحرير. لا يفتح متصفحاً |
--page | الصفحة التي تضم النموذج. افتراضياً يزحف إلى /، /contact/، وقائمة صفحة/مقالة REST |
--field | معرف حقل textarea. الافتراضي هو أول textarea غير RTE |
--payload | قيمة textarea. الافتراضي يغلق <textarea> الإدارية بـ img onerror. في cmd.exe لا تغلف هذا بعلامات اقتباس مفردة (< هو إعادة توجيه). احذف --payload، أو استخدم علامات اقتباس مزدوجة وعلامات اقتباس مفردة داخل alert: --payload "</textarea>" |
--name / --email | حشوات للحقول المطلوبة الأخرى (الافتراضيات Ada Lovelace / [email protected]) |
--insecure | تخطي التحقق من TLS |
--timeout | مهلة HTTP بالثواني (الافتراضي 30) |
--test يقرأ /wp-content/plugins/ninja-forms/readme.txt (Stable tag) وصفحة عامة يكون فيها JSON nfForms يحتوي على "type":"textarea" مع إيقاف محرر النص الغني. ≤ 3.15.3 بالإضافة إلى ذلك الحقل هو VULNERABLE. ≥ 3.15.4 هو NOT_VULNERABLE. لا يوجد نموذج على الموقع هو NEED_FORM.
--plant ينشر /wp-admin/admin-ajax.php action=nf_ajax_submit مع ajaxNonce الخاص بالصفحة. لا حساب WordPress. النجاح يطبع PAYLOAD، SUB، و EDIT /wp-admin/post.php?post=ID&action=edit. يتم تشغيل السكريبت عند فتح ذلك الإرسال في wp-admin. صفحة النموذج العامة لا تفعل ذلك.
فقرات النص الغني (textarea_rte) هي مسار مختلف ويتم تخطيها. حقل "Message" الافتراضي في Contact Me هو الهدف المعتاد.
Stdout: VERSION، PAGE، FORM، FIELD، PRESENT، VULNERABLE، NOT_VULNERABLE، NOT_FOUND، NEED_FORM، NEED_NONCE، PLANTED، PAYLOAD، SUB، EDIT.
CVE: CVE-2026-94504. Plugin: ninja-forms. تم إصلاحه في 3.15.4. الفضل: Hippolyte Quéré (Hippie)؛ سجل تغييرات 3.15.4 يذكر أيضاً Venkateswara Reddy Challa لإصلاح التهريب الإداري.

