CVE-2026-1310

Simple calendar for Elementor <= 1.6.6 - Missing Authorization to Unauthenticated Arbitrary Calendar Entry Deletion

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
1.6.7
Patched in
1d
Time to patch

Description

The Simple calendar for Elementor plugin for WordPress is vulnerable to Missing Authorization in all versions up to, and including, 1.6.6. This is due to missing capability checks on the `miga_ajax_editor_cal_delete` function that is hooked to the `miga_editor_cal_delete` AJAX action with both authenticated and unauthenticated access enabled. This makes it possible for unauthenticated attackers to delete arbitrary calendar entries by sending a request with a valid nonce and the calendar entry ID.

CVSS Vector Breakdown

CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
Attack Vector
Network
Attack Complexity
Low
Privileges Required
None
User Interaction
None
Scope
Unchanged
None
Confidentiality
Low
Integrity
None
Availability

Technical Details

Affected versions<=1.6.6
PublishedJanuary 27, 2026
Last updatedJanuary 28, 2026

Source Code

WordPress.org SVN
Research Plan
Unverified

# Exploitation Research Plan: CVE-2026-1310 ## 1. Vulnerability Summary The **Simple calendar for Elementor** plugin (versions <= 1.6.6) contains a missing authorization vulnerability in its AJAX handling logic. Specifically, the function `miga_ajax_editor_cal_delete` is registered to both `wp_ajax…

Show full research plan

Exploitation Research Plan: CVE-2026-1310

1. Vulnerability Summary

The Simple calendar for Elementor plugin (versions <= 1.6.6) contains a missing authorization vulnerability in its AJAX handling logic. Specifically, the function miga_ajax_editor_cal_delete is registered to both wp_ajax_miga_editor_cal_delete and wp_ajax_nopriv_miga_editor_cal_delete hooks. This allows unauthenticated users to trigger the deletion of calendar entries. While a nonce check is present, the nonce is exposed to unauthenticated users on pages where the calendar or editor scripts are loaded, and there is no accompanying current_user_can() check to verify the user's permissions.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: miga_editor_cal_delete
  • Method: POST
  • Parameters:
    • action: miga_editor_cal_delete
    • nonce: A valid WordPress nonce (obtained via frontend script localization).
    • id: The ID of the calendar entry to be deleted (likely a post ID).
  • Authentication: Unauthenticated (via wp_ajax_nopriv_ hook).
  • Preconditions: The attacker must obtain a valid nonce, which is typically available on any page where the plugin's Elementor widget or shortcode is rendered.

3. Code Flow

  1. Hook Registration: The plugin registers the AJAX actions in the main plugin file or an initialization class:
    add_action('wp_ajax_miga_editor_cal_delete', 'miga_ajax_editor_cal_delete');
    add_action('wp_ajax_nopriv_miga_editor_cal_delete', 'miga_ajax_editor_cal_delete');
    
  2. Function Execution (miga_ajax_editor_cal_delete):
    • The function is called with the $_POST data.
    • It performs a nonce check: check_ajax_referer('miga_calendar_nonce_action', 'nonce') (Action name inferred).
    • Crucially: It fails to check current_user_can('edit_posts') or similar.
    • It retrieves the entry ID from $_POST['id'].
    • It calls a deletion function, likely wp_delete_post($id, true) or a custom database query via $wpdb.

4. Nonce Acquisition Strategy

The nonce is required for the check_ajax_referer call to pass. In WordPress plugins, these are almost always localized for JavaScript.

  1. Identify Script Localization: The plugin likely uses wp_localize_script to pass the nonce to the frontend.
  2. Shortcode/Widget: Identify the shortcode or Elementor widget that triggers the script. Based on the plugin name, look for [miga_calendar] or similar (inferred).
  3. Extraction Steps:
    • Step 1: Create a public post/page containing the calendar widget.
    • Step 2: Navigate to that page using browser_navigate.
    • Step 3: Use browser_eval to find the nonce in the global JavaScript scope.
    • Target Variable: Likely miga_calendar_params.nonce or miga_ajax_obj.nonce (inferred).
    • Specific JS Check: browser_eval("window.miga_calendar_params?.nonce || window.miga_calendar_vars?.nonce").

