Moodle 5.2.3 - Alto - Remoto - IDOR - core_grades_get_feedback salta i controlli sui gruppi separati
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-feedback-idor
Moodle LMS 5.2.3 - Moodle
Classe: IDOR Raggiungibilità: Remota
core_grades_get_feedback chiama ancora soltanto require_capability('gradereport/grader:view'). Altri web service dei voti hanno ricevuto groups_user_groups_visible / groups_group_visible dopo MSA-26-0016 / MDL-88667. Questo servizio AJAX no. Il JSON ritorna con feedbacktext, fullname, picture e il primo campo identità.
Un docente non-editing in Gruppi separati, senza accessallgroups, invia in POST lo userid di un altro studente e legge il feedback di quel gruppo.
| ID | nessuna CVE al momento |
| CWE | CWE-863 / CWE-200 |
| CVSS | Medium: 4.3 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:L/I:N/A:N |
| Prodotto | Moodle |
| Affetto | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Auth | docente non-editing con gradereport/grader:view, senza moodle/site:accessallgroups. Corso in Gruppi separati. |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Attore: un docente non-editing iscritto a un corso con Gruppi separati, solo nel Gruppo A, con visualizzazione del registro valutatore e senza access-all-groups. Sceglie lo userid di un altro studente iscritto (interi sequenziali) e chiama il servizio AJAX. Non è RCE. Non è LPE. Non è una scrittura di punteggio.
| Privilegio | Metodo / sink | Recon / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
| Leggere il feedback dei voti di un altro gruppo | POST /lib/ajax/service.php?sesskey= core_grades_get_feedback {courseid, userid, itemid} | Recon | Provato in lab. HTTP 200, error=false, feedbacktext contiene MOODLE-GRADES-FEEDBACK-IDOR-WITNESS |
| Leggere il campo identità e il nome visualizzato di quello studente | Stessa risposta additionalfield / fullname / picture | Recon | Provato in lab. [email protected], fullname=Student Bravo |
Scorrere valori userid sequenziali nello stesso corso | Stesso metodo, id indovinati | Recon | Dedotto. Il lab ha usato l'id seminato del Gruppo B |
| Elencare il Gruppo B tramite il selettore gemello | core_grades_get_gradable_users {courseid, groupid=B} | n/a | Provato in lab chiuso. cannotaccessgroup |
| Uno studente chiama lo stesso servizio di feedback | ruolo studente, stessi argomenti | n/a | Provato in lab chiuso. nopermissions |
| Feedback dello stesso gruppo (studente del Gruppo A) | chiamata del docente per Student Alpha | Recon (previsto) | Provato in lab consentito. HTTP 200, error=false |
| PHP RCE / OS LPE / scrittura di voti | n/a | n/a | Chiuso. Questo residuo è una lettura di feedback e campi profilo |
Un Moodle predefinito senza Gruppi separati, o un docente che ha già moodle/site:accessallgroups, non è questo residuo. I docenti editing con quella capability vedono già ogni gruppo.
Residui dello stesso pin: Blackboard img file read, enrol_database SQLi, hidden grade items.
Ho fissato moodle/moodle v5.2.3 dopo MSA-26-0042/0043. MSA-26-0016 ha chiuso i controlli di gruppo su altri web service dei voti. get_feedback.php non era in quell'insieme. L'interfaccia del registro valutatore è stata irrobustita. Questo servizio AJAX no.
Vicoli ciechi già registrati: considerare la mancanza del gemello get_gradable_users come l'intera storia (quello lancia già cannotaccessgroup); definirlo una scrittura di punteggio perché il payload nomina itemid (il servizio è una lettura); studente-come-attaccante (nopermissions). Una reverse shell. Teatro.
Moodle v5.2.3 live su php:8.3-cli + MariaDB 11.4. Il seed costruisce un corso con Gruppi separati, docente solo nel Gruppo A, studente B solo nel Gruppo B, CAP_PREVENT su moodle/site:accessallgroups e una voce di voto manuale il cui feedback è il witness. how=live.
Compose monta in bind ../../vendors/moodle/src come /opt/moodle-pin (il percorso è relativo a lab/docker-compose.yml). Clona moodle/moodle tag v5.2.3 in quel percorso, oppure punta il volume al tuo checkout. L'albero di Moodle non è in questo pacchetto.
python3 moodle-grades-feedback-idor-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19580. Progetto Compose moodle-grades-feedback-idor. Lo stack viene smontato dopo l'esecuzione.
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
Dopo validate_context / require_capability, caricare il corso e l'utente target, poi rifiutare a meno che groups_user_groups_visible($course, $userid) e il target sia iscritto. Stessa forma di gradereport_user e core_grades_get_gradable_users dopo MDL-88667.
get_feedback.phpget_gradable_users.phpGNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.