CVE-2025-68050

Leadpages <= 1.1.3 - Missing Authorization

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
1.1.4
Patched in
50d
Time to patch

Description

The Leadpages plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.1.3. 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<=1.1.3
PublishedJanuary 27, 2026
Last updatedMarch 17, 2026
Affected pluginleadpages

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan - CVE-2025-68050 (Leadpages <= 1.1.3) ## 1. Vulnerability Summary The Leadpages plugin for WordPress is vulnerable to **Missing Authorization** in versions up to and including 1.1.3. This vulnerability exists because a function responsible for updating plugin settings i…

Show full research plan

Exploitation Research Plan - CVE-2025-68050 (Leadpages <= 1.1.3)

1. Vulnerability Summary

The Leadpages plugin for WordPress is vulnerable to Missing Authorization in versions up to and including 1.1.3. This vulnerability exists because a function responsible for updating plugin settings is hooked to admin_init without performing a capability check (e.g., current_user_can( 'manage_options' )) or a valid nonce verification. Since admin_init executes when accessing /wp-admin/admin-post.php or /wp-admin/admin-ajax.php (even for unauthenticated users), an attacker can remotely modify the plugin's configuration.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-post.php (or potentially /wp-admin/admin-ajax.php)
  • Method: POST
  • Payload Parameters:
    • leadpages_save_settings: A trigger parameter (often a submit button name or hidden field).
    • lp_api_key (inferred): The parameter used to update the Leadpages API Key.
  • Authentication: None required (PR:N).
  • Preconditions: The plugin must be active.

3. Code Flow

  1. Entry Point: An unauthenticated user sends a POST request to wp-admin/admin-post.php.
  2. Hook Trigger: WordPress loads, and the admin_init hook is fired.
  3. Vulnerable Function: The Leadpages plugin has a method (likely Leadpages\Admin\Settings::save_settings or leadpages_save_settings in older versions) registered to the admin_init hook.
  4. Logic Failure: The function checks if $_POST['leadpages_save_settings'] (inferred) is set. However, it fails to check current_user_can() before proceeding to update_option().
  5. Sink: The update_option function is called with user-supplied values, overwriting the lp_api_key (inferred) or other critical settings in the wp_options table.

4. Nonce Acquisition Strategy

Based on the CVSS score and the "Missing Authorization" type for this specific plugin, it is highly probable that no nonce check exists or the nonce is not enforced in the vulnerable code path.

If a nonce is discovered during code review:

  1. Source: Check App/Admin/Settings.php (inferred) for a wp_nonce_field call.
  2. Leakage: If the settings page is only accessible to admins, the nonce is not "leaked" to unauthenticated users. However, if the vulnerability is PR:N, it implies the check is either absent or improperly implemented (e.g., check_admin_referer(..., ..., false) without checking the return value).
  3. Conclusion: Assume no nonce is required for the initial exploit attempt.

5. Exploitation Strategy

The goal is to demonstrate unauthorized modification of the plugin's API key, which effectively disconnects the site from the legitimate Leadpages account and could allow the attacker to point it to a malicious account.

Payload Implementation

  • URL: http://localhost:8080/wp-admin/admin-post.php
  • Headers: Content-Type: application/x-www-form-urlencoded
  • Body:
    leadpages_save_settings=1&lp_api_key=pwned_api_key_1337
    

Step-by-step

  1. Use http_request to send the POST payload to admin-post.php.
  2. Observe the response. A redirect (302) or a blank page (200) is common for admin_init handlers.
  3. Verify the change using WP-CLI.

6. Test Data Setup

  1. Install Plugin: Ensure Leadpages 1.1.3 is installed and active.
  2. Set Initial State:
    wp option update lp_api_key "original_valid_key"
    
  3. Identify Parameters: If lp_api_key is incorrect, use wp option list --search="*leadpages*" to find the correct option name.

7. Expected Results

  • The HTTP request should return a 200 OK or 302 Found.
  • The WordPress database state for the targeted option will be modified.
  • No "Permissions Denied" error should be triggered.

8. Verification Steps

After sending the exploit request, run the following WP-CLI command:

wp option get lp_api_key

Success Condition: The output matches pwned_api_key_1337.

9. Alternative Approaches

If admin-post.php fails, the handler might be registered via wp_ajax_ or wp_ajax_nopriv_.

Alternative 1: AJAX Endpoint

  • URL: http://localhost:8080/wp-admin/admin-ajax.php
  • Body: action=leadpages_save_settings&lp_api_key=pwned_api_key_1337

Alternative 2: Different Option Names
If lp_api_key does not exist, the plugin might store settings in an array:

  • Option name: leadpages_settings
  • Payload parameter: leadpages_settings[lp_api_key] or similar.

Alternative 3: Cache Purge (Lower Impact)
If the "unauthorized action" is clearing the cache:

  • Trigger: leadpages_clear_cache=1 (inferred)
  • Verification: Monitor the wp-content/uploads/leadpages directory for file deletions.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Leadpages plugin for WordPress (<= 1.1.3) is vulnerable to unauthorized settings modification because it fails to perform capability checks or nonce verification on its configuration-saving logic. Since the vulnerable function is hooked to 'admin_init', an unauthenticated attacker can remotely update plugin options, such as API keys, by sending a crafted POST request to administrative endpoints.

Exploit Outline

To exploit this vulnerability, an unauthenticated attacker sends a POST request to /wp-admin/admin-post.php. The request body must include the trigger parameter 'leadpages_save_settings' and the configuration data to be modified (e.g., 'lp_api_key'). Because the plugin processes these updates during the 'admin_init' lifecycle without verifying the user's administrative privileges or the presence of a valid security nonce, the plugin's settings are updated in the WordPress database with the attacker's supplied values.

Check if your site is affected.

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