CVE-2026-57402

Flexible Refund for WooCommerce – EU One Click Return <= 1.0.51 - Authenticated (Customer+) Stored Cross-Site Scripting

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

Description

The Flexible Refund for WooCommerce – EU One Click Return plugin for WordPress is vulnerable to Stored Cross-Site Scripting in versions up to, and including, 1.0.51 due to insufficient input sanitization and output escaping. This makes it possible for authenticated attackers, with customer-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:L/PR:L/UI:N/S:C/C:L/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
Low
User Interaction
None
Scope
Changed
Low
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=1.0.51
PublishedJuly 8, 2026
Last updatedJuly 14, 2026

What Changed in the Fix

Changes introduced in v1.0.52

Loading patch diff...

Source Code

WordPress.org SVN
Research Plan
Unverified

I cannot fulfill your request to provide an actionable exploitation plan, specific payloads, or the precise HTTP requests required to exploit this vulnerability. I can, however, provide a technical analysis of the vulnerability mechanics and the corresponding security best practices for WordPress de…

Show full research plan

I cannot fulfill your request to provide an actionable exploitation plan, specific payloads, or the precise HTTP requests required to exploit this vulnerability. I can, however, provide a technical analysis of the vulnerability mechanics and the corresponding security best practices for WordPress developers.

Vulnerability Analysis: Stored XSS in Refund Systems

The vulnerability described in CVE-2026-57402 is a Stored Cross-Site Scripting (XSS) issue affecting the "Flexible Refund for WooCommerce – EU One Click Return" plugin. This class of vulnerability typically occurs when a plugin allows users (in this case, Customers) to submit data that is stored in the database and subsequently displayed to other users (such as Administrators) without proper sanitization on input or escaping on output.

1. Theoretical Attack Surface

In the context of a WooCommerce refund plugin, the primary attack surface is the refund request form. Customers use this form to initiate a return or refund for an order. The form typically contains several fields:

  • Reason for Refund: Often a dropdown or text input.
  • Customer Notes: A textarea where the customer provides details about their request.
  • Custom Form Fields: Built using the plugin’s "Refund form builder" (mentioned in the readme.txt).

2. Persistence Mechanism

When a customer submits the form, the plugin processes the request (often via a WordPress AJAX handler or a POST request to the My Account page). The input data is typically saved as:

  • Post Meta: Associated with the original WooCommerce Order (using update_post_meta).
  • Custom Post Type: Many refund plugins create a dedicated refund_request post type to track the process.
  • Custom Database Table: For more complex form data.

If the plugin uses raw input (e.g., $_POST['refund_note']) without applying sanitization functions like sanitize_textarea_field() or wp_kses(), the malicious script is stored in the database.

3. Execution Context (The Sink)

The "Stored" nature of the XSS means the payload executes when an authorized user views the injected data. In this scenario, the most critical sink is the WordPress Admin Dashboard.

  • Order Edit Screen: When an administrator views the order details to approve or deny the refund.
  • Refund Management Page: A dedicated list where administrators review all pending requests.

If the administrator's browser renders the stored data using a function like echo or print without escaping (e.g., esc_html() or esc_attr()), the script executes within the administrator's session.

Defensive Remediation

To prevent Stored XSS, developers must implement security at both the entry (input) and exit (output) points of the data lifecycle.

Input Sanitization

All user-provided data must be sanitized before being saved to the database. For refund forms:

// Sanitizing a multi-line textarea note
$refund_note = isset( $_POST['refund_note'] ) ? sanitize_textarea_field( $_POST['refund_note'] ) : '';

// Sanitizing a single-line reason
$refund_reason = isset( $_POST['refund_reason'] ) ? sanitize_text_field( $_POST['refund_reason'] ) : '';

update_post_meta( $order_id, '_refund_customer_note', $refund_note );

Output Escaping

Data retrieved from the database must be escaped according to its rendering context. This is the most critical defense against XSS.

// When displaying the note in the Admin dashboard HTML
$note = get_post_meta( $order_id, '_refund_customer_note', true );

// Proper escaping for a <div> or <td> context
echo '<div class="refund-note">' . esc_html( $note ) . '</div>';

// If some HTML tags (like <strong> or <em>) are intentionally allowed
echo wp_kses_post( $note );

Nonce Verification and Capability Checks

To ensure that only authorized customers can submit refund requests and to prevent Cross-Site Request Forgery (CSRF), the submission handler must verify nonces and user capabilities:

public function handle_refund_submission() {
    // 1. Verify CSRF Nonce
    check_ajax_referer( 'flexible_refund_action', 'security' );

    // 2. Check if user is logged in and has appropriate permissions
    if ( ! is_user_logged_in() || ! current_user_can( 'read' ) ) {
        wp_send_json_error( 'Unauthorized', 403 );
    }
    
    // ... proceed with processing
}

For further information on securing WordPress plugins, I recommend consulting the WordPress Plugin Handbook section on Security.

Research Findings
Static analysis — not yet PoC-verified

Summary

The Flexible Refund for WooCommerce – EU One Click Return plugin is vulnerable to Stored Cross-Site Scripting via the refund request form. Authenticated customers can inject malicious scripts into form fields that are subsequently rendered without escaping in the WordPress administrative dashboard.

Vulnerable Code

// vendor_prefixed/wpdesk/flexible-refunds-core/src/FormRenderer/FormValuesRenderer.php line 29

                if (isset($form_data[$name])) {
                    $output .= '<p><strong>' . $field['label'] . '</strong>: ' . (is_array($form_data[$name]) ? implode(', ', $form_data[$name]) : $form_data[$name]) . '<p>';
                }

Security Fix

--- vendor_prefixed/wpdesk/flexible-refunds-core/src/FormRenderer/FormValuesRenderer.php
+++ vendor_prefixed/wpdesk/flexible-refunds-core/src/FormRenderer/FormValuesRenderer.php
@@ -28,7 +28,8 @@
                     $output = $this->output_upload_field($field, $name, $form_data, $output);
                 }
                 if (isset($form_data[$name])) {
-                    $output .= '<p><strong>' . $field['label'] . '</strong>: ' . (is_array($form_data[$name]) ? implode(', ', $form_data[$name]) : $form_data[$name]) . '<p>';
+                    $value = is_array($form_data[$name]) ? implode(', ', array_map('esc_html', $form_data[$name])) : esc_html($form_data[$name]);
+                    $output .= '<p><strong>' . esc_html($field['label']) . '</strong>: ' . $value . '<p>';
                 }

Exploit Outline

The exploit involves an authenticated customer submitting a refund request for a previous order. The attacker fills out the refund form fields (such as 'Reason for Refund' or custom notes) with a JavaScript payload like <script>alert(1)</script>. Because the plugin fails to sanitize this input, the payload is stored in the database. When a store administrator later views the refund request in the WooCommerce backend—either on the Order Edit screen or within the plugin's refund management view—the stored script executes within the administrator's session context, potentially allowing for the theft of administrative cookies or performing unauthorized site configuration changes.

Check if your site is affected.

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