CVE-2025-68854

ID Arrays <= 2.1.2 - Reflected Cross-Site Scripting

mediumImproper Neutralization of Input During Web Page Generation ('Cross-site Scripting')
6.1
CVSS Score
6.1
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The ID Arrays plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to, and including, 2.1.2 due to insufficient input sanitization and output escaping. This makes it possible for unauthenticated attackers to inject arbitrary web scripts in pages that execute if they can successfully trick a user into performing an action such as clicking on a link.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=2.1.2
PublishedJanuary 29, 2026
Last updatedFebruary 2, 2026
Affected pluginid-arrays
Research Plan
Unverified

# Exploitation Research Plan: CVE-2025-68854 (ID Arrays) ## 1. Vulnerability Summary The **ID Arrays** plugin for WordPress (versions up to 2.1.2) is vulnerable to **Reflected Cross-Site Scripting (XSS)**. This vulnerability occurs because the plugin accepts user-supplied input via URL parameters a…

Show full research plan

Exploitation Research Plan: CVE-2025-68854 (ID Arrays)

1. Vulnerability Summary

The ID Arrays plugin for WordPress (versions up to 2.1.2) is vulnerable to Reflected Cross-Site Scripting (XSS). This vulnerability occurs because the plugin accepts user-supplied input via URL parameters and echoes it back into the HTML response without adequate sanitization (using functions like sanitize_text_field) or context-aware output escaping (using functions like esc_html or esc_attr).

2. Attack Vector Analysis

  • Endpoint: Likely a public-facing page or a specific plugin-generated view.
  • Vulnerable Parameter: Likely id, ids, array, or search (inferred).
  • Authentication: None required (Unauthenticated Reflected XSS).
  • Preconditions: The victim (potentially an administrator) must click a crafted link containing the payload.

3. Code Flow

Since source files were not provided, the following is the inferred logic based on common Reflected XSS patterns in similar plugins:

  1. Entry Point: The plugin registers a hook (e.g., init, wp_enqueue_scripts, or a shortcode callback) that executes on frontend page loads.
  2. Input Acquisition: The code accesses a superglobal variable, most likely $_GET['id'] or $_GET['array'].
  3. Processing (The Flaw): The code performs logic based on the input but fails to sanitize the raw string.
  4. Sink: The raw input is echoed directly into the HTML:
    // Hypothetical vulnerable code
    if (isset($_GET['id'])) {
        echo '<div class="id-display">Displaying ID: ' . $_GET['id'] . '</div>';
    }
    

4. Nonce Acquisition Strategy

Reflected XSS typically occurs on the initial rendering of a page based on URL parameters and usually does not require a nonce. If the vulnerable output is inside an AJAX handler (wp_ajax_nopriv), a nonce might be required.

If a nonce is found to be required during research:

  1. Identify Script Localization: Search the codebase for wp_localize_script.
  2. Locate Shortcode: Find the shortcode that enqueues the script: grep -r "add_shortcode" .
  3. Setup Page: Create a test page using wp post create --post_content='[id_arrays_shortcode]'.
  4. Extraction:
    • Navigate to the page using browser_navigate.
    • Extract the nonce: browser_eval("window.id_arrays_vars?.nonce") (inferred variable name).

5. Exploitation Strategy

Step 1: Identification of the Sink

The automated agent must first find the vulnerable parameter by searching for unescaped echoes of $_GET.

grep -rP "echo\s+\\\$_GET\[" /var/www/html/wp-content/plugins/id-arrays/

Step 2: Payload Crafting

Depending on the context found in Step 1:

  • HTML Context: <script>alert(window.origin)</script>
  • Attribute Context: "><script>alert(window.origin)</script>
  • JavaScript Context: ;alert(window.origin);//

Step 3: Execution via http_request

Send the request to the identified endpoint.

  • Method: GET
  • URL: http://localhost:8080/?vulnerable_param=<script>alert(window.origin)</script> (Replace vulnerable_param with the discovered parameter).

Step 4: Verification via browser_navigate

Use the browser tool to confirm the script executes.

  • Navigate to the crafted URL.
  • Check for an alert or a specific DOM change.

6. Test Data Setup

  1. Install Plugin: Ensure id-arrays version 2.1.2 is active.
  2. Create Content: If the vulnerability is within a shortcode, create a page:
    wp post create --post_type=page --post_status=publish --post_title="XSS Test" --post_content="[id_arrays]" 
    
  3. Identify Params: Determine if the plugin reacts to specific query parameters like ?id=123.

7. Expected Results

  • The http_request response body should contain the raw payload: <script>alert(window.origin)</script>.
  • The browser_navigate execution should trigger the JavaScript payload, which can be verified by checking for an alert dialog or observing the injected script tag in the rendered DOM.

8. Verification Steps

  1. Check Response Body:
    # Look for the payload in the source
    curl -s "http://localhost:8080/?vulnerable_param=XSS_CANARY" | grep "XSS_CANARY"
    
  2. Check for Escaping: Confirm that esc_html or esc_attr are NOT present in the source code around the identified sink:
    grep -nC 5 "echo.*vulnerable_param" /var/www/html/wp-content/plugins/id-arrays/file.php
    

9. Alternative Approaches

  • Path Traversal/XSS Combo: If the plugin uses the parameter to include a template, test if a payload can be injected into the path.
  • Admin-side Reflection: Check if the XSS is reflected in the WordPress Dashboard (e.g., /wp-admin/admin.php?page=id-arrays&msg=<script>...). This would require an active admin session but carries higher impact (Cookie theft).
Research Findings
Static analysis — not yet PoC-verified

Summary

The ID Arrays plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to 2.1.2 due to insufficient input sanitization and output escaping on URL parameters. An unauthenticated attacker can exploit this by tricking a user into clicking a crafted link, leading to the execution of arbitrary web scripts in the victim's browser.

Exploit Outline

1. Identify a vulnerable URL parameter used by the plugin (such as 'id', 'ids', 'array', or 'search') that is reflected in the page output. 2. Construct a malicious URL targeting a page where the plugin is active, appending a script payload to the identified parameter (e.g., `?id=<script>alert(window.origin)</script>`). 3. Induce a victim to click the crafted link via social engineering. 4. Upon navigation, the plugin echoes the raw payload into the HTML response without applying sanitization or context-aware escaping, causing the browser to execute the injected script.

Check if your site is affected.

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