FlawOpen

flawopen.com/Teardowns/cve-2026-87902-wordpress-page-template-path-traversal

● CVE-2026-87902 · CVSS 9.2[1] · अति गंभीर
सुरक्षा अनुसंधान · FlawOpen

CVE-2026-87902: WordPress पेज टेम्पलेट पाथ ट्रैवर्सल

बिना सत्यापन वाला डिकोड किया पेज नाम टेम्पलेट चयन में पहुँचा, जिससे बिना प्रमाणीकरण स्थानीय PHP फ़ाइल शामिल हो सकती थी। RCE के लिए विशेष थीम और PHP स्थितियाँ आवश्यक हैं।[1]

💡 आसान भाषा में (ELI5)

एक ऐसे पुस्तकालयाध्यक्ष की कल्पना करें जो किताब लेने से पहले अनुरोध जाँचता है। WordPress ने एक टेम्पलेट रास्ता जाँचा, लेकिन डिकोड किए नाम वाला रास्ता छोड़ दिया। विशेष पाथ संकेत थीम निर्देशिका से बाहर ले जा सकते थे। सुधार नाम को जाँचता है और टेम्पलेट को अनुमत निर्देशिका में रखता है।[1], [2], [3]

इस पेज के मुख्य शब्द

पेज टेम्पलेट चयन
WordPress PHP उम्मीदवारों को क्रम देता है और सक्रिय थीम में पहला मेल खोजता है।[1], [2]
पाथ ट्रैवर्सल
इनपुट जाँचे बिना .. जैसे घटक निर्धारित निर्देशिका से बाहर जा सकते हैं।[1]
स्थानीय PHP शामिल करना
सर्वर पर पहले से मौजूद PHP फ़ाइल लोड होती है; RCE के लिए अन्य शर्तें चाहिए।[1]
`validate_file()`
WordPress फ़ंक्शन जो उपयोग से पहले निषिद्ध पाथ घटकों को अस्वीकार करता है।[3]
CWE-98
CWE-98 — Include/require के लिए फ़ाइल नाम का अनुचित नियंत्रण: PHP फ़ाइल चुनने से पहले इनपुट पर पर्याप्त सीमा नहीं लगाई जाती।[1], [7]

फ्रेमवर्क मैपिंग

मूल कारण विश्लेषण (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

इनपुट टेम्पलेट चयन तक पहुँचे

बिना प्रमाणीकरण अनुरोध उम्मीदवार बनाने वाला नाम देता है; खाता या क्लिक आवश्यक नहीं।[1]

चरण 2

दोबारा डिकोड

get_page_template() नाम फिर डिकोड करता है; प्रभावित संस्करण डिकोड उम्मीदवार की जाँच नहीं करते थे।[2], [3]

चरण 3

खोज मूल निर्देशिका से बाहर

page-* निर्देशिका और पढ़ने योग्य PHP मौजूद हों तो थीम बाहर की फ़ाइल हल कर सकती है।[1]

चरण 4

प्रभाव सशर्त है

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";
    }
}

इंजीनियरिंग और सिस्टम सुरक्षा चेकलिस्ट

स्रोत