
IDOR authentifié / Contrôle d'accès cassé dans le plugin Tutor LMS
Avertissement : Ce dépôt a été créé à des fins pédagogiques et de divulgation éthique uniquement. La vulnérabilité a été signalée de manière responsable à l'éditeur et corrigée. N'utilisez pas ces informations pour exploiter des systèmes sans autorisation appropriée.
Une vulnérabilité de type référence directe à un objet non sécurisée (IDOR) / contrôle d'accès cassé a été découverte dans le plugin Tutor LMS pour WordPress (versions <= 3.9.5). Cette faille permet à un utilisateur à faibles privilèges disposant du rôle Tutor Instructor d'effectuer des actions de masse non autorisées, telles que modifier le statut de publication ou supprimer définitivement des cours appartenant à d'autres instructeurs ou administrateurs.
En interceptant une requête backend légitime et en modifiant le paramètre d'ID de cours, un attaquant peut contourner les contrôles d'accès prévus. Dans un scénario réel, cela permet à des acteurs malveillants de saboter les cours de concurrents sur une place de marché multi-instructeurs, entraînant une interruption directe de l'activité, une perte de revenus et des dommages à la réputation.
<= 3.9.53.9.6Le problème principal provient de l'absence de contrôles d'autorisation au niveau des objets dans le gestionnaire d'actions de masse du plugin.
Fichier : tutor/classes/Course_List.php
Fonction : course_list_bulk_action()
1. Identifiants d'objets non validés :
La fonction accepte des entrées contrôlées par l'utilisateur (bulk-action et bulk-ids) directement depuis la requête HTTP. Bien que le plugin vérifie que l'utilisateur dispose d'une capacité générale à gérer les cours, il ne vérifie pas du tout la propriété de chaque cours pour les ID spécifiques fournis dans le tableau bulk-ids.
2. Exécution sans vérification de propriété :
Lorsque le chemin de mise à jour du statut (update_course_status()) ou le chemin de suppression (bulk_delete_course()) est déclenché, le code itère sur les ID fournis par l'attaquant. Il exécute des opérations de base de données (par exemple, mise à jour de cp_posts.post_status) à l'aide d'une clause WHERE ID IN (...) sans ajouter de condition pour garantir que $post_author == $current_user_id.
Comme le gestionnaire n'applique pas d'autorisation au niveau des objets, tout instructeur ayant accès au flux d'actions de masse peut manipuler des ID de cours arbitraires.
Les étapes suivantes montrent comment un instructeur Tutor authentifié peut modifier le statut du cours d'un autre instructeur.
course_id cible appartenant à un autre instructeur (victime). (par exemple, ID : 27)./wp-admin/admin.php?page=tutor). Sélectionnez un cours que vous possédez, choisissez une action de changement de statut (par exemple, passer à "brouillon"), puis cliquez sur "Appliquer".POST sortante vers /wp-admin/admin-ajax.php.status en trash (ou pending, private).id de votre ID de cours à l'ID de cours de la victime (27).{"success":true}. Le cours de la victime est déplacé avec succès dans la corbeille et disparaît du frontend public.