Travel <= 11.1.0 - Missing Authorization
Description
The Travel plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 11.1.0. 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:NTechnical Details
<=11.1.0What Changed in the Fix
Changes introduced in v11.1.1
Source Code
WordPress.org SVN# Exploitation Research Plan: CVE-2026-24568 (WP Travel <= 11.1.0) ## 1. Vulnerability Summary The **WP Travel** plugin (versions up to 11.1.0) contains a missing authorization vulnerability in its REST API implementation, specifically related to the plugin's setup and configuration functionality. …
Show full research plan
Exploitation Research Plan: CVE-2026-24568 (WP Travel <= 11.1.0)
1. Vulnerability Summary
The WP Travel plugin (versions up to 11.1.0) contains a missing authorization vulnerability in its REST API implementation, specifically related to the plugin's setup and configuration functionality. The vulnerability allows unauthenticated attackers to modify plugin settings by making direct requests to REST API endpoints that lack proper permission_callback validation.
2. Attack Vector Analysis
- Endpoint:
/wp-json/wp-travel/v1/settingsor/wp-json/wp-travel/v1/setup/save(inferred fromadmin-setup-page.jsandadmin-settings.js). - Method:
POST - Authentication: None Required (
PR:N). - Payload Type:
application/json - Vulnerable Parameter: The JSON body containing the
settingsobject. - Preconditions: The plugin must be active. No specific setup wizard state is required as the REST routes are registered on
rest_api_init.
3. Code Flow
- Registration: The plugin registers REST routes in
inc/rest-api/class-wp-travel-rest-settings-controller.php(or similar) during therest_api_inithook. - Missing Check: The
register_rest_routecall for thesettingsendpoint (POST method) fails to implement apermission_callbackthat verifiescurrent_user_can('manage_options'). - Execution: When a
POSTrequest is received at/wp-json/wp-travel/v1/settings, theupdate_itemorsave_settingsmethod is called. - Sink: The settings provided in the request body are passed to
update_option('wp_travel_settings', ...)without verifying the requester's identity.
4. Nonce Acquisition Strategy
While the REST API usually requires a wp_rest nonce for authenticated users to prevent CSRF, unauthenticated requests (without cookies) often bypass this check if the permission_callback is set to __return_true or is missing. If a nonce is enforced even for unauthenticated users, it can be retrieved from the localized script data.
- Localized Variable:
wp_travel_setup_varsorwp_travel_obj(inferred). - Target Page: Any page where the plugin is active, or the setup page (if accessible).
- Strategy:
- Create a page with a WP Travel shortcode to ensure scripts are loaded.
- Use
browser_navigateto visit the page. - Use
browser_evalto extract the nonce. - JavaScript:
window.wp_travel_setup_vars?.nonceorwindow.wpApiSettings?.nonce.
5. Exploitation Strategy
Step 1: Discover the Endpoint
Test the settings endpoint to see if it responds to unauthenticated GET requests (information disclosure) and POST requests.
Step 2: Craft Payload
The payload should target a non-destructive but verifiable setting, such as the currency or the number of itineraries per page.
- Target Setting:
currency_codeoritineraries_per_page. - Payload:
{
"settings": {
"currency_code": "HACKED",
"itineraries_per_page": "1337"
}
}
Step 3: Execute Unauthenticated Request
Using the http_request tool:
- URL:
http://localhost:8080/wp-json/wp-travel/v1/settings - Method:
POST - Headers:
Content-Type: application/json
- Body:
{"settings": {"currency_code": "HACKED"}}
6. Test Data Setup
- Activate Plugin: Ensure
wp-travelis installed and active. - Initialize Settings: Run
wp option update wp_travel_settings '{"currency_code":"USD"}' --format=jsonto set a baseline. - Create Extraction Page:
wp post create --post_type=page --post_title="Travel Test" --post_status=publish --post_content='[wp_travel_itineraries]'
7. Expected Results
- Response: The server should return a
200 OKor201 Createdwith the updated settings in the response body. - Data Change: The
wp_travel_settingsoption in the WordPress database will be updated with the attacker-supplied values.
8. Verification Steps
- Database Check:
Verify thatwp option get wp_travel_settings --format=json"currency_code"is now"HACKED". - UI Check: Navigate to the WP Travel settings page in the admin dashboard (as an admin) and observe the modified currency.
9. Alternative Approaches
- Setup Save Endpoint: If
/wp-json/wp-travel/v1/settingsis protected, try/wp-json/wp-travel/v1/setup/save_settings. - Import Trigger: If settings modification is restricted, attempt to trigger the trip import function via
/wp-json/wp-travel/v1/setup/import_demo_data. - Nonce Header: If the request fails with a 403, obtain a nonce using
browser_eval("wpApiSettings.nonce")and include it in theX-WP-Nonceheader.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.