JobBoard Job listing <= 1.2.8 - Unauthenticated Information Exposure
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:NTechnical Details
<=1.2.8# 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_detailsorjob_board_get_job_details(inferred based on plugin functionality; specific action to be verified). - Payload Parameters:
action: The vulnerable AJAX action.user_idorid: 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
- The plugin initializes and registers AJAX handlers in
includes/class-job-board-ajax.phpor the main plugin file using:add_action( 'wp_ajax_nopriv_job_board_get_user_details', array( $this, 'get_user_details' ) ); - The handler function (e.g.,
get_user_details) is invoked when a POST request is sent toadmin-ajax.phpwith the matchingaction. - The handler likely takes a
user_idorpost_idfrom$_POSTor$_GET. - The handler calls
get_userdata( $user_id )orget_post( $post_id ). - Crucially, the handler fails to filter the resulting object or check if the current requester has permission to view the data.
- The sensitive data (including
user_email,user_login, and potentiallyuser_passhashes if the whole object is returned) is sent to the client viawp_send_json()orecho 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.
Identify Shortcode: The plugin uses shortcodes like
[job_board_listing]or[job_board_search]to display jobs.Create Setup Page:
wp post create --post_type=page --post_title="Job Search" --post_status=publish --post_content='[job_board_listing]'Navigate and Extract:
Navigate to the newly created page usingbrowser_navigate.Extract Nonce:
The nonce is likely stored in a global JS object registered viawp_localize_script. Common names for this plugin:window.job_board_ajax_obj?.noncewindow.job_board_vars?.ajax_noncewindow.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).
Discovery Phase:
Usegrepto find allwp_ajax_nopriv_hooks in the plugin directory:grep -r "wp_ajax_nopriv_" /var/www/html/wp-content/plugins/job-board-light/Request Construction:
Once the action name is confirmed (e.g.,job_board_get_user_details), send a POST request using thehttp_requesttool.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]
Analysis:
Check the response body for JSON data containing keys likeuser_email,user_login,display_name, oruser_pass.
6. Test Data Setup
- Ensure the plugin is installed and activated.
- Create a secondary "Job Poster" user to test exposure of non-admin users:
wp user create jobposter poster@example.com --role=author - 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_emailoruser_loginin a response reachable without a logged-in session.
8. Verification Steps
- 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 - 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 leakwp_optionsdata.job_board_fetch_jobs: Check if theauthorobject is nested inside the job results.- Payload:
action=job_board_fetch_jobs&id=[JOB_ID]
- Payload:
- 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.
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
@@ -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.