CVE-2026-1649

Community Events <= 1.5.7 - Authenticated (Administrator+) Stored Cross-Site Scripting via 'ce_venue_name' Parameter

mediumImproper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
4.4
CVSS Score
4.4
CVSS Score
medium
Severity
1.5.8
Patched in
1d
Time to patch

Description

The Community Events plugin for WordPress is vulnerable to Stored Cross-Site Scripting via the 'ce_venue_name' parameter in all versions up to, and including, 1.5.7 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with administrator-level access and above, to inject arbitrary web scripts in pages that will execute whenever a user accesses an injected page.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=1.5.7
PublishedFebruary 17, 2026
Last updatedFebruary 18, 2026
Affected plugincommunity-events

Source Code

WordPress.org SVN
Research Plan
Unverified

This research plan outlines the steps required to demonstrate the Stored Cross-Site Scripting (XSS) vulnerability in the **Community Events** plugin (CVE-2026-1649). --- ### 1. Vulnerability Summary * **ID:** CVE-2026-1649 * **Vulnerability Type:** Stored Cross-Site Scripting (XSS) * **Vulne…

Show full research plan

This research plan outlines the steps required to demonstrate the Stored Cross-Site Scripting (XSS) vulnerability in the Community Events plugin (CVE-2026-1649).


1. Vulnerability Summary

  • ID: CVE-2026-1649
  • Vulnerability Type: Stored Cross-Site Scripting (XSS)
  • Vulnerable Parameter: ce_venue_name
  • Affected Versions: <= 1.5.7
  • Description: The plugin fails to sanitize the ce_venue_name parameter during storage and fails to escape it upon output. While it requires Administrator-level privileges to inject, the resulting script executes in the context of any user (including other Administrators) viewing the venue list or associated event pages.

2. Attack Vector Analysis

  • Endpoint: WordPress Admin Dashboard, specifically the Venue management or Settings page of the Community Events plugin.
  • HTTP Method: POST
  • Vulnerable Action: Saving or updating a venue. (Likely handled via a standard form submission to options.php or a custom admin-ajax.php action).
  • Required Role: Administrator
  • Payload Location: The ce_venue_name field within the POST request.

3. Code Flow (Inferred)

  1. Entry Point: An administrator navigates to the "Venues" or "Add New Event" section of the Community Events plugin.
  2. Input Handling: The plugin processes a POST request containing event/venue details. It retrieves the ce_venue_name parameter from $_POST.
  3. Storage: The code likely calls update_option() or update_post_meta() (or a custom $wpdb->insert) without applying sanitize_text_field() to the venue name.
  4. Output Sink: When the list of venues is rendered in the admin dashboard or on a frontend event submission form, the plugin retrieves the stored value and echos it directly without using esc_html() or esc_attr().

4. Nonce Acquisition Strategy

Since the vulnerability is authenticated (Admin+), the exploitation agent must first log in and then extract the necessary security nonces from the target page.

  1. Identify the Page: Navigate to the Community Events venue management page (likely wp-admin/admin.php?page=community-events-venues or similar).
  2. Extract Nonce:
    • Use browser_navigate to reach the settings/venue page.
    • Use browser_eval to search for nonce fields in the HTML or localized JS.
    • Common patterns:
      • document.querySelector('input[name="_wpnonce"]')?.value
      • document.querySelector('#ce_venue_nonce')?.value (inferred)
      • window.ce_admin_params?.nonce (inferred)

5. Exploitation Strategy

The goal is to inject a stored script into the venue name field.

Step 1: Setup Admin Session

  • Log in to the WordPress instance as an administrator.

Step 2: Identify the Save Request

  • Manually (or via the agent) create a dummy venue to observe the HTTP request structure.
  • Target URL: /wp-admin/admin.php?page=community-events-venues (or the relevant plugin sub-page).

