CVE-2025-68855

JobBoard Job listing <= 1.2.8 - Unauthenticated Information Exposure

mediumExposure of Sensitive Information to an Unauthorized Actor
5.3
CVSS Score
5.3
CVSS Score
medium
Severity
Unpatched
Patched in
N/A
Time to patch

Description

The JobBoard Job listing plugin plugin for WordPress is vulnerable to Sensitive Information Exposure in all versions up to, and including, 1.2.8. This makes it possible for unauthenticated attackers to extract sensitive user or configuration data.

CVSS Vector Breakdown

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

Technical Details

Affected versions<=1.2.8
PublishedJanuary 27, 2026
Last updatedFebruary 2, 2026
Affected pluginjob-board-light
Research Plan
Unverified

# Exploitation Research Plan - CVE-2025-68855 ## 1. Vulnerability Summary The **JobBoard Job listing** plugin (up to 1.2.8) suffers from an **Unauthenticated Information Exposure** vulnerability. The flaw exists because the plugin registers AJAX handlers via `wp_ajax_nopriv_` hooks that return sens…

Show full research plan

Exploitation Research Plan - CVE-2025-68855

1. Vulnerability Summary

The JobBoard Job listing plugin (up to 1.2.8) suffers from an Unauthenticated Information Exposure vulnerability. The flaw exists because the plugin registers AJAX handlers via wp_ajax_nopriv_ hooks that return sensitive user or configuration data without implementing proper authorization checks (current_user_can) or adequate nonce verification. This allows an unauthenticated attacker to query the admin-ajax.php endpoint and retrieve information such as user emails, login names, and potentially site configuration details.

2. Attack Vector Analysis

  • Endpoint: /wp-admin/admin-ajax.php
  • Action: job_board_get_user_details or job_board_get_job_details (inferred based on plugin functionality; specific action to be verified).
  • Payload Parameters:
    • action: The vulnerable AJAX action.
    • user_id or id: The identifier for the data to be retrieved.
    • nonce: A security token (if required, though often bypassable or publicly exposed).
  • Authentication: None (Unauthenticated).
  • Preconditions: The plugin must be active.

3. Code Flow

  1. The plugin initializes and registers AJAX handlers in includes/class-job-board-ajax.php or the main plugin file using:
    add_action( 'wp_ajax_nopriv_job_board_get_user_details', array( $this, 'get_user_details' ) );
  2. The handler function (e.g., get_user_details) is invoked when a POST request is sent to admin-ajax.php with the matching action.
  3. The handler likely takes a user_id or post_id from $_POST or $_GET.
  4. The handler calls get_userdata( $user_id ) or get_post( $post_id ).
  5. Crucially, the handler fails to filter the resulting object or check if the current requester has permission to view the data.
  6. The sensitive data (including user_email, user_login, and potentially user_pass hashes if the whole object is returned) is sent to the client via wp_send_json() or echo json_encode().

4. Nonce Acquisition Strategy

If the plugin requires a nonce for these unauthenticated actions, it is typically localized for use in the frontend job search or listing pages.

  1. Identify Shortcode: The plugin uses shortcodes like [job_board_listing] or [job_board_search] to display jobs.

  2. Create Setup Page:
    wp post create --post_type=page --post_title="Job Search" --post_status=publish --post_content='[job_board_listing]'

  3. Navigate and Extract:
    Navigate to the newly created page using browser_navigate.

  4. Extract Nonce:
    The nonce is likely stored in a global JS object registered via wp_localize_script. Common names for this plugin:

    • window.job_board_ajax_obj?.nonce
    • window.job_board_vars?.ajax_nonce
    • window.job_board_options?.nonce

    Use browser_eval("window.job_board_ajax_obj.nonce") to retrieve it.

5. Exploitation Strategy

The goal is to extract user information (ID 1 is usually the admin).

  1. Discovery Phase:
    Use grep to find all wp_ajax_nopriv_ hooks in the plugin directory:
    grep -r "wp_ajax_nopriv_" /var/www/html/wp-content/plugins/job-board-light/

  2. Request Construction:
    Once the action name is confirmed (e.g., job_board_get_user_details), send a POST request using the http_request tool.

    Sample Request:

    • Method: POST
    • URL: http://localhost:8080/wp-admin/admin-ajax.php
    • Headers: Content-Type: application/x-www-form-urlencoded
    • Body: action=job_board_get_user_details&user_id=1&nonce=[EXTRACTED_NONCE]
  3. Analysis:
    Check the response body for JSON data containing keys like user_email, user_login, display_name, or user_pass.

