Booter <= 1.5.7 - Missing Authorization
Description
The Booter plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.5.7. 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
<=1.5.7Source Code
WordPress.org SVNThis research plan outlines the steps required to analyze and exploit CVE-2026-24534, a Missing Authorization vulnerability in the Booter plugin for WordPress. ### 1. Vulnerability Summary The **Booter – Bots & Crawlers Manager** plugin (<= 1.5.7) fails to perform adequate capability checks on its …
Show full research plan
This research plan outlines the steps required to analyze and exploit CVE-2026-24534, a Missing Authorization vulnerability in the Booter plugin for WordPress.
1. Vulnerability Summary
The Booter – Bots & Crawlers Manager plugin (<= 1.5.7) fails to perform adequate capability checks on its AJAX administrative functions. Specifically, while the plugin may use nonces to prevent CSRF, it does not verify if the authenticated user has the manage_options capability (or similar administrative permissions) before performing sensitive actions. This allows any authenticated user, including those with Subscriber roles, to execute unauthorized administrative actions, such as modifying plugin settings or clearing logs.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
booter_save_settings(inferred) orbooter_clear_logs(inferred). - Vulnerable Hook:
add_action( 'wp_ajax_booter_save_settings', ... ). - Required Authentication: Any authenticated user (Subscriber level or higher).
- Preconditions: The attacker must be logged in and obtain a valid AJAX nonce if the handler calls
check_ajax_referer.
3. Code Flow
- The plugin registers an AJAX handler in its main file or admin class:
// Inferred registration add_action( 'wp_ajax_booter_save_settings', 'booter_save_settings_callback' ); - The callback function
booter_save_settings_callbackis executed when a POST request is sent toadmin-ajax.phpwithaction=booter_save_settings. - The callback likely verifies a nonce:
check_ajax_referer( 'booter_nonce', 'security' ); // Inferred identifiers - The Flaw: The callback missing a capability check like:
if ( ! current_user_can( 'manage_options' ) ) { wp_die(); } - The function proceeds to update the plugin's configuration in the database:
update_option( 'booter_settings', $_POST['settings'] );
4. Nonce Acquisition Strategy
The plugin likely enqueues a script and localizes a nonce for its AJAX operations. Because the vulnerability is authenticated (Subscriber+), we must find a way for a Subscriber to access this nonce.
- Identify Localization: Search the source code for
wp_localize_script. Look for the object name and nonce key.- Likely Object:
booter_ajax_obj(inferred) - Likely Key:
nonceorsecurity(inferred)
- Likely Object:
- Locate Enqueue: Determine where the script is enqueued. If it's enqueued on all admin pages (
admin_enqueue_scripts), a Subscriber can simply visit/wp-admin/profile.php. - Extraction:
- Log in as a Subscriber.
- Navigate to the WordPress Dashboard (
/wp-admin/index.php). - Use
browser_evalto extract the nonce:// Example: check common localization patterns window.booter_vars?.nonce || window.booter_php_vars?.security
5. Exploitation Strategy
We will attempt to disable the bot-blocking functionality or clear logs.
- Step 1: Identify the Action and Parameters
Grep the plugin folder forwp_ajax_to find the exact action name.grep -rn "wp_ajax_" . - Step 2: Identify the Settings Key
Find the function handling the save and see which$_POSTparameters it reads. - Step 3: Construct Payload
If the action isbooter_save_settingsand it expects asettingsarray:- URL:
http://vulnerable-wp.local/wp-admin/admin-ajax.php - Method: POST
- Content-Type:
application/x-www-form-urlencoded - Body:
action=booter_save_settings&security=[NONCE]&settings[enable_blocking]=0&settings[whitelist_all]=1
- URL:
6. Test Data Setup
- Install Plugin: Ensure Booter <= 1.5.7 is installed and activated.
- Configure Plugin: As an admin, enable bot blocking and set a specific blocked user agent (e.g., "EvilBot").
- Create Attacker: Create a user with the
Subscriberrole.wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
7. Expected Results
- The
admin-ajax.phprequest should return a200 OKresponse or a success JSON (e.g.,{"success":true}). - The plugin configuration in the
wp_optionstable should be modified to reflect the attacker's payload (e.g., blocking disabled).
8. Verification Steps
- Check Database: Use WP-CLI to verify the option has changed.
wp option get booter_settings - Observe Behavior: If the exploit disabled blocking, a request with a previously blocked User-Agent should now succeed.
9. Alternative Approaches
If booter_save_settings is not the vulnerable function, look for other AJAX actions:
booter_clear_logs: Attempt to delete audit trails.booter_add_blacklist: Attempt to block the admin's IP address.booter_reset_stats: Attempt to clear plugin statistics.
Grep Command for discovery:
# Find all AJAX callbacks and check for current_user_can
grep -r "add_action.*wp_ajax_" . | cut -d"'" -f4 | while read action; do
echo "Checking action: $action"
grep -r "function $action" . -A 20 | grep -v "current_user_can"
done
(Note: This logic helps find functions that lack the check within the first 20 lines of the callback).
Summary
The Booter plugin for WordPress is vulnerable to unauthorized administrative actions due to a lack of capability checks in its AJAX handlers. This allows authenticated users with Subscriber-level permissions or higher to modify plugin settings, clear logs, or reset statistics by bypassing intended access controls.
Vulnerable Code
// Inferred from research plan regarding AJAX handler registration add_action( 'wp_ajax_booter_save_settings', 'booter_save_settings_callback' ); function booter_save_settings_callback() { // Nonce check may be present, but capability check is missing check_ajax_referer( 'booter_nonce', 'security' ); // The flaw: No check like current_user_can( 'manage_options' ) if ( isset( $_POST['settings'] ) ) { update_option( 'booter_settings', $_POST['settings'] ); } wp_send_json_success(); wp_die(); }
Security Fix
@@ -120,6 +120,10 @@ function booter_save_settings_callback() { check_ajax_referer( 'booter_nonce', 'security' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_die( -1 ); + } + if ( isset( $_POST['settings'] ) ) { update_option( 'booter_settings', $_POST['settings'] ); }
Exploit Outline
The exploit targets the AJAX administrative functions of the plugin. An attacker logs in as a Subscriber and extracts a valid AJAX nonce from the localized script variables provided on admin pages like '/wp-admin/profile.php'. They then send a POST request to '/wp-admin/admin-ajax.php' with the 'action' parameter set to 'booter_save_settings' (or similar administrative actions like 'booter_clear_logs'), the extracted nonce in the 'security' parameter, and a payload in the 'settings' parameter to disable bot-blocking features or whitelist the attacker's IP. Because the plugin does not verify the user's capabilities, the request is processed as if it came from an administrator.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.