linkPizza-Manager <= 5.5.5 - Missing Authorization
Description
The linkPizza-Manager plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 5.5.5. 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
<=5.5.5# Exploitation Research Plan: CVE-2026-39682 (linkPizza-Manager Missing Authorization) ## 1. Vulnerability Summary The **linkPizza-Manager** plugin for WordPress is vulnerable to **Missing Authorization** in versions up to and including **5.5.5**. The vulnerability exists because specific functions…
Show full research plan
Exploitation Research Plan: CVE-2026-39682 (linkPizza-Manager Missing Authorization)
1. Vulnerability Summary
The linkPizza-Manager plugin for WordPress is vulnerable to Missing Authorization in versions up to and including 5.5.5. The vulnerability exists because specific functions—likely associated with AJAX handlers or administrative initialization hooks—fail to implement a current_user_can() check. This allows unauthenticated attackers to trigger sensitive actions, such as modifying plugin settings (API keys, tracking IDs) or performing other administrative tasks, by directly calling the vulnerable function via WordPress's AJAX or initial load infrastructure.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php(or potentially any request if hooked toadmin_init). - Action (Inferred):
linkpizza_save_settingsorlinkpizza_update_options. - Vulnerable Hook:
wp_ajax_nopriv_linkpizza_save_settingsor a similar action registered for logged-out users. Alternatively, it may be awp_ajax_action that lacks a capability check but is incorrectly exposed, or anadmin_inithook that processes$_POSTdata without verification. - Payload Parameter:
lp_api_key,lp_project_id, or generic settings arrays. - Authentication: Unauthenticated (PR:N).
- Preconditions: The plugin must be active. A nonce may be required, though the "Missing Authorization" label often implies that even if a nonce is checked, the permission level of the user is not.
3. Code Flow
- Entry Point: The attacker sends a
POSTrequest toadmin-ajax.php. - Hook Trigger: WordPress processes the
actionparameter (e.g.,linkpizza_save_settings). If registered viaadd_action( 'wp_ajax_nopriv_linkpizza_save_settings', ... ), it executes the callback. - Vulnerable Function: The callback function (e.g.,
linkpizza_handle_settings_save()) is invoked. - Missing Check: The function checks if specific
$_POSTvariables are set but fails to callcurrent_user_can( 'manage_options' ). - Sink: The function calls
update_option( 'linkpizza_settings', ... )or similar, updating the plugin configuration with attacker-supplied values.
4. Nonce Acquisition Strategy
If the plugin uses check_ajax_referer() or wp_verify_nonce(), we must obtain a valid nonce. In many cases, these plugins expose nonces to unauthenticated users to support frontend tracking features.
- Discovery: Identify if the plugin enqueues scripts on the frontend.
- Shortcode Search: Search the plugin for shortcodes:
grep -rn "add_shortcode" .(e.g.,[linkpizza]). - Page Creation: Create a page containing the shortcode:
wp post create --post_type=page --post_status=publish --post_title="LP Test" --post_content='[linkpizza]' - Extraction: Navigate to the page and use
browser_evalto find the localized data:- Inferred Variable:
window.linkpizza_varsorwindow.lp_manager_data. - Command:
browser_eval("window.lp_manager_vars?.nonce")
- Inferred Variable:
- Bypass Check: If the code uses
check_ajax_referer( 'linkpizza_action', 'nonce', false )without checking the return value, the nonce check is bypassed, and any value will work.
5. Exploitation Strategy
We will attempt to overwrite the LinkPizza API Key, which would allow an attacker to redirect affiliate commission data to their own account.
Step 1: Discover the AJAX Action
Search the plugin source for AJAX registrations:
grep -r "wp_ajax_nopriv" .
Assuming the action is linkpizza_save_settings.
Step 2: Test Unauthenticated Setting Update
Send a POST request to update the API key.
- URL:
http://localhost:8080/wp-admin/admin-ajax.php - Method:
POST - Content-Type:
application/x-www-form-urlencoded - Parameters:
action:linkpizza_save_settings(inferred)lp_api_key:ATTACKER_CONTROLLED_API_KEYnonce:[EXTRACTED_NONCE](if required)
Step 3: Blind Verification (If response is non-descript)
If the response is 0 or 1, we must verify the database state.
6. Test Data Setup
- Plugin Installation: Ensure
linkpizza-manager<= 5.5.5 is installed. - Initial Config: Set a legitimate API key via WP-CLI to simulate a configured environment:
wp option update linkpizza_settings '{"api_key": "LEGIT_KEY_123", "project_id": "PROJECT_456"}' - Public Page: Create a page to test for frontend nonce leakage (as described in section 4).
7. Expected Results
- Response: The HTTP response should indicate success (e.g., a JSON success message
{"success":true}or a simple1). - Database Change: The WordPress option
linkpizza_settings(or similar) will now containATTACKER_CONTROLLED_API_KEY.
8. Verification Steps
After sending the exploit, verify the modification using WP-CLI:
# Check the current value of the settings option
wp option get linkpizza_settings
# Verify if the API key matches the payload
wp option get linkpizza_settings --format=json | jq -r '.api_key'
9. Alternative Approaches
- admin_init Hook: If no AJAX action is found, search for
admin_inithooks that do not checkis_admin()or permissions:
Then, trigger the logic by visitinggrep -rn "add_action.*admin_init" ./wp-admin/admin-post.phpor even/wp-admin/index.phpwith the required parameters, asadmin_initruns on all admin pages andadmin-ajax.php. - Parameter Fuzzing: If the setting key is unknown, look for the
update_optioncall in the vulnerable function to identify the exact key name (e.g.,lp_settings,linkpizza_options).
Summary
The linkPizza-Manager plugin for WordPress (up to version 5.5.5) is vulnerable to unauthorized configuration modification due to a missing authorization check on its settings-saving functionality. This allows unauthenticated attackers to overwrite critical plugin options, such as API keys, by sending unauthenticated requests to the plugin's AJAX handlers or administrative initialization hooks.
Exploit Outline
The exploit targets the plugin's settings update mechanism, which is incorrectly exposed via AJAX or an admin_init hook without proper permission checks. An attacker first searches the site's frontend for localized scripts (such as 'window.lp_manager_vars') to extract a valid nonce if the plugin requires one. They then send an unauthenticated POST request to '/wp-admin/admin-ajax.php' (or a similar administrative endpoint) containing the target 'action' and malicious configuration values, such as an attacker-controlled 'lp_api_key'. Because the backend callback fails to verify the user's capabilities using 'current_user_can()', the plugin updates the 'linkpizza_settings' option in the database with the provided values.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.