CVE-2025-67977

HAPPY <= 1.0.8 - Missing Authorization

mediumMissing Authorization
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
1.0.9
Patched in
7d
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 all versions up to, and including, 1.0.8. 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.8
PublishedJanuary 27, 2026
Last updatedFebruary 2, 2026

Source Code

WordPress.org SVN
Patched

Patched version not available.

Research Plan
Unverified

This research plan outlines the steps required to analyze and exploit CVE-2025-67977, a missing authorization vulnerability in the **HAPPY – Helpdesk Support Ticket System** plugin for WordPress. ### 1. Vulnerability Summary * **Vulnerability:** Missing Authorization * **Affected Plugin:** HAPP…

Show full research plan

This research plan outlines the steps required to analyze and exploit CVE-2025-67977, a missing authorization vulnerability in the HAPPY – Helpdesk Support Ticket System plugin for WordPress.

1. Vulnerability Summary

  • Vulnerability: Missing Authorization
  • Affected Plugin: HAPPY – Helpdesk Support Ticket System (slug: happy-helpdesk-support-ticket-system)
  • Affected Versions: <= 1.0.8
  • Vulnerable Function: Likely an AJAX handler registered with wp_ajax_nopriv_ that performs a privileged action (e.g., ticket deletion, status update, or settings modification) without calling current_user_can().
  • Impact: Unauthenticated attackers can perform unauthorized actions, such as deleting support tickets or modifying ticket data, which should be restricted to agents or administrators.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Vulnerable Action: happy_delete_ticket (inferred) or happy_ticket_delete (inferred).
  • HTTP Parameter: id or ticket_id (the ID of the ticket to manipulate).
  • Authentication: Unauthenticated (vulnerability exists in the nopriv AJAX hook).
  • Preconditions: A valid WordPress nonce for the action must be obtained (unless the nonce check is also missing).

3. Code Flow (Inferred)

  1. Entry Point: The plugin registers AJAX hooks in a class constructor (likely in inc/classes/class-ajax.php or includes/class-happy-ajax.php).
  2. Hook Registration: add_action( 'wp_ajax_nopriv_happy_delete_ticket', array( $this, 'delete_ticket' ) );
  3. Vulnerable Function: The delete_ticket function is invoked.
  4. The Flaw: Inside delete_ticket, the code may check for a nonce using check_ajax_referer() or wp_verify_nonce(), but it fails to verify the user's capabilities using current_user_can( 'manage_options' ) or a similar check.
  5. The Sink: The function proceeds to call wp_delete_post( $_POST['id'] ) or a direct database query via $wpdb.

4. Nonce Acquisition Strategy

Support plugins typically enqueue scripts on pages where the helpdesk interface is displayed.

  1. Identify Shortcode: Look for shortcodes like [happy_ticket_system], [happy_create_ticket], or [happy_support_center] in the plugin code.
  2. Create Trigger Page: Use WP-CLI to create a public page containing the shortcode to force the plugin to enqueue its JavaScript and localize the nonce.
    wp post create --post_type=page --post_title="Support" --post_status=publish --post_content='[happy_ticket_system]'
    
  3. Extract Nonce: Use browser_navigate to visit the new page and browser_eval to extract the nonce from the localized script object.
    • Inferred JS Variable: happy_helpdesk_obj or happy_ajax_vars.
    • Inferred Nonce Key: nonce or security.
    • Action: browser_eval("window.happy_helpdesk_obj?.nonce")

5. Exploitation Strategy

  1. Setup Test Data: Create a "victim" ticket to be deleted.
  2. Obtain Nonce: Follow the acquisition strategy above.
  3. Send Exploit Request: Use the http_request tool to send a POST request to admin-ajax.php.
    • URL: http://localhost:8080/wp-admin/admin-ajax.php
    • Method: POST
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Body: action=happy_delete_ticket&id=[TICKET_ID]&security=[NONCE] (Replace placeholders with actual values).

6. Test Data Setup

  • Create a Ticket: Since tickets are likely a Custom Post Type (CPT), identify the CPT name (e.g., happy_ticket).
    # Check for the post type
    wp post-type list
    # Create a dummy ticket
    wp post create --post_type=happy_ticket --post_title="Vulnerable Ticket" --post_status=publish
    
  • Identify Ticket ID: Note the ID returned by the creation command.

7. Expected Results

  • HTTP Response: A success code (e.g., 200 OK or a JSON response {"success":true}).
  • Functional Result: The ticket with the specified ID should be moved to the trash or permanently deleted from the WordPress database.

8. Verification Steps

  1. Verify Deletion via WP-CLI:
    # Attempt to fetch the post. If it returns nothing or shows 'trash' status, exploit succeeded.
    wp post get [TICKET_ID] --field=post_status
    
  2. Check Database Directly:
    wp db query "SELECT post_status FROM wp_posts WHERE ID = [TICKET_ID]"
    

9. Alternative Approaches

  • Missing Nonce Check: If browser_eval fails to find a nonce, attempt the exploit without the security parameter, as the plugin might have missing nonce verification in addition to missing authorization.
  • Other Actions: If happy_delete_ticket is not the vulnerable action, search the codebase for all wp_ajax_nopriv_ hooks:
    grep -r "wp_ajax_nopriv_" /var/www/html/wp-content/plugins/happy-helpdesk-support-ticket-system/
    
    Audit each resulting function for the absence of current_user_can(). Common targets include happy_close_ticket, happy_update_ticket, or happy_save_settings.
Research Findings
Static analysis — not yet PoC-verified

Summary

The HAPPY – Helpdesk Support Ticket System plugin for WordPress (<= 1.0.8) fails to perform capability checks in AJAX handlers registered with wp_ajax_nopriv_ hooks. This allows unauthenticated attackers to execute sensitive functions, such as deleting tickets, provided they can obtain a valid nonce from the site's front-end.

Exploit Outline

1. Identify a public page where the plugin's shortcode (e.g., [happy_ticket_system]) is active to retrieve a localized nonce. 2. Extract the nonce from the localized script object (likely happy_helpdesk_obj.nonce) via browser tools or a simple script. 3. Send an unauthenticated POST request to /wp-admin/admin-ajax.php with the action parameter set to the vulnerable function (e.g., happy_delete_ticket), the target ticket ID, and the security nonce. 4. Observe that the action is performed because the plugin lacks a current_user_can() check inside the AJAX handler.

Check if your site is affected.

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