Moodle 5.2.3 - Hoch - Remote - IDOR - core_grades_get_feedback umgeht separate-groups-Prüfungen
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-feedback-idor
Write-up: https://abraxaslabs.tech/research/moodle-grades-feedback-idor
Moodle LMS 5.2.3 - Moodle
Klasse: IDOR Reichweite: Remote
core_grades_get_feedback ruft weiterhin nur require_capability('gradereport/grader:view') auf. Andere Grade-Webservices erhielten groups_user_groups_visible / groups_group_visible nach MSA-26-0016 / MDL-88667. Dieser AJAX-Service nicht. Das JSON kommt mit feedbacktext, fullname, picture und dem ersten Identitätsfeld zurück.
Ein nicht-bearbeitender Lehrer in getrennten Gruppen, ohne accessallgroups, sendet per POST die userid eines anderen Studenten und liest das Feedback dieser Gruppe.
| ID | noch keine CVE |
| CWE | CWE-863 / CWE-200 |
| CVSS | Mittel: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| Produkt | Moodle |
| Betroffen | 5.2.3 Tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Auth | nicht-bearbeitender Lehrer mit gradereport/grader:view, ohne moodle/site:accessallgroups. Kurs in getrennten Gruppen. |
| Lizenz | GNU Affero GPL v3.0 |
| Lab | nur 127.0.0.1 |
Autor: ein nicht-bearbeitender Lehrer, der in einem Kurs mit getrennten Gruppen eingeschrieben ist, nur in Gruppe A, mit Grader-Ansicht und ohne access-all-groups. Er wählt die userid eines anderen eingeschriebenen Studenten (fortlaufende Ganzzahlen) und ruft den AJAX-Service auf. Kein RCE. Kein LPE. Kein Schreiben von Noten.
| Berechtigung | Methode / Sink | Recon / Integrität / Verfügbarkeit | Im Lab nachgewiesen oder abgeleitet |
|---|---|---|---|
| Feedback zu Noten einer anderen Gruppe lesen | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | Recon | Im Lab nachgewiesen. HTTP 200, error=false, feedbacktext enthält MOODLE-GRADES-FEEDBACK-IDOR-WITNESS |
| Das Identitätsfeld und den Anzeigenamen dieses Studenten lesen | Gleiche Antwort additionalfield / fullname / picture | Recon | Im Lab nachgewiesen. [email protected], fullname=Student Bravo |
Fortlaufende userid-Werte im selben Kurs durchgehen | Gleiche Methode, geratene IDs | Recon | Abgeleitet. Im Lab wurde die vorbelegte ID von Gruppe B verwendet |
| Gruppe B über den verwandten Selektor auflisten | core_grades_get_gradable_users {courseid, groupid=B} | n/a | Im Lab nachgewiesen geschlossen. cannotaccessgroup |
| Student ruft denselben Feedback-Service auf | Studentenrolle, gleiche Argumente | n/a | Im Lab nachgewiesen geschlossen. nopermissions |
| Feedback derselben Gruppe (Student aus Gruppe A) | Lehrer-Aufruf für Student Alpha | Recon (beabsichtigt) | Im Lab nachgewiesen erlaubt. HTTP 200, error=false |
| PHP RCE / OS LPE / Schreiben von Noten | n/a | n/a | Geschlossen. Dieser Überrest ist ein Lesen von Feedback- und Profilfeldern |
Standard-Moodle ohne getrennte Gruppen oder ein Lehrer, der bereits moodle/site:accessallgroups hat, ist nicht dieser Überrest. Bearbeitende Lehrer mit dieser Capability sehen bereits jede Gruppe.
Weitere Überreste desselben Pins: Blackboard img file read, enrol_database SQLi, hidden grade items.
Ich habe moodle/moodle v5.2.3 nach MSA-26-0042/0043 gepinnt. MSA-26-0016 hat Gruppenprüfungen bei anderen Grade-Webservices geschlossen. get_feedback.php war nicht in diesem Set. Die Grader-UI wurde gehärtet. Dieser AJAX-Service nicht.
Bereits dokumentierte Fehlversuche: den verwandten Fehltritt bei get_gradable_users als die ganze Geschichte zu behandeln (dieser wirft bereits cannotaccessgroup); dies als Score-Schreibvorgang zu bezeichnen, weil die Payload itemid nennt (der Service ist ein Lesezugriff); Student als Angreifer (nopermissions). Eine Reverse Shell. Theater.
Live Moodle v5.2.3 auf php:8.3-cli + MariaDB 11.4. Das Seed erstellt einen Kurs mit getrennten Gruppen, Lehrer nur in Gruppe A, Student B nur in Gruppe B, CAP_PREVENT auf moodle/site:accessallgroups und ein manuelles Bewertungselement, dessen Feedback der Zeuge ist. how=live.
Compose bind-mountet ../../vendors/moodle/src als /opt/moodle-pin (Pfad ist relativ zu lab/docker-compose.yml). Klone moodle/moodle Tag v5.2.3 an diesen Pfad oder richte das Volume auf deinen Checkout. Der Moodle-Baum ist nicht in diesem Paket enthalten.
python3 moodle-grades-feedback-idor-Abraxas-Labs.py
oder
cd lab
./run.sh
Ziele ausschließlich http://127.0.0.1:19580. Compose-Projekt moodle-grades-feedback-idor. Der Stack wird nach dem Lauf abgebaut.
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
Nach validate_context / require_capability den Kurs und den Zielbenutzer laden und dann ablehnen, es sei denn groups_user_groups_visible($course, $userid) gilt und das Ziel ist eingeschrieben. Gleiche Form wie gradereport_user und core_grades_get_gradable_users nach MDL-88667.
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0. Siehe LICENSE. Nur Loopback-Lab. Keine Gewährleistung.