
CVE-2026-94504 के लिए Python PoC, जो Ninja Forms <= 3.15.3 में एक unauthenticated stored XSS है। यह कमजोर संस्करणों की पहचान करता है और nf_ajax_submit के माध्यम से एक payload इंजेक्ट करता है।
Ninja Forms अनधिकृत stored XSS POC
Ninja Forms ≤ 3.15.3 — अनधिकृत stored XSS। एक सार्वजनिक non-RTE textarea सहेजा जाता है, फिर html_entity_decode() किया जाता है और बिना esc_textarea() के legacy submission editor में लिखा जाता है। 3.15.4 इसे escape करता है। payload लगाने के लिए लॉगिन की आवश्यकता नहीं है। यह तब चलता है जब कोई editor उस submission को खोलता है।
केवल अधिकृत परीक्षण के लिए। इसे उन सिस्टमों के विरुद्ध न चलाएँ जिनके आप स्वामी नहीं हैं या जिनका परीक्षण करने की अनुमति आपके पास नहीं है।
आवश्यक: Python 3, केवल standard library।
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
| Flag | यह क्या करता है |
|---|
-u / --url | WordPress base URL (आवश्यक)। http:// या https://। बिना scheme वाला hostname पहले HTTPS के रूप में, फिर HTTP के रूप में आज़माया जाता है। http→https redirects POST बनाए रखते हैं। खराब TLS certs बिना verify के पुनः प्रयास किए जाते हैं; --insecure शुरू से ही verify छोड़ देता है |
--test | केवल fingerprint। readme.txt पढ़ता है, एक सार्वजनिक non-RTE textarea ढूँढता है। submit नहीं करता |
--plant | अनधिकृत nf_ajax_submit। आवश्यक फ़ील्ड भरता है, payload को textarea में डालता है, और edit URL प्रिंट करता है। browser नहीं खोलता |
--page | वह पृष्ठ जो form को embed करता है। डिफ़ॉल्ट रूप से /, /contact/, और REST page/post सूची को crawl करता है |
--field | Textarea field id। डिफ़ॉल्ट पहला non-RTE textarea है |
--payload | Textarea value। डिफ़ॉल्ट रूप से admin <textarea> को img onerror के साथ बंद करता है। cmd.exe में इसे single quotes में न लपेटें (< एक redirect है)। --payload छोड़ दें, या double quotes और alert के अंदर single quotes का उपयोग करें: --payload "</textarea>" |
--name / --email | अन्य आवश्यक फ़ील्ड के लिए fillers (डिफ़ॉल्ट Ada Lovelace / [email protected]) |
--insecure | TLS verify छोड़ें |
--timeout | HTTP timeout सेकंड (डिफ़ॉल्ट 30) |
--test /wp-content/plugins/ninja-forms/readme.txt (Stable tag) पढ़ता है और एक सार्वजनिक पृष्ठ जिसके nfForms JSON में "type":"textarea" है और rich-text editor बंद है। ≤ 3.15.3 के साथ वह फ़ील्ड VULNERABLE है। ≥ 3.15.4 NOT_VULNERABLE है। साइट पर कोई form न होना NEED_FORM है।
--plant /wp-admin/admin-ajax.php पर action=nf_ajax_submit को पृष्ठ के ajaxNonce के साथ post करता है। कोई WordPress account नहीं। सफलता PAYLOAD, SUB, और EDIT /wp-admin/post.php?post=ID&action=edit प्रिंट करती है। script तब चलती है जब वह submission wp-admin में खोली जाती है। सार्वजनिक form पृष्ठ नहीं।
Rich-text (textarea_rte) paragraphs एक अलग path हैं और छोड़ दिए जाते हैं। डिफ़ॉल्ट Contact Me "Message" फ़ील्ड सामान्य लक्ष्य है।
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 में patched। श्रेय: Hippolyte Quéré (Hippie); 3.15.4 changelog में admin escaping fix के लिए Venkateswara Reddy Challa का भी नाम है।

