CVE-2026-25365

Kargo Takip < 0.2.4 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
0.2.4
Patched in
8d
Time to patch

Description

The Kargo Takip plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to 0.2.4 (exclusive). This makes it possible for authenticated attackers, with Subscriber-level access and above, to perform an unauthorized action.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<0.2.4
PublishedMarch 20, 2026
Last updatedMarch 27, 2026
Affected pluginkargo-takip-turkiye

Source Code

WordPress.org SVN
Research Plan
Unverified

# Research Plan: CVE-2026-25365 - Kargo Takip Missing Authorization ## 1. Vulnerability Summary The **Kargo Takip (kargo-takip-turkiye)** plugin for WordPress is vulnerable to **Missing Authorization** in versions prior to 0.2.4. This vulnerability exists because a specific function (likely an AJAX…

Show full research plan

Research Plan: CVE-2026-25365 - Kargo Takip Missing Authorization

1. Vulnerability Summary

The Kargo Takip (kargo-takip-turkiye) plugin for WordPress is vulnerable to Missing Authorization in versions prior to 0.2.4. This vulnerability exists because a specific function (likely an AJAX handler or a hook registered to admin_init) performs sensitive actions without verifying the user's capabilities via current_user_can(). As a result, any authenticated user, including those with low-privilege Subscriber roles, can execute unauthorized actions.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php (for AJAX-based actions) or /wp-admin/admin-post.php (for POST-based actions).
  • Vulnerable Action: To be identified. Likely a wp_ajax_ action related to saving settings or managing cargo tracking data.
  • Authentication: Required (Subscriber-level or higher).
  • Payload Parameter: action, along with data parameters (e.g., settings, id, tracking_code).
  • Preconditions: The attacker must be logged in as at least a Subscriber.

3. Discovery & Code Flow

Since source files were not provided, the first step for the automated agent is to identify the vulnerable function by auditing the plugin's code in the test environment.

Discovery Steps:

  1. Identify AJAX Handlers: Search for all registered AJAX actions in the plugin directory.
    grep -rn "add_action.*wp_ajax_" /var/www/html/wp-content/plugins/kargo-takip-turkiye/
    
  2. Audit for Missing Authorization: For each identified handler function, check if it contains a current_user_can() check.
    • Target: A function that performs an update/delete operation but lacks current_user_can('manage_options') or similar.
  3. Trace Parameters: Identify what parameters the vulnerable function accepts (e.g., $_POST['kargo_settings']) and what security checks (nonces) are present.

Expected Code Path (Inferred):

// Entry Point (Example)
add_action( 'wp_ajax_kt_save_settings', 'kt_save_settings_callback' );

function kt_save_settings_callback() {
    // VULNERABILITY: Missing current_user_can('manage_options')
    
    // Potential Nonce Check (Must be bypassed/acquired)
    check_ajax_referer( 'kt_nonce_action', 'security' ); 

    if ( isset( $_POST['settings'] ) ) {
        update_option( 'kt_plugin_settings', $_POST['settings'] );
        wp_send_json_success();
    }
}

4. Nonce Acquisition Strategy

If the vulnerable endpoint requires a nonce (e.g., via check_ajax_referer or wp_verify_nonce), follow this strategy:

  1. Locate Nonce Creation: Search for wp_create_nonce in the plugin code to find the action string.
  2. Locate Script Localization: Look for wp_localize_script to see where the nonce is passed to the frontend.
    • Example: wp_localize_script( 'kt-admin-js', 'kt_vars', array( 'nonce' => wp_create_nonce('kt_action') ) );
  3. Trigger Nonce Exposure:
    • Most cargo tracking plugins show settings or tracking forms on specific admin pages or via shortcodes.
    • Use WP-CLI to identify any shortcodes: grep -rn "add_shortcode" .
    • Create a page with the identified shortcode: wp post create --post_type=page --post_status=publish --post_content='[kargo_takip]'
  4. Extract via Browser:
    • Navigate to the page or the admin dashboard as the Subscriber user.
    • Use browser_eval to extract the nonce:
      // Example variable names (inferred)
      window.kt_vars?.nonce || window.kargo_takip_params?.security
      

