Cookie Banner for GDPR / CCPA <= 4.3.6 - Missing Authorization to Authenticated (Subscriber+) Scan Schedule Modification via gcc_save_schedule_scan AJAX Action
Description
The GDPR Cookie Consent plugin for WordPress is vulnerable to unauthorized modification of data due to a missing capability check and missing nonce verification on the gdpr_cookie_consent_ajax_save_schedule_scan() function (the wp_ajax_gcc_save_schedule_scan AJAX action) in versions up to, and including, 4.3.6. This makes it possible for authenticated attackers, with Subscriber-level access and above, to modify the plugin's cookie scan schedule configuration stored in the gdpr_scan_schedule_data option, which is an administrative function intended to be limited to users with the manage_options capability.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=4.3.6What Changed in the Fix
Changes introduced in v4.3.7
Source Code
WordPress.org SVN# Exploitation Research Plan - CVE-2026-12955 ## 1. Vulnerability Summary The **Cookie Banner for GDPR / CCPA** plugin (versions <= 4.3.6) is vulnerable to an **Authorization Bypass** via the `gcc_save_schedule_scan` AJAX action. The function `gdpr_cookie_consent_ajax_save_schedule_scan()` (the han…
Show full research plan
Exploitation Research Plan - CVE-2026-12955
1. Vulnerability Summary
The Cookie Banner for GDPR / CCPA plugin (versions <= 4.3.6) is vulnerable to an Authorization Bypass via the gcc_save_schedule_scan AJAX action. The function gdpr_cookie_consent_ajax_save_schedule_scan() (the handler for this action) fails to implement capability checks (current_user_can) and nonce verification (check_ajax_referer). This allows any authenticated user, including those with Subscriber privileges, to modify the administrative cookie scan schedule configuration stored in the gdpr_scan_schedule_data option.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - HTTP Method:
POST - Action:
gcc_save_schedule_scan - Payload Parameter:
schedule_data(inferred) or direct POST mapping. - Authentication: Authenticated (Subscriber-level or higher).
- Preconditions: The plugin must be active. A Subscriber user account is required to access
admin-ajax.php.
3. Code Flow
- The plugin registers the AJAX action:
add_action( 'wp_ajax_gcc_save_schedule_scan', 'gdpr_cookie_consent_ajax_save_schedule_scan' );. - A Subscriber user sends a POST request to
admin-ajax.phpwithaction=gcc_save_schedule_scan. - WordPress core dispatches the request to the handler function.
- The handler lacks a check for
manage_optionscapability. - The handler lacks a call to
check_ajax_refererorwp_verify_nonce. - The handler extracts data from
$_POSTand passes it toupdate_option( 'gdpr_scan_schedule_data', ... ).
4. Nonce Acquisition Strategy
According to the vulnerability report, this specific endpoint lacks nonce verification entirely.
However, if verification was partially implemented or the agent needs to verify the presence of nonces for other scanner actions, the following strategy applies:
- Identify Localization: The plugin localizes data via
gdpr_localize_data(found inadmin/js/gdpr-cookie-consent-admin-revamp.js). - Navigate to Admin: Use
browser_navigateto/wp-admin/admin.php?page=gdpr-cookie-consent-settings. - Extract via JS: Use
browser_eval("window.gdpr_localize_data")to find the relevant security token. - Note: Since the vulnerability explicitly states "missing nonce verification", requests should succeed without any
securityor_wpnonceparameters.
5. Exploitation Strategy
The goal is to modify the gdpr_scan_schedule_data option to demonstrate unauthorized control over administrative settings.
Step 1: Login
Authenticate as a Subscriber user using the provided credentials.
Step 2: Send Exploit Payload
Use the http_request tool to send the unauthorized update.
Request Details:
- URL:
http://[target]/wp-admin/admin-ajax.php - Method:
POST - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
(Note: Ifaction=gcc_save_schedule_scan&schedule_data[enable_scan]=true&schedule_data[scan_interval]=daily&schedule_data[scan_time]=03:15schedule_dataas an array fails, try flat parameters:action=gcc_save_schedule_scan&enable_scan=true&scan_interval=daily)
6. Test Data Setup
- Install Plugin: Ensure
gdpr-cookie-consentversion 4.3.6 is installed. - Create User:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123 - Check Initial State:
wp option get gdpr_scan_schedule_data
7. Expected Results
- HTTP Response: The server should return a successful status (likely
200 OK) and a body indicating success (e.g.,1,{"success":true}, or{"status":"success"}). - Data Impact: The
gdpr_scan_schedule_dataoption in the WordPress database will reflect the values sent by the Subscriber.
8. Verification Steps
After the http_request, verify the change using WP-CLI:
wp option get gdpr_scan_schedule_data
The output should show the daily interval and 03:15 time (or whichever values were used in the payload).
9. Alternative Approaches
If the schedule_data parameter name is incorrect:
- Inspection: Navigate to the "Cookie Scanner" tab in the admin UI using the browser tool.
- DOM Analysis: Use
browser_evalto inspect the "Save" button in the schedule settings section:// Check for form fields or AJAX calls in the scanner module Array.from(document.querySelectorAll('input, select')).filter(i => i.name.includes('scan')) - Parameter Refinement: Adjust the payload based on the found input
nameattributes.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.