Moodle 5.2.3 - Élevé - À distance - IDOR - core_grades_get_feedback ignore les vérifications des groupes séparés
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-feedback-idor
Moodle LMS 5.2.3 - Moodle
Classe : IDOR Portée : Distante
core_grades_get_feedback appelle toujours uniquement require_capability('gradereport/grader:view'). D'autres services web de notes ont reçu groups_user_groups_visible / groups_group_visible après MSA-26-0016 / MDL-88667. Ce service AJAX ne l'a pas reçu. Le JSON revient avec feedbacktext, fullname, picture et le premier champ d'identité.
Un enseignant non-éditeur dans des groupes séparés, sans accessallgroups, POSTe l'userid d'un autre étudiant et lit le feedback de ce groupe.
| ID | pas encore de CVE |
| CWE | CWE-863 / CWE-200 |
| CVSS | Moyen : 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| Produit | Moodle |
| Affecté | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Auth | enseignant non-éditeur avec gradereport/grader:view, sans moodle/site:accessallgroups. Cours en groupes séparés. |
| Licence | GNU Affero GPL v3.0 |
| Lab | 127.0.0.1 uniquement |
Auteur : un enseignant non-éditeur inscrit dans un cours en groupes séparés, dans le groupe A uniquement, avec la vue du carnet de notes et sans access-all-groups. Il choisit l'userid d'un autre étudiant inscrit (entiers séquentiels) et appelle le service AJAX. Pas de RCE. Pas de LPE. Pas d'écriture de note.
| Privilège | Méthode / sink | Recon / intégrité / disponibilité | Prouvé en lab ou déduit |
|---|---|---|---|
| Lire le feedback de notes d'un autre groupe | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | Recon | Prouvé en lab. HTTP 200, error=false, feedbacktext contient MOODLE-GRADES-FEEDBACK-IDOR-WITNESS |
| Lire le champ d'identité et le nom d'affichage de cet étudiant | Même réponse additionalfield / fullname / picture | Recon | Prouvé en lab. [email protected], fullname=Student Bravo |
Parcourir les valeurs séquentielles d'userid dans le même cours | Même méthode, ids devinés | Recon | Déduit. Le lab a utilisé l'id seedé du groupe B |
| Lister le groupe B via le sélecteur frère | core_grades_get_gradable_users {courseid, groupid=B} | n/a | Prouvé en lab fermé. cannotaccessgroup |
| Un étudiant appelle le même service de feedback | rôle étudiant, mêmes arguments | n/a | Prouvé en lab fermé. nopermissions |
| Feedback du même groupe (étudiant du groupe A) | appel enseignant pour Student Alpha | Recon (prévu) | Prouvé en lab autorisé. HTTP 200, error=false |
| RCE PHP / LPE OS / écriture de note | n/a | n/a | Fermé. Ce reliquat est une lecture de feedback et de champs de profil |
Un Moodle par défaut sans groupes séparés, ou un enseignant qui possède déjà moodle/site:accessallgroups, n'est pas ce reliquat. Les enseignants éditeurs avec cette capacité voient déjà tous les groupes.
Autres reliquats du même pin : Blackboard img file read, enrol_database SQLi, hidden grade items.
J'ai épinglé moodle/moodle v5.2.3 après MSA-26-0042/0043. MSA-26-0016 a fermé les vérifications de groupe sur d'autres services web de notes. get_feedback.php ne faisait pas partie de cet ensemble. L'interface du carnet de notes a été durcie. Ce service AJAX ne l'a pas été.
Fausses pistes déjà consignées : traiter l'échec du frère get_gradable_users comme toute l'histoire (celui-ci lève déjà cannotaccessgroup) ; qualifier ceci d'écriture de note parce que la charge utile nomme itemid (le service est une lecture) ; étudiant-comme-attaquant (nopermissions). Un reverse shell. Du théâtre.
Moodle v5.2.3 en direct sur php:8.3-cli + MariaDB 11.4. Le seed construit un cours en groupes séparés, enseignant dans le groupe A uniquement, étudiant B dans le groupe B uniquement, CAP_PREVENT sur moodle/site:accessallgroups, et un élément de note manuel dont le feedback est le témoin. how=live.
Compose monte en bind ../../vendors/moodle/src comme /opt/moodle-pin (le chemin est relatif à lab/docker-compose.yml). Clonez moodle/moodle tag v5.2.3 vers ce chemin, ou pointez le volume vers votre checkout. L'arborescence Moodle n'est pas dans ce pack.
python3 moodle-grades-feedback-idor-Abraxas-Labs.py
ou
cd lab
./run.sh
Ciblez uniquement http://127.0.0.1:19580. Projet Compose moodle-grades-feedback-idor. La stack est démontée après l'exécution.
SUCCESS moodle-grades-feedback-idor how=live pin=v5.2.3 teacher-role=teacher accessallgroups=no groupmode=1 feedback-has-witness=yes [email protected] sibling-group-b=cannotaccessgroup student-call=nopermissions MOODLE-GRADES-FEEDBACK-IDOR-WITNESS
Après validate_context / require_capability, charger le cours et l'utilisateur cible, puis refuser sauf si groups_user_groups_visible($course, $userid) et que la cible est inscrite. Même forme que gradereport_user et core_grades_get_gradable_users après MDL-88667.
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0. Voir LICENSE. Lab en boucle locale uniquement. Aucune garantie.