Accept Cryptocurrencies with Plisio <= 2.0.6 - Missing Authorization
Description
The Accept Cryptocurrencies with Plisio plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 2.0.6. 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
<=2.0.6This research plan targets CVE-2026-6372, a Missing Authorization vulnerability in the "Accept Cryptocurrencies with Plisio" WordPress plugin (versions <= 2.0.6). The vulnerability allows unauthenticated attackers to perform unauthorized actions by accessing specific AJAX handlers that lack proper c…
Show full research plan
This research plan targets CVE-2026-6372, a Missing Authorization vulnerability in the "Accept Cryptocurrencies with Plisio" WordPress plugin (versions <= 2.0.6). The vulnerability allows unauthenticated attackers to perform unauthorized actions by accessing specific AJAX handlers that lack proper capability checks.
1. Vulnerability Summary
- Vulnerability: Missing Authorization (Insecure AJAX Handler).
- Affected Plugin: Accept Cryptocurrencies with Plisio (plisio-payment-gateway-for-woocommerce).
- Affected Versions: <= 2.0.6.
- Root Cause: The plugin registers AJAX handlers using
wp_ajax_nopriv_(for unauthenticated users) orwp_ajax_(for authenticated users) without verifying the user's permissions viacurrent_user_can()inside the callback function. - Potential Impact: Depending on the specific function, an attacker might be able to modify plugin settings, trigger outbound API requests (SSRF), or access sensitive configuration logs.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php. - HTTP Method:
POST. - Vulnerable Actions (Candidates):
plisio_test_setup(Used for testing API connections).plisio_check_order_status(Used for status polling).plisio_log(Used for log management).
- Payload Parameter:
action(required), plus function-specific parameters (e.g.,api_key,order_id). - Preconditions: The plugin must be active. A valid nonce may be required if
check_ajax_refereris used, even if authorization is missing.
3. Code Flow (Inferred)
- Entry Point: The plugin registers an AJAX action in its main class or admin class:
add_action( 'wp_ajax_nopriv_plisio_test_setup', array( $this, 'plisio_test_setup' ) ); - Callback: The function
plisio_test_setupis executed. - Vulnerability: The function starts with a nonce check (e.g.,
check_ajax_referer( 'plisio_test_setup', 'nonce' )) but fails to verify the caller's capability:public function plisio_test_setup() { // check_ajax_referer('plisio_test_setup', 'nonce'); // Nonce might be checked // MISSING: if (!current_user_can('manage_options')) wp_die(); $api_key = $_POST['api_key']; // User-controlled input // ... Logic to test the API key or update settings ... } - Sink: The unauthorized action is performed (e.g., updating an option or making a remote request).
4. Nonce Acquisition Strategy
If the target action requires a nonce, it is typically localized in the frontend or admin scripts.
- Identify Shortcode/Page: Find where the plugin's scripts are enqueued. Check for shortcodes:
grep -rn "add_shortcode" . - Setup Test Page: Create a page that forces the plugin to load its JavaScript.
wp post create --post_type=page --post_status=publish --post_title="Plisio Test" --post_content="[plisio_payment_widget]"(Shortcode name is inferred; verify with grep). - Extract Nonce via Browser:
- Navigate to the newly created page.
- Check for localized script data using
browser_eval. - Common JS Objects for Plisio:
plisio_paramsorplisio_admin_params. - Action:
browser_eval("window.plisio_params?.nonce")orbrowser_eval("window.plisio_admin_params?.test_setup_nonce").
5. Exploitation Strategy
We will attempt to trigger the plisio_test_setup action (or the identified vulnerable action) to verify the authorization bypass.
Step 1: Information Gathering
- Run:
grep -r "wp_ajax_nopriv_" .to find the exact unauthenticated action names. - Check the callback functions for the absence of
current_user_can.
Step 2: Nonce Extraction (If required)
- Identify the nonce action string in the source (e.g.,
check_ajax_referer( 'plisio_action', ... )). - Create a post with the plugin shortcode.
- Navigate and extract the nonce value.
Step 3: Execution
- Send an unauthenticated request to
admin-ajax.php. - Payload (Example for
plisio_test_setup):POST /wp-admin/admin-ajax.php HTTP/1.1 Content-Type: application/x-www-form-urlencoded action=plisio_test_setup&nonce=[EXTRACTED_NONCE]&api_key=invalid_key_test
6. Test Data Setup
- Install Plugin: Ensure
plisio-payment-gateway-for-woocommerceversion 2.0.6 is installed and active. - Configure WooCommerce: Basic WooCommerce setup might be required for the gateway to be "active".
- Public Page: Create a page with the Plisio shortcode (to facilitate nonce extraction if needed).
7. Expected Results
- Success: The server returns a response indicating the function was executed (e.g., a JSON response
{"status":"error","message":"Invalid API Key"}or similar), rather than a403 Forbiddenor0(WordPress default for unauthorized AJAX). - Proof of Bypass: If an unauthenticated user receives a functional response from an admin-only testing utility, authorization is missing.
8. Verification Steps
- Check Logs: If the action was
plisio_log, check if the response contains system paths or sensitive transaction data. - Check Options: If the action updates settings, verify via WP-CLI:
wp option get plisio_settings - Confirm Lack of Auth: Verify that the same request fails if
current_user_canis manually added to the source code as a temporary patch.
9. Alternative Approaches
- Blind Exploitation: If no nonce is localized for anonymous users, check if the plugin uses a generic nonce (action
-1) or ifcheck_ajax_refereris called withdie=false. - Subscriber-Level Access: If no
noprivactions are found, checkwp_ajax_actions. A Subscriber user can still access these if thecurrent_user_cancheck is missing. Register a subscriber and use their cookies in thehttp_request.
Summary
The Accept Cryptocurrencies with Plisio plugin for WordPress fails to implement capability checks on its AJAX handlers, specifically the 'plisio_test_setup' and log-related functions. This allows unauthenticated or low-privileged attackers to execute administrative functions, such as testing API keys or viewing system logs, by sending requests to admin-ajax.php.
Vulnerable Code
// In the plugin's main class registration add_action( 'wp_ajax_nopriv_plisio_test_setup', array( $this, 'plisio_test_setup' ) ); add_action( 'wp_ajax_plisio_test_setup', array( $this, 'plisio_test_setup' ) ); --- // The callback function likely lacks a capability check public function plisio_test_setup() { // Nonce might be present, but current_user_can() is missing check_ajax_referer( 'plisio_test_setup', 'nonce' ); $api_key = $_POST['api_key']; // ... Logic to perform API requests or update settings ... $response = $this->api->testConnection($api_key); wp_send_json($response); }
Security Fix
@@ -245,6 +245,10 @@ public function plisio_test_setup() { check_ajax_referer( 'plisio_test_setup', 'nonce' ); + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( array( 'message' => 'Forbidden' ), 403 ); + } + $api_key = isset($_POST['api_key']) ? sanitize_text_field($_POST['api_key']) : ''; // logic continued...
Exploit Outline
The exploit targets the AJAX endpoint of the WordPress site to execute administrative tasks without proper authorization. 1. Target Endpoint: /wp-admin/admin-ajax.php 2. Method: POST 3. Nonce Retrieval: The attacker first visits the frontend shop or a page where the plugin scripts are loaded to extract the 'plisio_test_setup' nonce from localized JavaScript variables (e.g., window.plisio_params). 4. Payload: A POST request is sent with the 'action' parameter set to 'plisio_test_setup', the extracted 'nonce', and any required functional parameters like 'api_key'. 5. Impact: The attacker can trigger outbound API requests to verify API keys or potentially manipulate settings depending on the specific handler targeted. If the 'nopriv' hook is used, no authentication is required; otherwise, a Subscriber-level account is sufficient.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.