
पैच की गई wordpress RCE भेद्यता का विश्लेषण और एंड-टू-एंड कार्यान्वयन - CVE-2026-60137 और CVE-2026-63030

सभी PoCs एक ही दो बग्स को हथियार बनाते हैं - REST बैच रूट कन्फ्यूज़न (CVE-2026-63030) और
author__not_in SQL इंजेक्शन (CVE-2026-60137) - समान डबल-नेस्टेड बैच आकार के साथ।
उनके बीच अंतर चुने गए RCE पथ, पर्यावरणीय पूर्वशर्तें, और सुरक्षा डिफ़ॉल्ट में है।
यह दस्तावेज़ स्पष्ट रूप से बताता है कि इस रिपॉजिटरी में कार्यान्वयन उस परिदृश्य में कहाँ स्थित है।
check बिना पूछे कोई SQL पेलोड नहीं भेजता;
सारा ट्रैफ़िक एक एट्रिब्यूशन टैग ले जा सकता है; कमांड टारगेट पर जो कुछ भी लिखता है
वह बाद में स्वचालित रूप से हटा दिया जाता है। §3 देखें।shell| क्षमता | यह रिपॉजिटरी | Icex0/wp2shell-poc | sergiointel/wp2shell-poc | 0xsha/wp2shell | OUTFILE वैरिएंट [4] |
|---|---|---|---|---|---|
| प्री-ऑथ ब्लाइंड/टाइमिंग SQLi रीड | हाँ | हाँ | हाँ (टाइमिंग) | हाँ | हाँ |
| इन-बैंड UNION रीड (1 अनुरोध/मान) | हाँ | हाँ | - [1] | - [1] | - |
| एरर-आधारित रीड (EXTRACTVALUE) | हाँ | हाँ | - | - | - |
| UNION चैनल निरंतर ऑब्जेक्ट कैश में बचा रहता है | हाँ (किल्ड-बेस) | नहीं - प्रोब फाल्स-नेगेटिव [2] | प्रलेखित नहीं | नहीं - प्रलेखित पूर्वशर्त [3] | लागू नहीं [5] |
| क्रैक-मुक्त प्री-ऑथ RCE | हाँ (SQLi-से-एडमिन ब्रिज) | हाँ (वही ब्रिज) | हाँ (ब्रिज मूल) | हाँ (वही ब्रिज) | हाँ, INTO OUTFILE के माध्यम से [5] |
| RCE के लिए अतिरिक्त पूर्वशर्तें | डिफ़ॉल्ट इंस्टॉल के अतिरिक्त कोई नहीं | कोई नहीं (गैर-ऑब्जेक्ट-कैश होस्ट पर) | कोई नहीं (समान) | कोई नहीं (समान) | MySQL FILE विशेषाधिकार + mysqld के साथ साझा वेब-राइटेबल पथ |
| गैर-विनाशकारी जाँच / पैच सत्यापन | हाँ (मार्कर ट्रिपलेट; डिफ़ॉल्ट रूप से कोई पेलोड नहीं) | हाँ | नहीं | हाँ (block_cannot_read) | हाँ (मार्कर बैच) |
| एट्रिब्यूशन/User-Agent टैगिंग | हाँ, सभी कमांड पर | नहीं | नहीं | ट्रांसपोर्ट फ्लैग | नहीं |
| स्वचालित क्लीनअप (वेबशेल + जनरेटेड एडमिन) | हाँ | हाँ | प्रलेखित नहीं | केवल टोकन-गेटेड वेबशेल | ड्रॉपर हटाया गया [5] |
| ब्लू-टीम डिटेक्शन गाइड | हाँ, प्रोडक्शन रन से | नहीं | नहीं | इसके बजाय लैब मैट्रिक्स | शमन नोट्स |
| निर्भरताएँ | केवल stdlib | केवल stdlib | एकल फ़ाइल | केवल stdlib, एकल फ़ाइल | Python ≥3.10 पैकेज |
[1] टाइमिंग/ब्लाइंड केवल रीड चैनल के रूप में; UNION फेक-पोस्ट प्रिमिटिव ब्रिज के अंदर मौजूद है लेकिन इसे एक्सट्रैक्शन ओरेकल के रूप में उजागर नहीं किया गया है।
[2] सरल उपलब्धता प्रोब (0) UNION SELECT …) ऑब्जेक्ट-कैश हाइड्रेशन के दौरान चुपचाप छोड़ दिया जाता है, available() false लौटाता है, और पूरा प्री-ऑथ ब्रिज रुक जाता है - §1 देखें।
[3] प्रोजेक्ट की अपनी README पूर्वशर्तों के अंतर्गत "कोई निरंतर ऑब्जेक्ट कैश नहीं (Redis/Memcached)" सूचीबद्ध करती है।
[4] Sploitus पर मिरर किया गया सार्वजनिक वैरिएंट (नीचे लिंक): RCE चरण के रूप में ब्लाइंड रीड प्लस एक INTO OUTFILE ड्रॉपर, per_page=-1 कैटेगरी कैरियर का उपयोग करते हुए।
[5] OUTFILE RCE पथ फेक-पोस्ट रेंडरिंग पर निर्भर नहीं करता, इसलिए ऑब्जेक्ट कैश इसे अवरुद्ध नहीं करते - MySQL FILE विशेषाधिकार और एक साझा राइटेबल डायरेक्टरी अवरुद्ध करते हैं। मैनेज्ड होस्टिंग लगभग कभी WordPress DB उपयोगकर्ता को FILE नहीं देती, और secure_file_priv सामान्यतः सेट होता है।
UNION फेक-पोस्ट प्रिमिटिव इस पर निर्भर करता है कि WP_Query पंक्तियाँ कैसे लौटाता है:
wp_posts पंक्तियाँ लौटाता है; एक UNION-इंजेक्टेड पंक्ति सीधे WP_Post बन जाती है। जालसाज़ी रेंडर होती है।निरंतर ऑब्जेक्ट कैश वाले होस्ट पर, एक भरा हुआ बेस परिणाम सेट WP_Query को स्प्लिट मोड में धकेल देता है। सार्वजनिक PoCs द्वारा उपयोग किया जाने वाला स्टॉक प्रोब -
0) UNION SELECT <forged row> -- -
post_author NOT IN (0) हर पंक्ति से मेल खाता है), इसलिए ऑब्जेक्ट कैश के पीछे जाली पंक्ति गायब हो जाती है: उपलब्धता प्रोब फाल्स-नेगेटिव देता है, available() false लौटाता है, और पूरा प्री-ऑथ ब्रिज एक ऐसे होस्ट पर "डेड" रिपोर्ट किया जाता है जो वास्तव में पूरी तरह शोषण योग्य है। सार्वजनिक यूनिफायर उसी सीमा को "कोई निरंतर ऑब्जेक्ट कैश नहीं" को कठोर पूर्वशर्त के रूप में सूचीबद्ध करके प्रलेखित करता है।यह रिपॉजिटरी इसके बजाय बेस सेट को खाली कर देती है:
1) AND 1=0 UNION ALL SELECT <forged row> -- -
शून्य बेस पंक्तियों के साथ, जाली पंक्ति एकमात्र पंक्ति होती है; क्वेरी फुल-रो मोड में रहती है; कोई हाइड्रेशन लुकअप कभी नहीं चलता। एक इंजेक्टेड कीवर्ड (AND 1=0) ऑब्जेक्ट-कैश वाले होस्ट पर "UNION चैनल डेड" और "पूर्ण प्री-ऑथ RCE" के बीच का पूरा अंतर है - जो मैनेज्ड WordPress प्रोडक्शन वातावरण का बहुमत हैं। निदान, प्रोब मैट्रिक्स (per_page × इंजेक्शन रूप)।
स्कोप नोट: ब्लाइंड/टाइमिंग रीड चैनल नहीं ऑब्जेक्ट-कैश-संवेदनशील है (SQL में पंक्तियाँ गिनने में फेक-पोस्ट हाइड्रेशन शामिल नहीं होता), इसलिए हर PoC की ब्लाइंड रीड हर जगह काम करती है। अन्य PoCs में ऑब्जेक्ट कैश विशेष रूप से UNION-निर्भर भाग को मारता है: इन-बैंड एक्सट्रैक्शन और SQLi-से-एडमिन ब्रिज।
केस स्टडी में प्रलेखित एक दूसरा, संबंधित सबक: जब दोनों चैनल काम करते हैं, तो इन-बैंड UNION रीड को आधिकारिक मानें - प्रोडक्शन टाइमिंग ओरेकल ने जिटर के तहत एक मान पर बिट फ्लिप उत्पन्न किए, जिसे इन-बैंड रीड ने स्पष्ट रूप से निपटाया।
सार्वजनिक PoCs में तीन प्री-ऑथ RCE पथ मौजूद हैं:
| पथ | किसके द्वारा उपयोग | अतिरिक्त पूर्वशर्तें |
|---|---|---|
SQLi-से-एडमिन ब्रिज (oEmbed/changeset/nav पंक्तियाँ बनाएँ → POST /wp/v2/users → लॉगिन → प्लगइन अपलोड) | यह रिपॉजिटरी, sergiointel (मूल), Icex0, 0xsha | डिफ़ॉल्ट इंस्टॉल के अतिरिक्त कोई नहीं |
INTO OUTFILE ड्रॉपर (SQLi के माध्यम से PHP फ़ाइल लिखें, शेल के लिए उसे प्राप्त करें) | OUTFILE वैरिएंट [4] | MySQL FILE विशेषाधिकार, secure_file_priv का इसे अनुमति देना, और एक डायरेक्टरी जो mysqld द्वारा लिखने योग्य हो और वेब सर्वर द्वारा सर्व की जाती हो |
हैश रिकवरी → क्रैक → लॉगिन (user_pass डंप करें, ऑफलाइन क्रैक करें, फिर प्लगइन अपलोड करें) | सभी (फ़ॉलबैक के रूप में) | bcrypt हैश वास्तव में क्रैक होना चाहिए ($wp$2y$, hashcat -m 35500) - धीमा, अक्सर कभी नहीं |
यह रिपॉजिटरी ब्रिज को लागू करती है: इसे WordPress के पास पहले से मौजूद डेटाबेस विशेषाधिकारों के अतिरिक्त किसी विशेषाधिकार की आवश्यकता नहीं होती, यह तब काम करता है जब DB और वेब टियर कुछ भी साझा नहीं करते, और FILE-विशेषाधिकार पथ के निर्भर होने के लिए कोई फ़ाइल पीछे नहीं छोड़ता। इसका व्यापार-बंद जटिलता है - ब्रिज एक सात-पंक्ति वाला पॉइज़न्ड पोस्ट ग्राफ़ है - और यह ठीक वही स्थान है जहाँ §1 का ऑब्जेक्ट-कैश फाल्स-नेगेटिव पथ को छिपाने के लिए उपयोग होता था।
केवल लैब ही नहीं, प्राधिकरण के तहत प्रोडक्शन सिस्टम के विरुद्ध चलाने के लिए निर्मित:
check डिफ़ॉल्ट रूप से गैर-विनाशकारी है - निष्क्रिय फिंगरप्रिंट प्लस एक सौम्य मार्कर बैच; जब तक --confirm-sqli न दिया जाए, कोई SQL पेलोड नहीं भेजा जाता। पैचिंग के बाद, गायब होने वाला मार्कर ट्रिपलेट फिक्स सत्यापन का काम भी करता है।--user-agent ताकि सारा एक्सप्लॉइट ट्रैफ़िक लॉग्स में पहचाना जा सके (एक एंगेजमेंट नियम जिसे सार्वजनिक टूल डिफ़ॉल्ट रूप से उपयोग नहीं करते)।author_exclude → author__not_in सिंक, फेक-WP_Post UNION प्रिमिटिव, और कस्टमाइज़र-ब्रिज अवधारणा सभी सार्वजनिक तकनीकें हैं (वंशावली नीचे स्वीकार की गई है)।INTO OUTFILE ड्रॉपर), Sploitus पर मिरर किया गया - https://sploitus.com/exploit?id=7CD079AD-E27B-5C54-A696-60635BFDB241