BackItUp <= 2.1.0 - Missing Authorization
Description
The BackItUp plugin for WordPress is vulnerable to unauthorized access due to a missing capability check on a function in versions up to, and including, 2.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
<=2.1.0This research plan targets **CVE-2025-68039**, a Missing Authorization vulnerability in the **WP BackItUp Community Edition** plugin (<= 2.1.0). The vulnerability allows unauthenticated attackers to execute sensitive functions—likely related to notice dismissal or configuration changes—that should b…
Show full research plan
This research plan targets CVE-2025-68039, a Missing Authorization vulnerability in the WP BackItUp Community Edition plugin (<= 2.1.0). The vulnerability allows unauthenticated attackers to execute sensitive functions—likely related to notice dismissal or configuration changes—that should be restricted to administrators.
1. Vulnerability Summary
The vulnerability arises from the registration of AJAX handlers using the wp_ajax_nopriv_ hook without accompanying capability checks (current_user_can) or robust nonce verification. This exposes internal plugin logic to any unauthenticated visitor who can send a POST request to wp-admin/admin-ajax.php. Given the "Low Integrity" impact, the vulnerability likely allows the modification of specific plugin options or the suppression of security/backup notifications.
2. Attack Vector Analysis
- Endpoint:
/wp-admin/admin-ajax.php - Action (Inferred):
wp_backitup_dismiss_noticeorwpbi_dismiss_notice. (The agent must verify the exact string viagrep). - HTTP Method: POST
- Parameters:
action,notice_id(or similar identifier), and potentially a nonce. - Authentication: None required (unauthenticated).
- Preconditions: The plugin must be active.
3. Code Flow
- Entry Point: WordPress receives a request to
admin-ajax.phpwith anactionparameter starting withwp_ajax_nopriv_. - Hook Registration: The plugin registers a callback in its main file or an AJAX include (e.g.,
inc/wpbi-ajax.phporwp-backitup.php).- Search Pattern:
add_action(\s*['"]wp_ajax_nopriv_([^'"]+)['"]
- Search Pattern:
- Vulnerable Function: The callback function (e.g.,
wp_backitup_dismiss_notice()) is invoked. - Authorization Failure: The function performs a state-changing operation—such as
update_option()—without checking if the current user has themanage_optionscapability. - Sink: The database state is modified (e.g., an option like
wp_backitup_dismissed_noticesis updated).
4. Nonce Acquisition Strategy
If the function calls check_ajax_referer() or wp_verify_nonce(), the agent must find where the nonce is generated and exposed.
- Identify Nonce Action: Search for
wp_create_noncein the plugin code to find the action string associated with the vulnerable handler. - Locate Exposure: Search for
wp_localize_scriptorwp_nonce_fieldto see where the nonce is printed to the HTML. - Check Shortcodes: Many backup plugins only load scripts on their admin pages or on pages containing a specific shortcode. Check for
add_shortcodein the source. - Extraction:
- Create a page with the identified shortcode:
wp post create --post_type=page --post_status=publish --post_content='[wp_backitup_shortcode]' - Navigate to the page using
browser_navigate. - Extract the nonce:
browser_eval("window.wpbi_ajax_object?.nonce")(Replacewpbi_ajax_objectwith the actual localized variable name found in the source).
- Create a page with the identified shortcode:
Note: If the check is entirely missing or if check_ajax_referer is called with die=false and the result is not checked, the nonce is unnecessary.
5. Exploitation Strategy
The goal is to demonstrate unauthorized modification of plugin state.
- Discovery: Run
grep -r "wp_ajax_nopriv" .to list all unauthenticated AJAX actions. Identify those that lackcurrent_user_can('manage_options'). - Request Construction: Use the
http_requesttool to send a POST request.- URL:
{{BASE_URL}}/wp-admin/admin-ajax.php - Headers:
Content-Type: application/x-www-form-urlencoded - Body:
action=wp_backitup_dismiss_notice¬ice_id=security_check_warning(adjust based on source analysis).
- URL:
- Response Analysis: A successful exploit will typically return a
200 OKwith a JSON body{"success":true}or a string like1.
6. Test Data Setup
- Install and activate WP BackItUp Community Edition <= 2.1.0.
- Identify a specific "notice" or "option" the plugin uses. For example, if the plugin has a "Review Us" notice, find its ID in the code.
- If the exploit requires a nonce from a frontend page, create a post with the necessary shortcode:
wp post create --post_title="Trigger" --post_content="[wp_backitup]" --post_status="publish"
7. Expected Results
- The
admin-ajax.phprequest returns a success indicator. - The WordPress database is updated unauthorized. Specifically, the
wp_optionstable should show changes to the plugin's notice-tracking options.
8. Verification Steps
After sending the HTTP request, verify the impact using WP-CLI:
- Check Options:
wp option get wp_backitup_dismissed_notices - Compare State: Verify that the option now contains the
notice_idsent in the exploit payload, confirming that an unauthenticated user successfully modified the site configuration.
9. Alternative Approaches
If wp_backitup_dismiss_notice is not the culprit:
- Search for
update_option: Search the plugin for all occurrences ofupdate_optionand trace them backward to see if any are reachable viawp_ajax_nopriv. - Check
admin_init: Sometimes plugins hook functions toadmin_initthat do not checkis_admin(). Sinceadmin-ajax.phptriggersadmin_init, these functions can be called by anyone.- Search Pattern:
add_action(\s*['"]admin_init['"]followed by a check for$_GETor$_POSTparameters without capability checks.
- Search Pattern:
Summary
The WP BackItUp Community Edition plugin for WordPress is vulnerable to unauthorized access in versions up to 2.1.0 because it registers AJAX actions via 'wp_ajax_nopriv_' without capability checks or nonce verification. This allows unauthenticated attackers to perform administrative actions, such as dismissing important security or system notices, by sending a direct request to the AJAX endpoint.
Exploit Outline
An attacker can exploit this vulnerability by sending an unauthenticated POST request to the '/wp-admin/admin-ajax.php' endpoint with the 'action' parameter set to the vulnerable handler (identified as 'wpbi_dismiss_notice' or 'wp_backitup_dismiss_notice'). By providing the appropriate parameters, such as a 'notice_id', the attacker triggers the server-side callback which updates the plugin's configuration options (e.g., 'wp_backitup_dismissed_notices') in the database, effectively manipulating administrative UI state without permission.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.