Event Tickets Manager for WooCommerce <= 1.5.3 - Missing Authorization
Description
The Event Tickets Manager for WooCommerce plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 1.5.3. This makes it possible for unauthenticated attackers to perform an unauthorized action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.5.3What Changed in the Fix
Changes introduced in v1.5.4
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-34898 ## 1. Vulnerability Summary The **Event Tickets Manager for WooCommerce** plugin (<= 1.5.3) suffers from a **Missing Authorization** vulnerability. The AJAX handler for `wps_etmfw_edit_user_info` fails to perform capability checks or verify order ownersh…
Show full research plan
Exploitation Research Plan: CVE-2026-34898
1. Vulnerability Summary
The Event Tickets Manager for WooCommerce plugin (<= 1.5.3) suffers from a Missing Authorization vulnerability. The AJAX handler for wps_etmfw_edit_user_info fails to perform capability checks or verify order ownership. This allows an unauthenticated attacker to modify attendee/ticket information for any WooCommerce order by providing the target order_id.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
wps_etmfw_edit_user_info - Method: POST
- Authentication: None required (registered via
wp_ajax_nopriv_). - Vulnerable Parameters:
order_id: The ID of the WooCommerce order to modify.form_value: An object/array containing the ticket fields to overwrite (e.g., Name, Email).
- Preconditions:
- The attacker needs a valid
order_id(can be enumerated). - A valid public nonce is required.
- The attacker needs a valid
3. Code Flow
- Registration: The plugin (likely in
Event_Tickets_Manager_For_Woocommerce_Public) registerswp_ajax_nopriv_wps_etmfw_edit_user_info. - Trigger: The frontend script
public/src/js/event-tickets-manager-for-woocommerce-public.jslistens for a click on#wps_etmfw_save_edit_ticket_info_btn. - Data Collection: It scrapes values from elements with the class
.wps-edit-form-groupand stores them inmodifiedValues. - AJAX Call: It sends a POST request to
admin-ajax.phpwithaction: 'wps_etmfw_edit_user_info',form_value: modifiedValues, andorder_id. - Vulnerable Sink: The PHP handler (inferred) verifies the nonce
wps_nonceusingwp_verify_nonce( $_POST['wps_nonce'], 'wps-etmfw-verify-public-nonce' ). However, it fails to check if the current user has permission to edit the specifiedorder_idbefore updating the order's metadata/attendee details.
4. Nonce Acquisition Strategy
The nonce is localized for the public script and is available on any WooCommerce product page.
- Identify Trigger: The script
event-tickets-manager-for-woocommerce-public.jsis enqueued on single product pages viaetmfw_public_enqueue_scripts(). - Action: Navigate to a product page.
- Extraction: Use
browser_evalto extract the nonce from theetmfw_public_paramobject.- JS Variable:
window.etmfw_public_param - Nonce Key:
wps_etmfw_public_nonce - Nonce Action:
wps-etmfw-verify-public-nonce
- JS Variable:
5. Exploitation Strategy
- Setup: Create a dummy event product and a target order.
- Nonce Extraction: Navigate to the product page and extract the nonce using
browser_eval. - Malicious Request: Use
http_requestto send a POST payload toadmin-ajax.php.
Payload Example:
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
action=wps_etmfw_edit_user_info&order_id=TARGET_ORDER_ID&wps_nonce=EXTRACTED_NONCE&form_value[Name]=Hacked_User&form_value[Email]=attacker@example.com
6. Test Data Setup
- Activate Plugin: Ensure
event-tickets-manager-for-woocommerceis active. - Create Product:
wp post create --post_type=product --post_title="Event Ticket" --post_status=publish # Product ID will be needed for the nonce extraction page - Configure Product: Set the product as an event.
wp post meta set <PRODUCT_ID> _virtual yes wp post meta set <PRODUCT_ID> _ticket yes # (inferred meta key) - Create Target Order: Create a WooCommerce order as a standard "Customer" user.
wp wc order create --user=customer_user --status=processing --item_id=<PRODUCT_ID> # Note the resulting ORDER_ID
7. Expected Results
- The AJAX response should be a JSON object (likely
{"success": true}or similar). - The order metadata associated with the ticket (attendee name/email) should be updated to the values provided in
form_value.
8. Verification Steps
- Check Order Meta: After the exploit, verify the order metadata via WP-CLI:
wp post meta list <TARGET_ORDER_ID> - Inspect Attendee Data: Look for keys like
wps_etmfw_attendee_fieldsor similar (grounded in the plugin's meta naming convention) to see if "Hacked_User" is present.
9. Alternative Approaches
If order_id ownership is partially checked, try:
- Parameter Pollution: If the code uses
$_REQUEST['order_id']vs$_POST['order_id']. - Empty Nonce: Check if the nonce verification is conditional (e.g.,
if (isset($_POST['wps_nonce'])) { wp_verify_nonce(...) }). - Default Nonce: If the localized nonce fails, try the default action nonce
-1.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.