Leadpages <= 1.1.3 - Missing Authorization
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:NTechnical Details
Source Code
WordPress.org SVN# 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
- Entry Point: An unauthenticated user sends a POST request to
wp-admin/admin-post.php. - Hook Trigger: WordPress loads, and the
admin_inithook is fired. - Vulnerable Function: The Leadpages plugin has a method (likely
Leadpages\Admin\Settings::save_settingsorleadpages_save_settingsin older versions) registered to theadmin_inithook. - Logic Failure: The function checks if
$_POST['leadpages_save_settings'](inferred) is set. However, it fails to checkcurrent_user_can()before proceeding toupdate_option(). - Sink: The
update_optionfunction is called with user-supplied values, overwriting thelp_api_key(inferred) or other critical settings in thewp_optionstable.
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:
- Source: Check
App/Admin/Settings.php(inferred) for awp_nonce_fieldcall. - 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). - 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
- Use
http_requestto send the POST payload toadmin-post.php. - Observe the response. A redirect (302) or a blank page (200) is common for
admin_inithandlers. - Verify the change using WP-CLI.
6. Test Data Setup
- Install Plugin: Ensure Leadpages 1.1.3 is installed and active.
- Set Initial State:
wp option update lp_api_key "original_valid_key" - Identify Parameters: If
lp_api_keyis incorrect, usewp option list --search="*leadpages*"to find the correct option name.
7. Expected Results
- The HTTP request should return a
200 OKor302 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/leadpagesdirectory for file deletions.
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.