
WordPress CVE-2026-87902 LFI-to-RCE टूलकिट, जिसमें एक weaponized exploit chain (PEAR RCE, webshell, admin creation, loot) और एक non-intrusive SafeChecker संस्करण तथा risk auditor शामिल है।

केवल नैतिक उपयोग हेतु – अधिकृत सुरक्षा परीक्षण
यह रिपॉज़िटरी केवल अधिकृत सुरक्षा पेशेवरों, ब्लू टीमों और पेनिट्रेशन टेस्टरों के लिए उपकरण प्रदान करती है।
कंप्यूटर सिस्टम तक अनधिकृत पहुँच CFAA (US), Computer Misuse Act (UK), TCK 243/244 (Turkey), और दुनिया भर के समान कानूनों के तहत अवैध है।
CVE‑2026‑87902 WordPress Core (संस्करण 4.7.0 से 7.1.1 तक) में एक गंभीर अनधिकृत पथ ट्रैवर्सल और लोकल फ़ाइल इन्क्लूज़न (LFI) भेद्यता है, जो एक अनधिकृत हमलावर को pagename क्वेरी पैरामीटर के माध्यम से मनमानी स्थानीय .php फ़ाइलों को शामिल करने की अनुमति देती है, और विशिष्ट सर्वर स्थितियों के तहत PEAR pearcmd.php फ़ाइल को श्रृंखलाबद्ध करके रिमोट कोड एक्ज़ीक्यूशन (RCE) तक बढ़ा सकती है। CVSS स्कोर: 9.2 (गंभीर)। जुलाई 2026 में WordPress के HackerOne कार्यक्रम के माध्यम से Robert Ressl द्वारा प्रकट किया गया। 22 सितंबर, 2026 को 7.1.2 में पैच किया गया, जिसमें 4.7 तक बैकपोर्ट शामिल हैं।
यह दोष 2016 से प्रत्येक WordPress रिलीज़ को प्रभावित करता है — एक दशक के संस्करण जो बिना पता चले कोड समीक्षा से गुज़रे। मूल कारण CMS में सबसे अधिक ट्रैवर्स किए गए कोड पथों में से एक में एकल अनुपस्थित सत्यापन कॉल है।
असैनिटाइज़्ड टेम्पलेट रिज़ॉल्यूशन – wp-includes/template.php में get_page_template() pagename क्वेरी वेरिएबल से टेम्पलेट उम्मीदवार बनाता है। उसी फ़ंक्शन में एक पड़ोसी कोड पथ ../ अनुक्रमों को अवरुद्ध करने के लिए validate_file() लागू करता है, लेकिन $pagename शाखा इसे कॉल नहीं करती। pagename में कोई भी ट्रैवर्सल बिना जाँच के पास हो जाता है।
डबल-एन्कोडेड ट्रैवर्सल बायपास – WordPress pagename पर sanitize_title_for_query() लागू करता है, जो ट्रैवर्सल को रोकने के लिए शाब्दिक बिंदुओं (.) को हाइफ़न से बदल देता है। लेकिन यह फ़ंक्शन पहले से डिकोड किए गए इनपुट पर काम करता है और पुनरावर्ती रूप से डिकोड नहीं करता। एक हमलावर %252e%252e%252f भेजता है; वेब सर्वर इसे एक बार %2e%2e%2f में डिकोड करता है; सैनिटाइज़र को कोई शाब्दिक बिंदु नहीं दिखता और इसे पास कर देता है; फिर get_page_template() फ़ंक्शन के अंदर urldecode() को फिर से कॉल करता है, जिससे ../ उत्पन्न होता है।
थीम डायरेक्टरी पूर्वशर्त – सक्रिय थीम में एक शीर्ष-स्तरीय डायरेक्टरी होनी चाहिए जिसका नाम page- से शुरू होता है (जैसे page-templates/)। निर्मित फ़ाइलनाम page-{pagename}.php फिर ट्रैवर्सल के माध्यम से थीम रूट से बाहर निकल जाता है। पुरानी डिफ़ॉल्ट थीम (Twenty Twelve, Twenty Fourteen) और लोकप्रिय तृतीय-पक्ष थीम (Neve, Hestia, Sydney) यह डायरेक्टरी शिप करती हैं। ऐसे पैरेंट से विरासत में मिली चाइल्ड थीम भी पूर्वशर्त को पूरा करती हैं।
locate_template() में LFI सिंक – उम्मीदवार पथ locate_template() को पास किया जाता है, जो थीम डायरेक्टरियों में खोजता है। चूँकि ट्रैवर्सल उन डायरेक्टरियों के बाहर एक फ़ाइल को हल करता है, और फ़ंक्शन केवल file_exists() की जाँच करता है, कोई भी पठनीय .php फ़ाइल पूर्ण वेब सर्वर विशेषाधिकारों के साथ शामिल की जाती है। यह LFI को थीम पूर्वशर्त को पूरा करने वाली किसी भी अनपैच्ड साइट पर बिना शर्त बनाता है — जिसमें इसके डेटाबेस क्रेडेंशियल और प्रमाणीकरण साल्ट के साथ wp-config.php भी शामिल है।
PEAR pearcmd.php RCE एस्केलेशन – PEAR कई PHP इंस्टॉलेशन के साथ आता है। इसका pearcmd.php सामान्यतः केवल CLI है, लेकिन जब register_argc_argv=On होता है, तो PHP URL क्वेरी स्ट्रिंग से $_SERVER['argv'] को पॉप्युलेट करता है। हमलावर LFI के माध्यम से pearcmd.php को शामिल करता है, config-create को एक आर्गुमेंट के रूप में पास करता है, और PHP कोड प्लस एक आउटपुट पथ (/tmp/shell.php) प्रदान करता है। PEAR हमलावर के कोड को डिस्क पर लिखता है; एक दूसरा इन्क्लूड इसे निष्पादित करता है।
दूसरा शोषण मार्ग – name (फ्रंट-पेज स्लग), page_id (पोस्ट-पेज ID), preview=true, और एक pagename पेलोड को मिलाने वाला अनुरोध WP_Query को उसकी post_name शाखा में मोड़ देता है, जो sanitize_title_for_query() के माध्यम से pagename को कभी रीराइट नहीं करती। यह ट्रैवर्सल में शाब्दिक बिंदुओं की अनुमति देता है। single.php के बिना एक थीम की आवश्यकता है।
सर्वर कॉन्फ़िगरेशन आवश्यकताएँ – RCE वास्तविक परिनियोजनों में सामान्य दो स्थितियों पर निर्भर करता है: pearcmd.php मौजूद/पठनीय (साझा होस्टिंग, cPanel, आधिकारिक PHP Docker इमेज पर लगातार), और register_argc_argv=On (PHP 8.5 से नीचे डिफ़ॉल्ट)। PHP 8.5 ने डिफ़ॉल्ट को Off में बदल दिया। PEAR के बिना आधुनिक PHP 8.5+ सर्वर पर, शोषण LFI पर रुक जाता है।
पैच – WordPress 7.1.2 दो सुरक्षा परतें जोड़ता है: (a) pagename शाखा में अनुपस्थित validate_file() कॉल, और (b) एक नया _wp_is_template_path_allowed() फ़ंक्शन जिसे locate_template() द्वारा प्रत्येक हल किए गए टेम्पलेट के लिए कॉल किया जाता है। यह फ़ंक्शन .. वाले पथों को अस्वीकार करता है, फिर realpath() के माध्यम से वास्तविक पथ को हल करता है और सत्यापित करता है कि यह अनुमत थीम डायरेक्टरियों में से एक के अंदर है। यह डिफेंस-इन-डेप्थ सिंक को बंद करता है, न कि केवल उस तक के एक मार्ग को।
जंगल में सक्रिय शोषण – पैच रिलीज़ के 5 घंटे बाद पहले दुर्भावनापूर्ण अनुरोध देखे गए (17:44 UTC, 22 सितंबर, 2026)। अगले दिन में ट्रैफ़िक दस गुना बढ़ गया। तीन चरण देखे गए: config-show टोह → कोर-फ़ाइल डिटेक्शन → config-create हथियारीकरण। पेलोड फ़ाइलनामों में wp-pear-rce-flag.php, poc87902.php, luci_*.php, zeta_*.php शामिल थे, जो /tmp और /var/tmp में लिखे गए। हमलावर IP: 169.58.48.193, 169.58.48.195, 2001:df1:e8c0::106b।
प्रभाव – वेब सर्वर विशेषाधिकारों के साथ कोड निष्पादन। पूर्ण साइट अधिग्रहण, wp-config.php क्रेडेंशियल चोरी, डेटा निकासी, वेबशेल इंस्टॉलेशन, एडमिन उपयोगकर्ता निर्माण, रिवर्स शेल, संशोधित प्लगइन/थीम के माध्यम से सप्लाई-चेन हमले, और जुड़े सेवाओं में पार्श्व गति। CVSS 9.2 स्कोर नेटवर्क-शोषणीय, बिना-प्रमाणीकरण, उच्च-गोपनीयता/अखंडता/उपलब्धता प्रभाव को दर्शाता है। उच्च हमला जटिलता थीम और सर्वर पूर्वशर्तों को दर्शाती है, लेकिन सामान्य साझा होस्टिंग पर वे स्थितियाँ अक्सर पूरी होती हैं।
page-* डायरेक्टरी का नाम बदलें या हटा दें, php.ini में register_argc_argv=Off सेट करें, और WAF स्तर पर pagename पैरामीटर में डबल-एन्कोडेड ट्रैवर्सल को अवरुद्ध करें।