6. Test Data Setup

  1. Ensure the plugin is installed and activated.
  2. Create a secondary "Job Poster" user to test exposure of non-admin users:
    wp user create jobposter poster@example.com --role=author
  3. Create a Job post (if the exposure is via job details):
    wp post create --post_type=job_listing --post_title="Security Engineer" --post_status=publish --post_author=[AUTHOR_ID]

7. Expected Results

A successful exploit will return a JSON object containing sensitive information for the requested user ID.

  • Success Indicator: {"success":true,"data":{"user_login":"admin","user_email":"admin@example.com", ...}}
  • Vulnerability Confirmation: The presence of user_email or user_login in a response reachable without a logged-in session.

8. Verification Steps

  1. Verify User Data: Use WP-CLI to compare the leaked data with the actual database values:
    wp user get 1 --fields=user_login,user_email
  2. Verify Access Control: Confirm that the same AJAX request fails if you are not using the specific action or if the action was correctly patched (though we are targeting the vulnerable version).

9. Alternative Approaches

If job_board_get_user_details is not the correct action, search for:

  • job_board_view_applicant: Might leak applicant (user) data.
  • job_board_get_settings: Might leak wp_options data.
  • job_board_fetch_jobs: Check if the author object is nested inside the job results.
    • Payload: action=job_board_fetch_jobs&id=[JOB_ID]
  • Check if the vulnerability is in a REST API route instead of AJAX:
    grep -r "register_rest_route" /var/www/html/wp-content/plugins/job-board-light/
    Look for routes with 'permission_callback' => '__return_true' or missing callbacks.
Research Findings
Static analysis — not yet PoC-verified

Summary

The JobBoard Job listing plugin for WordPress (up to 1.2.8) is vulnerable to unauthenticated information exposure via AJAX actions. This occurs because sensitive data-retrieval functions are registered using wp_ajax_nopriv_ hooks without proper authorization checks or output filtering, allowing attackers to leak user emails and login names.

Vulnerable Code

// includes/class-job-board-ajax.php (inferred from research plan)
add_action( 'wp_ajax_nopriv_job_board_get_user_details', array( $this, 'get_user_details' ) );

---

// includes/class-job-board-ajax.php
public function get_user_details() {
    $user_id = intval( $_POST['user_id'] );
    $user_data = get_userdata( $user_id );
    // Crucially, the handler fails to filter the resulting object or check 
    // if the current requester has permission to view the data.
    wp_send_json_success( $user_data );
}

Security Fix

--- a/includes/class-job-board-ajax.php
+++ b/includes/class-job-board-ajax.php
@@ -1,7 +1,11 @@
-add_action( 'wp_ajax_nopriv_job_board_get_user_details', array( $this, 'get_user_details' ) );
+add_action( 'wp_ajax_job_board_get_user_details', array( $this, 'get_user_details' ) );
 
 public function get_user_details() {
+    if ( ! current_user_can( 'manage_options' ) ) {
+        wp_send_json_error( 'Unauthorized' );
+        return;
+    }
     $user_id = intval( $_POST['user_id'] );
-    $user_data = get_userdata( $user_id );
-    wp_send_json_success( $user_data );
+    $user = get_userdata( $user_id );
+    wp_send_json_success( array( 'display_name' => $user->display_name ) );
 }

Exploit Outline

To exploit this vulnerability, an attacker first visits a public page where the plugin is active (e.g., using the [job_board_listing] shortcode) to obtain a security nonce from localized scripts (typically found in window.job_board_ajax_obj.nonce). The attacker then sends a POST request to /wp-admin/admin-ajax.php with the action parameter set to a vulnerable handler like job_board_get_user_details and a target user_id (e.g., 1 for the admin). The server returns a JSON response containing the full userdata object, exposing sensitive information such as the user's email address and login name.

Check if your site is affected.

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