PPOM for WooCommerce <= 33.0.15 - Unauthenticated Time-Based Blind SQL Injection (CVE-2025-11391)
by aritlhq · 2026-07-06
- Severity
- Critical
- CVE
- CVE-2025-11391
- Category
- web
- Affected product
- PPOM for WooCommerce (woocommerce-product-addon plugin)
- Affected versions
- <= 33.0.15 (patched in 33.0.16)
- Disclosed
- 2026-07-06
- Patch status
- patched
Tags
References
Archive entry
intelseclab/poc-archiveMetadata
| Field | Value |
|---|---|
| Date Added | 2026-07-06 |
| Last Updated | 2026-07-06 |
| Author / Researcher | aritlhq |
| CVE / Advisory | CVE-2025-11391 |
| Category | web |
| Severity | Critical |
| CVSS Score | 9.8 (per NVD) |
| Status | Patched |
| Tags | wordpress, woocommerce, ppom, product-addon, sql-injection, blind-sqli, time-based, cwe-89, python, php |
| Related | N/A |
Affected Target
| Field | Value |
|---|---|
| Software / System | PPOM for WooCommerce (woocommerce-product-addon plugin) |
| Versions Affected | <= 33.0.15 (patched in 33.0.16) |
| Language / Platform | Python 3 (exploit); PHP / WordPress / WooCommerce (target) |
| Authentication Required | No |
| Network Access Required | Yes |
Summary
The “PPOM for WooCommerce” plugin (WooCommerce Product Addon / PPOM Fields) is vulnerable to an unauthenticated time-based blind SQL injection in its get_product_meta() function, present in versions up to and including 33.0.15. The function concatenates a user-supplied $meta_id parameter directly into a raw SQL query instead of using a prepared statement, and this code path is reachable pre-authentication through the WooCommerce “add to cart” flow when the plugin’s “Enable Legacy Price Calculations” option is active. The included PoC (exploit.py) submits a crafted ppom[fields][id] value containing a SLEEP()-based payload during an add-to-cart POST request and confirms the vulnerability by observing that the server’s response is delayed (and times out) by the injected sleep duration, allowing an attacker to eventually exfiltrate database contents via blind boolean/time-based techniques.
Vulnerability Details
Root Cause
get_product_meta() in classes/plugin.class.php builds its SQL query via string concatenation instead of $wpdb->prepare():
| |
Because $meta_id is taken from user-controlled request data (the ppom[fields][id] parameter submitted during WooCommerce’s add-to-cart request) and inserted unsanitized into the query, an attacker can break out of the numeric context and inject arbitrary SQL. This code path is only exercised when the plugin’s “Enable Legacy Price Calculations” setting is enabled, which forces cart operations through the vulnerable legacy pricing logic.
Attack Vector
- On a site with PPOM for WooCommerce <= 33.0.15 and “Enable Legacy Price Calculations” active, an attacker submits a WooCommerce add-to-cart
POSTrequest to a product page that has a PPOM field group attached. - The request includes
ppom[fields][id]set to a payload such as1 AND (SELECT 1 FROM (SELECT(SLEEP(7)))A)alongside the standardadd-to-cart,quantity, and matching PPOM field parameters. - The unsanitized
$meta_idvalue flows intoget_product_meta()’s raw SQL query, causing the database to execute the injectedSLEEP()clause before returning a result. - The attacker measures response time: a delay matching (or exceeding) the injected sleep duration confirms the query executed and the injection point is exploitable, enabling further blind data exfiltration via additional conditional/time-based payloads.
Impact
Unauthenticated blind SQL injection allowing an attacker to extract arbitrary data from the WordPress database (user credentials, session tokens, private order/customer data, etc.) via time-based inference, without needing valid credentials.
Environment / Lab Setup
Target: Local WordPress + WooCommerce install (e.g. XAMPP/WAMP/MAMP)
Plugin: PPOM for WooCommerce (woocommerce-product-addon) v33.0.15 — vulnerable copy included in this folder
Config: PPOM Fields > Settings > "Enable Legacy Price Calculations" must be enabled
Product: A WooCommerce product with a PPOM field group containing a Text Input field
attached (data name e.g. `sql_injection`), published, with a known Product ID
Attacker: Python 3, `pip install requests`
Proof of Concept
PoC Script
See
exploit.pyand the bundled vulnerable plugin copy underwoocommerce-product-addon/in this folder.
| |
Detection & Indicators of Compromise
Signs of compromise:
- Add-to-cart requests with
ppom[fields][id](or other PPOM field parameters) containing non-numeric SQL syntax - Unusually slow WooCommerce cart/checkout response times correlating with suspicious request parameters
- Database slow-query logs showing
SLEEP()or other time-delay function calls originating fromproductmeta_idlookups
Remediation
| Action | Detail |
|---|---|
| Primary fix | Upgrade “PPOM for WooCommerce” to version 33.0.16 or later, which uses $wpdb->prepare( "SELECT * FROM $table WHERE productmeta_id = %d", $meta_id ) instead of raw string concatenation |
| Interim mitigation | Disable “Enable Legacy Price Calculations” in PPOM Fields settings until patched, and add WAF rules to block SQL metacharacters/keywords in ppom[fields][*] request parameters |
References
Notes
Mirrored from https://github.com/aritlhq/CVE-2025-11391 on 2026-07-06. The repository was renamed/transferred but its contents remain intact: exploit.py, a full copy of the vulnerable plugin (v33.0.15) for lab reproduction, and a detailed root-cause writeup with both vulnerable and patched code shown.
| |