StoreCustomizer – A plugin to Customize all WooCommerce Pages <= 2.6.3 - Missing Authorization
Description
The StoreCustomizer – A plugin to Customize all WooCommerce Pages plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 2.6.3. This makes it possible for authenticated attackers, with subscriber-level access and above, to perform an unauthorized action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=2.6.3What Changed in the Fix
Changes introduced in v2.6.5
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-27046 ## 1. Vulnerability Summary The **StoreCustomizer** plugin for WordPress (versions <= 2.6.3) suffers from a **Missing Authorization** vulnerability. The plugin registers an AJAX action `wcz_admin_get_product_stats` intended for administrative use (viewi…
Show full research plan
Exploitation Research Plan - CVE-2026-27046
1. Vulnerability Summary
The StoreCustomizer plugin for WordPress (versions <= 2.6.3) suffers from a Missing Authorization vulnerability. The plugin registers an AJAX action wcz_admin_get_product_stats intended for administrative use (viewing product statistics) but fails to implement capability checks (e.g., current_user_can( 'manage_woocommerce' ) or current_user_can( 'manage_options' )). This allows any authenticated user, including those with Subscriber level permissions, to retrieve sensitive WooCommerce product statistics by invoking the AJAX handler directly.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
wcz_admin_get_product_stats - HTTP Method:
POST - Vulnerable Parameter:
product_id - Authentication: Required (Subscriber level or higher)
- Preconditions: WooCommerce must be installed and at least one product must exist.
3. Code Flow
- Frontend Trigger: In
assets/js/frontend.js, the plugin attaches a click listener to elements with the class.wcz-adminstats-btn. - AJAX Preparation: When clicked, the script extracts a
productidfrom the element's data attribute:var wcz_adminstat_id = jQuery( this ).data( 'productid' );. - AJAX Dispatch: The script sends a POST request to
wcz_admin_stats.ajax_url(which resolves toadmin-ajax.php) with the following data:action:wcz_admin_get_product_statsproduct_id: The extracted ID.
- Backend Processing (Inferred): The WordPress backend receives the action. Because it is registered via
wp_ajax_wcz_admin_get_product_statswithout a corresponding capability check in the handler function, the plugin proceeds to fetch and return the statistics for the specifiedproduct_id. - Response Render: The response (expected as HTML) is injected into
.wcz-adminstats-modal-inner.
4. Nonce Acquisition Strategy
Reviewing assets/js/frontend.js:
jQuery.ajax({
type: 'POST',
url: wcz_admin_stats.ajax_url,
dataType: 'html',
data: {
'action': 'wcz_admin_get_product_stats',
'product_id': wcz_adminstat_id,
},
// ...
The AJAX request does not include a nonce parameter. This indicates that the backend handler for wcz_admin_get_product_stats does not verify a nonce (missing check_ajax_referer or wp_verify_nonce).
Conclusion: No nonce is required for exploitation. Only an authenticated session cookie is needed.
5. Exploitation Strategy
The exploit will involve logging in as a Subscriber and directly hitting the AJAX endpoint to leak product statistics.
Step-by-Step Plan:
- Identify Target Product: Use WP-CLI to find a valid product ID.
- Authenticate: Log in to WordPress as a Subscriber user to obtain a session cookie.
- Trigger Vulnerability: Send a POST request to
admin-ajax.php.- URL:
http://<target>/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=wcz_admin_get_product_stats&product_id=<ID>
- URL:
- Capture Output: Analyze the HTML response for sensitive WooCommerce metrics (e.g., total sales, net profit, or inventory data).
6. Test Data Setup
- Install Requirements: Ensure WooCommerce and StoreCustomizer (<= 2.6.3) are active.
- Create Product:
wp post create --post_type=product --post_title="Sensitive Product" --post_status=publish # Note the resulting ID (e.g., 123) - Create Attacker:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
7. Expected Results
- Success Condition: The server returns an HTTP 200 response containing HTML markup with product statistics.
- Data Exposed: The HTML will likely contain a breakdown of sales figures or other "Admin Stats" defined by the plugin for that product ID, which should be restricted to Shop Managers/Admins.
8. Verification Steps
- Check Response Content: Verify the response contains terms like "Sales", "Stats", or specific numerical values associated with the product.
- Confirm Capability Restriction: Verify that a Subscriber-level user cannot view these stats through the normal WooCommerce UI.
- Database Check (Post-Exploit): Since this is a "Missing Authorization" (Read) vulnerability, verification is primarily done by confirming the sensitivity of the data returned in the HTTP response.
9. Alternative Approaches
If the plugin uses a different parameter name for the ID (e.g., id or p_id), I will:
- Grep the plugin directory for the string
'wcz_admin_get_product_stats'to find the PHP handler name. - Inspect the PHP handler to identify the exact
$_POSTor$_REQUESTkeys used. - If the statistics are empty, I will simulate a sale for the product using
wp wc order create ...to ensure there is data to leak.
Summary
The StoreCustomizer plugin for WooCommerce (<= 2.6.3) fails to implement capability checks or nonce verification on its AJAX handler for retrieving product statistics. This allows authenticated attackers with subscriber-level permissions to access sensitive sales data and stock information for any product.
Vulnerable Code
// assets/js/frontend.js lines 13-21 jQuery.ajax({ type: 'POST', url: wcz_admin_stats.ajax_url, dataType: 'html', data: { 'action': 'wcz_admin_get_product_stats', 'product_id': wcz_adminstat_id, },
Security Fix
@@ -21,6 +21,7 @@ data: { 'action': 'wcz_admin_get_product_stats', 'product_id': wcz_adminstat_id, + 'nonce': wcz_admin_stats.nonce, },
Exploit Outline
To exploit this vulnerability, an attacker must be authenticated as a Subscriber or higher. The attacker identifies a target WooCommerce product ID and sends a POST request to '/wp-admin/admin-ajax.php' with the parameters 'action=wcz_admin_get_product_stats' and 'product_id=[TARGET_ID]'. Because the backend PHP handler lacks a capability check (such as current_user_can('manage_woocommerce')) and does not verify a security nonce, the server responds with an HTML block containing sensitive product sales statistics and performance metrics.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.