flawopen.com/Teardowns/cve-2026-87902-wordpress-page-template-path-traversal
CVE-2026-87902: WordPress पेज टेम्पलेट पाथ ट्रैवर्सल
बिना सत्यापन वाला डिकोड किया पेज नाम टेम्पलेट चयन में पहुँचा, जिससे बिना प्रमाणीकरण स्थानीय PHP फ़ाइल शामिल हो सकती थी। RCE के लिए विशेष थीम और PHP स्थितियाँ आवश्यक हैं।[1]
एक ऐसे पुस्तकालयाध्यक्ष की कल्पना करें जो किताब लेने से पहले अनुरोध जाँचता है। WordPress ने एक टेम्पलेट रास्ता जाँचा, लेकिन डिकोड किए नाम वाला रास्ता छोड़ दिया। विशेष पाथ संकेत थीम निर्देशिका से बाहर ले जा सकते थे। सुधार नाम को जाँचता है और टेम्पलेट को अनुमत निर्देशिका में रखता है।[1], [2], [3]
इस पेज के मुख्य शब्द
पेज टेम्पलेट चयन- WordPress PHP उम्मीदवारों को क्रम देता है और सक्रिय थीम में पहला मेल खोजता है।[1], [2]
पाथ ट्रैवर्सल- इनपुट जाँचे बिना
..जैसे घटक निर्धारित निर्देशिका से बाहर जा सकते हैं।[1] स्थानीय PHP शामिल करना- सर्वर पर पहले से मौजूद PHP फ़ाइल लोड होती है; RCE के लिए अन्य शर्तें चाहिए।[1]
`validate_file()`- WordPress फ़ंक्शन जो उपयोग से पहले निषिद्ध पाथ घटकों को अस्वीकार करता है।[3]
फ्रेमवर्क मैपिंग
- इस गाइड में बताई गई कमजोरी के लिए CWE संदर्भ: CWE-98
- CISA KEV — जोड़ा गया 2026-09-25 — CVE-2026-87902
मूल कारण विश्लेषण (Root Cause)
get_page_template() में WordPress pagename को डिकोड करके page-{name}.php जोड़ता था, पर प्रभावित संस्करण में validate_file() नहीं चलाता था; पास की शाखा में यह जाँच थी। इससे पाथ थीम से बाहर जा सकता था। page-* शीर्ष-स्तरीय निर्देशिका और पढ़ने योग्य स्थानीय PHP आवश्यक हैं; RCE के लिए अतिरिक्त PHP/सर्वर शर्तें चाहिए। 7.1.2 डिकोड मान जाँचता है और locate_template() में पाथ सीमित करता है। WordPress की सलाहिका इस कमजोरी को CWE-98 (PHP include/require में उपयोग होने वाले फ़ाइल नाम का अनुचित नियंत्रण) के रूप में वर्गीकृत करती है और खोज तथा जिम्मेदार प्रकटीकरण का श्रेय Robert Ressl को देती है।[1], [2], [3], [7]
CVE-2026-87902 की पहुँच-शर्तें: असर और सशर्त RCE
| डिप्लॉयमेंट की शर्त | प्राथमिक स्रोत क्या प्रमाणित करते हैं | ऑपरेटर की कार्रवाई |
|---|---|---|
| प्रभावित WordPress Core शाखा | GHSA प्रभावित संस्करणों को शाखा के अनुसार सूचीबद्ध करता है: 4.7.0–4.7.36 से 7.1.0–7.1.1 तक। संबंधित सुधार 4.7.37 (सबसे पुराना backport) से 7.1.2 (वर्तमान शाखा) तक हैं; हर सूचीबद्ध शाखा के लिए अलग सुधारा हुआ संस्करण है। | इंस्टॉल किए गए Core संस्करण को जाँचें और उसी शाखा का सुधार लागू करें। 4.7 से पुराने संस्करण को समर्थित रिलीज़ पर अपग्रेड करें। |
| सक्रिय थीम की बनावट | सक्रिय parent या child theme में ऊपर के स्तर पर ऐसा directory होना चाहिए जिसका नाम page- से शुरू हो (उदाहरण: page-templates)। | सक्रिय parent और child theme दोनों के directories जाँचें। सक्रिय theme बदलने पर इस शर्त को फिर से जाँचें। |
| पढ़ने योग्य स्थानीय PHP फ़ाइल | चुनी गई .php फ़ाइल सक्रिय theme directories के बाहर मौजूद होनी चाहिए और web-server खाते से पढ़ी जा सकनी चाहिए। | जाँचें कि web server किन स्थानीय PHP फ़ाइलों को पढ़ सकता है; केवल CVE की संस्करण-सीमा फ़ाइल शामिल होने का प्रमाण नहीं है। |
| सशर्त RCE का वातावरण | advisory में RCE केवल अतिरिक्त PHP/server शर्तों के साथ बताया गया है। उदाहरणों में register_argc_argv=On पर pearcmd.php, आधिकारिक PHP Docker image, और PHP 8.5 से पुराने संस्करण वाला default cPanel configuration शामिल हैं। | वास्तविक PHP runtime और configuration का आकलन करें। केवल प्रभावित WordPress संस्करण से RCE या compromise साबित नहीं होता। |
हमले का चरण-दर-चरण प्रवाह
इनपुट टेम्पलेट चयन तक पहुँचे
बिना प्रमाणीकरण अनुरोध उम्मीदवार बनाने वाला नाम देता है; खाता या क्लिक आवश्यक नहीं।[1]
खोज मूल निर्देशिका से बाहर
page-* निर्देशिका और पढ़ने योग्य PHP मौजूद हों तो थीम बाहर की फ़ाइल हल कर सकती है।[1]
प्रभाव सशर्त है
RCE के लिए अतिरिक्त PHP/सर्वर स्थितियाँ चाहिए; केवल संस्करण शोषण या समझौता सिद्ध नहीं करता।[1]
सोर्स कोड: कमज़ोर बनाम सुरक्षित कार्यान्वयन
यह अंश आधिकारिक 7.1.1 और 7.1.2 स्रोत टैग की तुलना करता है। पैच डिकोड के बाद मान जाँचता है; उसी रिलीज़ में locate_template() के पाथ भी सीमित हैं। यह upstream स्रोत बदलाव है, पूर्ण स्वतंत्र पैच या शोषण प्रदर्शन नहीं।[2], [3]
सोर्स अंश: wp-includes/template.php — get_page_template()
if ( $pagename ) {
$pagename_decoded = urldecode( $pagename );
if ( $pagename_decoded !== $pagename ) {
$templates[] = "page-{$pagename_decoded}.php";
}
}
if ( $pagename ) {
$pagename_decoded = urldecode( $pagename );
if ( $pagename_decoded !== $pagename && 0 === validate_file( $pagename_decoded ) ) {
$templates[] = "page-{$pagename_decoded}.php";
}
}
इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट
- ✓अपनी शाखा के ठीक किए गए संस्करण पर अपग्रेड करें और वास्तव में चल रहे कोड की पुष्टि करें।[1], [4]
- ✓इंटरनेट पर खुले WordPress की सूची बनाएँ और समर्थन से बाहर 4.7 से पुराने संस्करण खोजें।[1], [4]
- ✓पैच से पहले खुली साइटों के लॉग, अनपेक्षित PHP फ़ाइलें और खाते जाँचें; संकेत अकेले प्रमाण नहीं है।
- ✓कस्टम रिज़ॉल्वर में डिकोड के बाद पाथ घटक जाँचें और वास्तविक पाथ को अनुमत निर्देशिकाओं में सीमित करें।[1], [3]
- ✓Core और थीम समर्थित रखें; सक्रिय थीम बदलने से शर्तें बदल सकती हैं।[1], [4]