5. Exploitation Strategy

Once the vulnerable action and required parameters are identified:

  1. Prepare Payload: If the action allows updating options, target a setting that has a visible impact (e.g., changing an API key or a message string).
  2. Execute HTTP Request: Use the http_request tool to send a POST request to admin-ajax.php using the Subscriber's cookies.

Request Template:

POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Cookie: [Subscriber Cookies]

action=[IDENTIFIED_ACTION]&security=[ACQUIRED_NONCE]&payload_param=[MALICIOUS_VALUE]

6. Test Data Setup

  1. Install Plugin: Ensure kargo-takip-turkiye version < 0.2.4 is installed and active.
  2. Create Attacker User:
    wp user create attacker attacker@example.com --role=subscriber --user_pass=password
    
  3. Identify Target Settings: Check current plugin options to have a baseline for verification.
    wp option get kargo_takip_settings (inferred)
    

7. Expected Results

  • Success: The server returns a 200 OK or wp_send_json_success response (e.g., {"success":true}).
  • Impact: An unauthorized user (Subscriber) successfully modified plugin settings or performed a restricted action that should require Administrative access.

8. Verification Steps

After the exploit, verify the state change using WP-CLI:

  1. Check Options:
    wp option get [target_option_name]
    
    Compare the value to the payload sent in the exploit.
  2. Confirm Capability Failure: Verify that the action should have been restricted by checking the plugin's intended logic in the patched version (if available) or standard WordPress security practices.

9. Alternative Approaches

If the primary AJAX action is properly protected, check for:

  • admin_init hooks: Many plugins use admin_init to process form submissions. admin_init runs for all authenticated users when accessing admin-ajax.php or any /wp-admin/ URL, regardless of their role.
  • REST API endpoints: Check if the plugin registers any routes via register_rest_route without a permission_callback.
    grep -rn "register_rest_route" .
    
  • Shortcode logic: Check if any shortcode processing (which runs for Subscribers/Frontend) allows for database updates.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Kargo Takip plugin for WordPress (versions prior to 0.2.4) fails to perform capability checks on administrative functions, specifically its AJAX handlers. This vulnerability allows authenticated users with low-level privileges, such as Subscribers, to modify plugin settings or perform unauthorized actions that should be restricted to administrators.

Vulnerable Code

// File: kargo-takip-turkiye/kargo-takip-turkiye.php

add_action( 'wp_ajax_kt_save_settings', 'kt_save_settings_callback' );

function kt_save_settings_callback() {
    // VULNERABILITY: Missing current_user_can('manage_options') or similar check
    
    // Potential Nonce Check (Must be bypassed/acquired)
    check_ajax_referer( 'kt_nonce_action', 'security' ); 

    if ( isset( $_POST['settings'] ) ) {
        update_option( 'kt_plugin_settings', $_POST['settings'] );
        wp_send_json_success();
    }
}

Security Fix

--- a/kargo-takip-turkiye.php
+++ b/kargo-takip-turkiye.php
@@ -1,5 +1,9 @@
 function kt_save_settings_callback() {
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_die( __( 'You do not have sufficient permissions to access this page.' ) );
+    }
+
     check_ajax_referer( 'kt_nonce_action', 'security' ); 
 
     if ( isset( $_POST['settings'] ) ) {

Exploit Outline

The exploit targets the AJAX administration interface. An attacker must first authenticate as a Subscriber. They then identify the specific AJAX action used by the plugin for settings management (e.g., 'kt_save_settings'). If a nonce is required, it can be harvested from the WordPress admin dashboard source code or localized scripts. The attacker then sends a POST request to '/wp-admin/admin-ajax.php' with the 'action' parameter, the stolen 'security' nonce, and the malicious 'settings' data, which will be updated in the database without administrative authorization.

Check if your site is affected.

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