e-shot <= 1.0.2 - Missing Authorization to Authenticated (Subscriber+) Form Settings Modification via AJAX
Description
The e-shot™ form builder plugin for WordPress is vulnerable to Missing Authorization in all versions up to and including 1.0.2. The eshot_form_builder_update_field_data() AJAX handler lacks any capability checks (current_user_can()) or nonce verification (check_ajax_referer()/wp_verify_nonce()). The function is registered via the wp_ajax_ hook, making it accessible to any authenticated user. This makes it possible for authenticated attackers, with Subscriber-level access and above, to modify form field configurations including mandatory status, field visibility, and form display preferences via the eshot_form_builder_update_field_data AJAX action.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:NTechnical Details
<=1.0.2# Exploitation Research Plan: CVE-2026-3642 (e-shot Form Builder) ## 1. Vulnerability Summary The **e-shot™ form builder** plugin (up to version 1.0.2) contains a missing authorization vulnerability in its AJAX handling logic. Specifically, the function `eshot_form_builder_update_field_data()` is r…
Show full research plan
Exploitation Research Plan: CVE-2026-3642 (e-shot Form Builder)
1. Vulnerability Summary
The e-shot™ form builder plugin (up to version 1.0.2) contains a missing authorization vulnerability in its AJAX handling logic. Specifically, the function eshot_form_builder_update_field_data() is registered via the wp_ajax_ hook but fails to implement any capability checks (e.g., current_user_can()) or CSRF protection (nonces). This allows any authenticated user—even those with the lowest permissions like Subscribers—to modify form field configurations, potentially altering form behavior, visibility, and data collection settings across the site.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - AJAX Action:
eshot_form_builder_update_field_data - Method: POST
- Authentication: Required (Subscriber level or higher).
- Vulnerable Parameter(s): Likely parameters include form identifiers and configuration arrays (e.g.,
form_id,field_id,status,mandatory,is_visible). - Preconditions: The plugin must be active, and at least one form must exist for modification to be impactful.
3. Code Flow
- Entry Point: A user sends a POST request to
/wp-admin/admin-ajax.phpwithaction=eshot_form_builder_update_field_data. - Hook Registration: The plugin registers the handler (likely in the main plugin file or an admin/AJAX inclusion file):
add_action('wp_ajax_eshot_form_builder_update_field_data', 'eshot_form_builder_update_field_data'); - Execution: WordPress invokes
eshot_form_builder_update_field_data(). - Vulnerable Sink: The function reads data directly from
$_POST. Because it lackscurrent_user_can()andcheck_ajax_referer(), it proceeds to update the form configuration in the database (likely usingupdate_post_meta()if forms are CPTs, orupdate_option()).
4. Nonce Acquisition Strategy
According to the vulnerability description, this endpoint lacks nonce verification. Therefore, no nonce is required to exploit the vulnerability.
If a nonce check were present but misconfigured, the strategy would be:
- Identify where the plugin localizes its AJAX variables (search for
wp_localize_script). - Create a page with the e-shot form shortcode (likely
[eshot_form id="..."]). - Navigate to that page as an authenticated user.
- Extract the nonce from the JS object (e.g.,
window.eshot_vars.nonce).
Note: For this specific CVE, we proceed assuming no nonce is needed.
5. Exploitation Strategy
Step 1: Authentication
Log in as a Subscriber user to obtain a session cookie.
Step 2: Target Identification
Determine the ID of an existing form. (In a test environment, we will create one).
Step 3: Payload Construction
Construct a POST request to modify a specific field's mandatory status or visibility.
Request Details:
- URL:
http://<target>/wp-admin/admin-ajax.php - Header:
Content-Type: application/x-www-form-urlencoded - Body:
(Note: Exact parameter names likeaction=eshot_form_builder_update_field_data&form_id=[ID]&field_id=[FIELD_KEY]&mandatory=1&is_visible=0field_id,mandatory, andis_visibleare inferred based on the function name and description; these will be verified during initial source code inspection by the agent.)
Step 4: Execution
Send the request using the http_request tool.
6. Test Data Setup
- Install Plugin: Ensure
e-shot-form-builderversion 1.0.2 is installed. - Create Admin Form: As an admin, create a sample form with at least one text field.
- Example:
wp post create --post_type=eshot_form --post_title="Contact Us" --post_status=publish(assumingeshot_formCPT).
- Example:
- Create Subscriber:
wp user create attacker attacker@example.com --role=subscriber --user_pass=password123
- Identify Form ID: Use
wp post list --post_type=eshot_formto get the target ID.
7. Expected Results
- The AJAX request should return a successful status (likely
200 OKor a JSON success message). - The targeted form configuration in the database will be updated.
- When an admin views the form builder in the backend, the modified settings (e.g., a field being hidden or marked mandatory) will be reflected.
8. Verification Steps
- Database Check: Use WP-CLI to inspect the post meta of the modified form:
Verify that the field data reflects the malicious changes sent in the AJAX request.wp post meta list [FORM_ID] - UI Verification: Log in as admin and navigate to the e-shot Form Builder settings for that form to see if the changes are visible in the editor.
9. Alternative Approaches
If eshot_form_builder_update_field_data requires a specific data structure (like a nested array or JSON string):
- JSON Payload: Try sending the data as a JSON string in a
dataparameter:action=eshot_form_builder_update_field_data&form_id=1&data={"field_1":{"mandatory":"true"}} - Global Settings: If the function updates global plugin options rather than specific forms, check
wp option getfor keys starting witheshot_. - Action Guessing: If the action name is slightly different (e.g.,
update_form_settings), usegrep -r "wp_ajax_" .inside the plugin directory to find the exact hook name.
Summary
The e-shot™ form builder plugin for WordPress is vulnerable to unauthorized form configuration changes due to a lack of capability checks and nonce verification in its AJAX handler. This allows authenticated users with Subscriber-level access or higher to modify field settings, visibility, and mandatory requirements for existing forms.
Security Fix
@@ -10,4 +10,9 @@ function eshot_form_builder_update_field_data() { + if ( ! current_user_can( 'manage_options' ) ) { + wp_send_json_error( 'Forbidden', 403 ); + } + check_ajax_referer( 'eshot_form_builder_nonce', 'security' ); + $form_id = $_POST['form_id'];
Exploit Outline
An attacker authenticates as a Subscriber and identifies a target form ID. They send a POST request to /wp-admin/admin-ajax.php with action=eshot_form_builder_update_field_data, providing the form_id and new configuration values (such as setting mandatory=1 or is_visible=0). Since the plugin lacks authorization checks and nonce verification, it processes the request and modifies the form's configuration in the database.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.