Gutena Forms – Contact Form, Survey Form, Feedback Form, Booking Form, and Custom Form Builder <= 1.6.0 - Authenticated (Contributor+) Limited Options Update in save_gutena_forms_schema()
Description
The Gutena Forms – Contact Form, Survey Form, Feedback Form, Booking Form, and Custom Form Builder plugin for WordPress is vulnerable to unauthorized modification of data due to missing authorization within the save_gutena_forms_schema() function in all versions up to, and including, 1.6.0. This makes it possible for authenticated attackers, with Contributor-level access and above, to update option values to a structured array value on the WordPress site. This can be leveraged to update an option that would create an error on the site and deny service to legitimate users or be used to set some values, that would, for example enable site user registration when it is explicitly disabled.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:H/A:NTechnical Details
What Changed in the Fix
Changes introduced in v1.6.1
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-1674 (Gutena Forms Options Update) ## 1. Vulnerability Summary The **Gutena Forms** plugin (up to version 1.6.0) contains a missing authorization vulnerability in the `save_gutena_forms_schema()` function. This function is hooked to WordPress's `save_post` act…
Show full research plan
Exploitation Research Plan: CVE-2026-1674 (Gutena Forms Options Update)
1. Vulnerability Summary
The Gutena Forms plugin (up to version 1.6.0) contains a missing authorization vulnerability in the save_gutena_forms_schema() function. This function is hooked to WordPress's save_post action. Because the function fails to check for administrative capabilities (e.g., manage_options) or verify a specific security nonce before updating WordPress options, an authenticated user with at least Contributor level access (who can save posts) can trigger this function to overwrite arbitrary WordPress options with structured array data.
2. Attack Vector Analysis
- Endpoint:
wp-admin/post.php(via the standard post-save flow). - Action:
save_post(triggered when a user saves or updates a post). - Vulnerable Function:
Gutena_Forms::save_gutena_forms_schema(). - Payload Parameters:
gutena_forms_id: The name of the WordPress option to update (e.g.,users_can_register).gutena_forms_schema: The value to set the option to (must be an array/structured data).
- Authentication: Authenticated (Contributor or higher). Contributors can create posts and trigger
save_posteven if their posts are pending review.
3. Code Flow
- Registration: In
gutena-forms.php, the plugin registers the hook:add_action( 'save_post', array( $this, 'save_gutena_forms_schema' ), 10, 3 ); - Execution: When any post is saved,
save_gutena_forms_schema($post_id, $post, $update)is executed. - Missing Check: (Inferred from patch/vulnerability description) The function likely looks for
$_POST['gutena_forms_id']and$_POST['gutena_forms_schema']. - The Sink: It calls
update_option( $_POST['gutena_forms_id'], $_POST['gutena_forms_schema'] )without verifying if the current user has the authority to modify site options or if the request was intentional (nonce).
4. Nonce Acquisition Strategy
While the vulnerable function itself may lack a specific nonce check, the save_post action in the WordPress admin dashboard is protected by the core _wpnonce.
Strategy:
- Log in as a Contributor.
- Navigate to
wp-admin/post-new.php. - Use
browser_evalto extract the_wpnoncefrom the form or simply submit the form via the browser context. - The core WordPress nonce
_wpnonceis typically found in the hidden input field of the post editor form:document.getElementById('_wpnonce').value.
5. Exploitation Strategy
The goal is to enable site registration by setting the users_can_register option. While this option is normally a string ('0' or '1'), setting it to a non-empty array will cause (bool) get_option('users_can_register') to evaluate to true in most logic checks.
Step-by-Step Plan:
- Login: Authenticate as a Contributor user.
- Post Initialization: Access
wp-admin/post-new.phpto initiate a post creation session. - Payload Construction: Prepare a POST request to
wp-admin/post.php. - Execution:
- Use the
http_requesttool to send a multipart/form-data or application/x-www-form-urlencoded request. - Required Parameters:
action:editpostpost_ID: (The ID of the post being created)_wpnonce: (The nonce obtained from the post-new page)gutena_forms_id:users_can_registergutena_forms_schema[enabled]:1(This ensures the option becomes a structured array)post_title:Exploit Post
- Use the
- DoS Variant (Optional): To demonstrate Denial of Service, an attacker could target an option like
active_pluginsortemplate, thoughusers_can_registeris the most common POC for impact.
6. Test Data Setup
- User: Create a user with the Contributor role.
- Settings: Ensure
Settings > General > Membership (Anyone can register)is unchecked (value0) before starting. - Plugin: Ensure
gutena-formsversion 1.6.0 is active.
7. Expected Results
- The server will process the post-save request and return a 302 redirect to the post editor.
- The
save_gutena_forms_schemafunction will execute and callupdate_option('users_can_register', ['enabled' => '1']). - Since the array is not empty, WordPress will treat registration as enabled.
8. Verification Steps
- WP-CLI Check:
Expected Output: A serialized arraywp option get users_can_registera:1:{s:7:"enabled";s:1:"1";}or similar, instead of the string0. - UI Check: Navigate to the WordPress login page (
/wp-login.php) and verify that the "Register" link is now visible. - Functional Check:
Expected Output: HTTP 200 OK (instead of a redirect or error indicating registration is disabled).curl -I http://localhost:8080/wp-login.php?action=register
9. Alternative Approaches
If gutena_forms_id is not the correct parameter name (due to truncation in the source), check the following common naming conventions used by the plugin:
gutena_form_idgutena_forms_datagutena_form_schema
If the save_post hook is only registered for a specific Post Type, check if the plugin registers a CPT called gutena-forms. If so, use wp post create --post_type=gutena-forms as the base for the exploit. In the provided source gutena-forms.php, the following include is seen:include_once GUTENA_FORMS_DIR_PATH . 'includes/class-gutena-cpt.php';
This confirms the existence of a Custom Post Type. The exploit should be attempted by saving a post of type gutena-forms.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.