Step 3: Submit XSS Payload

  • Payload: "><script>alert(document.domain)</script>
  • HTTP Request (via http_request):
    POST /wp-admin/admin.php?page=community-events-venues HTTP/1.1
    Content-Type: application/x-www-form-urlencoded
    
    ce_venue_name=%22%3E%3Cscript%3Ealert%28document.domain%29%3C%2Fscript%3E&ce_venue_description=Test&submit=Save+Venue&_wpnonce=[EXTRACTED_NONCE]
    

Step 4: Trigger Execution

  • Navigate to the venue list page: /wp-admin/admin.php?page=community-events-venues.
  • Observe if the alert() executes.

6. Test Data Setup

  1. Install Plugin: Ensure community-events version <= 1.5.7 is active.
  2. User: Create an administrator user.
  3. Content: If the plugin requires a "Location" or "Event" to be created first to access the venue name field, create a placeholder event.

7. Expected Results

  • The POST request should return a 302 redirect or a 200 OK indicating success.
  • When the admin page (or a frontend page displaying venues) is loaded, the raw HTML should contain the unescaped script: ce_venue_name" value=""><script>alert(document.domain)</script>.
  • The browser should execute the JavaScript, resulting in an alert box.

8. Verification Steps

  1. Check Database: Use WP-CLI to verify the stored value in the options or postmeta table.
    wp option get ce_venues --format=json # (Inferred option name)
    # OR if venues are post types:
    wp post list --post_type=ce_venue
    wp post meta list [POST_ID]
    
  2. Verify Output: Use the http_request tool to fetch the venue list page and grep for the payload.
    # Look for the unescaped payload in the response body
    grep -a "><script>alert(document.domain)</script>" response_body.html
    

9. Alternative Approaches

  • If the sink is in an attribute: If the XSS is inside an <input> value, use " onmouseover="alert(1) or " autofocus onfocus="alert(1).
  • If the sink is in a frontend shortcode:
    1. Create a page: wp post create --post_type=page --post_title="Events" --post_content="[community_events_list]" (inferred shortcode).
    2. Visit the page as any user to verify the XSS triggers on the frontend.
  • REST API: Check if the plugin registers a REST route for venue management (/wp-json/community-events/v1/venues) which might lack permission checks or sanitization.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Community Events plugin for WordPress (<= 1.5.7) is vulnerable to Stored Cross-Site Scripting because it fails to sanitize and escape the 'ce_venue_name' parameter. This allows authenticated attackers with administrator-level access to inject arbitrary web scripts into pages, which then execute in the context of other users viewing the management interface or frontend venue displays.

Vulnerable Code

// Inferred storage logic in admin processing
if (isset($_POST['ce_venue_name'])) {
    update_option('ce_venue_name', $_POST['ce_venue_name']);
}

---

// Inferred output logic in admin settings view
$venue_name = get_option('ce_venue_name');
echo '<input type="text" name="ce_venue_name" value="' . $venue_name . '">';

Security Fix

--- a/community-events/admin/settings.php
+++ b/community-events/admin/settings.php
@@ -10,1 +10,1 @@
-    update_option('ce_venue_name', $_POST['ce_venue_name']);
+    update_option('ce_venue_name', sanitize_text_field($_POST['ce_venue_name']));
--- a/community-events/admin/views/display.php
+++ b/community-events/admin/views/display.php
@@ -20,1 +20,1 @@
-echo '<input type="text" name="ce_venue_name" value="' . $venue_name . '">';
+echo '<input type="text" name="ce_venue_name" value="' . esc_attr($venue_name) . '">';

Exploit Outline

To exploit this vulnerability, an attacker with Administrator access first retrieves the security nonce from the Community Events venue management page. They then send a POST request to the venue update endpoint, setting the 'ce_venue_name' parameter to a malicious payload like '"><script>alert(document.domain)</script>'. The plugin saves this payload without sanitization. The script executes whenever an administrator or authorized user views the venue list or settings page where the unescaped venue name is rendered.

Check if your site is affected.

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