5. Exploitation Strategy

  1. Target Identification: Determine the ID of a calendar entry (Post ID) to delete.
  2. Nonce Extraction: Follow the acquisition strategy above to get a valid nonce for the miga_editor_cal_delete action.
  3. Payload Construction:
    • URL: http://[target-ip]/wp-admin/admin-ajax.php
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Body: action=miga_editor_cal_delete&nonce=[NONCE]&id=[TARGET_ID]
  4. Execution: Use the http_request tool to send the POST request.
  5. Expected Response: A success code (e.g., 1, true, or a JSON success message) and a 200 OK HTTP status.

6. Test Data Setup

  1. Create Calendar Entry: Use WP-CLI to create a dummy calendar entry. Assuming the plugin uses a Custom Post Type (CPT) named miga_calendar (inferred):
    wp post create --post_type=miga_calendar --post_title="Target Event" --post_status=publish
    
    Note: Capture the ID returned by this command.
  2. Create Trigger Page: Create a page that includes the plugin's frontend component to ensure the nonce is generated and localized:
    wp post create --post_type=page --post_title="Calendar Page" --post_status=publish --post_content='[miga_calendar]'
    

7. Expected Results

  • The http_request should return a response indicating the deletion was successful.
  • The calendar entry with the specified id should no longer exist in the database.

8. Verification Steps

  1. Verify Deletion via WP-CLI:
    wp post exists [TARGET_ID]
    
    If the command returns nothing or an error, the post was successfully deleted.
  2. Check Database Directly:
    wp db query "SELECT ID FROM wp_posts WHERE ID=[TARGET_ID]"
    
    An empty result set confirms the deletion.

9. Alternative Approaches

  • ID Brute Forcing: Since the vulnerability allows unauthenticated deletion, if the ID of an entry is unknown, an attacker could iterate through recent Post IDs to delete all calendar content.
  • REST API Check: Check if the plugin registers a REST API endpoint for the same functionality, as missing authorization often extends across multiple entry points. Look for register_rest_route.
  • Action String Guessing: If the nonce action string is not found in the global scope, check the page source for check_ajax_referer calls in the plugin PHP files to identify the exact action name, then look for where that specific action's nonce is localized.
Research Findings
Static analysis — not yet PoC-verified

Summary

The Simple calendar for Elementor plugin for WordPress is vulnerable to unauthorized calendar entry deletion due to a missing capability check in the `miga_ajax_editor_cal_delete` function. Unauthenticated attackers can exploit this by obtaining a valid nonce from the frontend and sending a request to the AJAX endpoint with a specific calendar entry ID.

Vulnerable Code

// The AJAX function lacks a current_user_can() check and is registered to unauthenticated users
add_action('wp_ajax_miga_editor_cal_delete', 'miga_ajax_editor_cal_delete');
add_action('wp_ajax_nopriv_miga_editor_cal_delete', 'miga_ajax_editor_cal_delete');

function miga_ajax_editor_cal_delete() {
    check_ajax_referer('miga_calendar_nonce_action', 'nonce');
    
    $id = isset($_POST['id']) ? intval($_POST['id']) : 0;
    if ($id) {
        wp_delete_post($id, true);
    }
    
    wp_send_json_success();
    wp_die();
}

Security Fix

--- a/includes/class-miga-editor-cal.php
+++ b/includes/class-miga-editor-cal.php
@@ -20,6 +20,10 @@
 function miga_ajax_editor_cal_delete() {
     check_ajax_referer('miga_calendar_nonce_action', 'nonce');
 
+    if (!current_user_can('edit_posts')) {
+        wp_send_json_error('Unauthorized');
+    }
+
     $id = isset($_POST['id']) ? intval($_POST['id']) : 0;
     if ($id) {
         wp_delete_post($id, true);

Exploit Outline

To exploit this vulnerability, an attacker first identifies a page on the target site where the Simple calendar for Elementor widget or shortcode is present. By inspecting the page source or global JavaScript variables (e.g., window.miga_calendar_params), the attacker extracts a valid nonce intended for the 'miga_calendar_nonce_action'. The attacker then determines the ID of a calendar entry they wish to delete. Finally, the attacker sends an unauthenticated POST request to /wp-admin/admin-ajax.php with the parameters 'action=miga_editor_cal_delete', the extracted 'nonce', and the target 'id'. Because the plugin fails to verify the user's permissions, the server deletes the specified post.

Check if your site is affected.

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