CVE-2026-39609

Wava Payment <= 0.3.7 - Missing Authorization

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The Wava Payment plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 0.3.7. 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:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=0.3.7
PublishedFebruary 7, 2026
Last updatedApril 15, 2026
Affected pluginwava-payment
Research Plan
Unverified

This plan outlines the steps to identify and exploit a missing authorization vulnerability (CVE-2026-39609) in the Wava Payment plugin for WordPress (<= 0.3.7). ### 1. Vulnerability Summary The Wava Payment plugin fails to implement proper capability checks on sensitive functions, likely registered…

Show full research plan

This plan outlines the steps to identify and exploit a missing authorization vulnerability (CVE-2026-39609) in the Wava Payment plugin for WordPress (<= 0.3.7).

1. Vulnerability Summary

The Wava Payment plugin fails to implement proper capability checks on sensitive functions, likely registered via WordPress AJAX handlers (wp_ajax_ / wp_ajax_nopriv_) or the admin_init hook. This allows unauthenticated attackers to perform actions intended for administrators, such as modifying plugin settings, changing payment configurations, or altering transaction records. The vulnerability exists because the developer relied on the function's intended use case (e.g., an admin dashboard) without verifying the current user's permissions via current_user_can().

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php or any admin-init triggered path (like /wp-admin/admin-post.php).
  • Vulnerable Action: Likely an AJAX action registered with wp_ajax_nopriv_ or an admin_init hook that processes $_POST data without authorization checks.
  • Authentication: Unauthenticated (PR:N).
  • Payload: A POST request containing the specific action name and parameters to overwrite plugin options or trigger sensitive logic.

3. Code Flow (Inferred)

  1. Entry Point: The plugin registers a hook in the main plugin file or an admin-specific class:
    • add_action('admin_init', 'wava_payment_save_settings'); OR
    • add_action('wp_ajax_nopriv_wava_update_config', 'wava_update_config_callback');
  2. Processing: The callback function (e.g., wava_payment_save_settings) is invoked during the WordPress initialization phase.
  3. Missing Check: The function checks if specific $_POST parameters are set but fails to call current_user_can('manage_options').
  4. Sink: The function calls update_option('wava_payment_settings', ...) or directly modifies database records via $wpdb, using unvalidated input from $_POST.

4. Nonce Acquisition Strategy

While the vulnerability is "Missing Authorization," it may still implement a CSRF check (nonce). If check_ajax_referer or wp_verify_nonce is present but the capability check is missing, the exploit requires a valid nonce.

  1. Identify Shortcode: Check for shortcodes that load plugin scripts (e.g., [wava_payment_form]).
    • grep -rn "add_shortcode" .
  2. Create Page: Use WP-CLI to create a public page with the shortcode.
    • wp post create --post_type=page --post_status=publish --post_content='[SHORTCODE_NAME]'
  3. Extract Nonce:
    • Navigate to the newly created page using browser_navigate.
    • Inspect wp_localize_script output. Look for keys like wava_vars, wava_payment_params, or wava_ajax_obj.
    • Execution agent command: browser_eval("window.wava_vars?.nonce") (Replace wava_vars with the actual JS object name found in the source).

Note: If the function is hooked to admin_init without a nonce check, no nonce is required.

5. Exploitation Strategy

The goal is to modify the payment recipient's API keys or settings to intercept payments.

  1. Locate Target Action:
    • grep -rn "update_option" . inside the plugin directory.
    • Look for associated function names and trace back to an add_action call.
  2. Construct Payload:
    • Identify the parameter names (e.g., wava_public_key, wava_secret_key, or an array wava_settings[...]).
  3. Send Request:
    Using the http_request tool:
    • URL: http://localhost:8080/wp-admin/admin-ajax.php
    • Method: POST
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Body: action=TARGET_ACTION&nonce=NONCE_VALUE&setting_key=malicious_value&save_changes=1

6. Test Data Setup

  1. Install Wava Payment <= 0.3.7.
  2. Configure the plugin with dummy API keys via the WordPress admin dashboard.
  3. Identify the option name used by the plugin:
    • wp option list | grep wava
  4. (Optional) Create a page with the plugin's shortcode to facilitate nonce extraction if needed.

7. Expected Results

  • The server should return a success response (e.g., 200 OK or {"success":true}).
  • The targeted WordPress option (e.g., wava_payment_settings) should be updated with the attacker's value.
  • Subsequent checkouts on the site will use the attacker-controlled configuration.

8. Verification Steps

After sending the exploit request, verify the change using WP-CLI:

  1. Check the relevant option:
    • wp option get wava_payment_settings (or the identified option name).
  2. Verify that the values match the payload sent in the http_request.
  3. Example: wp option get wava_payment_settings --field=public_key should return malicious_value.

9. Alternative Approaches

  • Admin-Init Trigger: If no AJAX action is found, try sending a POST request to /wp-admin/index.php or /wp-admin/admin-ajax.php with the parameters used in the plugin's settings form. The admin_init hook fires on all admin-area requests, including those made by unauthenticated users to admin-ajax.php.
  • Direct Option Overwrite: If the plugin uses a generic update function, check if it allows updating arbitrary options (e.g., wp_ajax_nopriv_wava_save with a name and value parameter). This could lead to a site takeover if users_can_register or default_role can be modified.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Wava Payment plugin for WordPress is vulnerable to unauthorized access because it fails to perform capability checks on administrative functions, particularly those handling settings updates. Unauthenticated attackers can exploit this by sending POST requests to AJAX or admin initialization hooks to modify sensitive plugin configurations like payment API keys.

Exploit Outline

1. Identify the administrative action responsible for saving settings, typically registered via 'admin_init' or 'wp_ajax_' hooks. 2. If a nonce is required for validation, locate a public page utilizing a plugin shortcode (e.g., '[wava_payment_form]') and extract the nonce from the localized JavaScript objects (e.g., 'window.wava_vars.nonce'). 3. Construct a POST request to '/wp-admin/admin-ajax.php' containing the vulnerable 'action' parameter and the desired configuration values, such as 'wava_public_key' or 'wava_secret_key'. 4. Submit the request unauthenticated to overwrite the plugin's settings in the WordPress options table, allowing the attacker to redirect payment flows or intercept transaction data.

Check if your site is affected.

Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.