Moodle 5.2.3 - Alto - Remoto - IDOR - core_grades_get_gradeitems elenca elementi di valutazione nascosti
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-grades-gradeitems
Moodle LMS 5.2.3 - Moodle
Classe: IDOR Raggiungibilità: Remota
core_grades_get_gradeitems è ajax più il servizio mobile ufficiale, senza chiave capabilities in services.php. validate_context è l'unico controllo. Poi grade_item::fetch_all estrae ogni elemento del corso. L'array_filter scarta GRADE_TYPE_NONE, gli elementi di categoria e l'elemento del corso. Nascosto non è in quel filtro. Il gemello core_grades_get_grade_tree richiede già moodle/grade:viewall.
Uno studente iscritto invia in POST {courseid} e ottiene i nomi degli elementi di voto nascosti che l'interfaccia del registro voti dello studente continua a nascondere.
| ID | nessuna CVE al momento |
| CWE | CWE-862 / CWE-200 |
| CVSS | Medio: 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 | studente iscritto (moodle/grade:view; privo di viewall / viewhidden) |
| Licenza | GNU Affero GPL v3.0 |
| Lab | solo 127.0.0.1 |
Attore: uno studente iscritto al corso. Invia in POST il servizio AJAX con {courseid}. La risposta contiene nomi, ID e categorie. Lo schema di ritorno non ha punteggi. Non è RCE. Non è LPE. Non è una scrittura di punteggi.
| Privilegio | Metodo / sink | Ricognizione / integrità / disponibilità | Provato in lab o dedotto |
|---|---|---|---|
| Leggere nome, id e categoria di un elemento di voto nascosto | POST /lib/ajax/service.php?sesskey= core_grades_get_gradeitems {courseid} | Ricognizione | Provato in lab. HTTP 200, i nomi includono MOODLE-GRADES-GRADEITEMS-WITNESS |
| Leggere nome, id e categoria di un elemento di voto visibile | Stessa risposta | Ricognizione (prevista per i docenti) | Provato in lab. i nomi includono Visible Lab Assignment |
| Stesso catalogo tramite il servizio mobile ufficiale | Stessa classe, services include MOODLE_OFFICIAL_MOBILE_SERVICE | Ricognizione | Dedotto da services.php. Il lab ha usato AJAX. |
Scorrere valori courseid sequenziali per corsi a cui lo studente può accedere | Stesso metodo, id indovinati | Ricognizione | Dedotto. Il lab ha usato l'id del corso seed 2 |
| Vedere l'elemento nascosto nell'interfaccia del registro voti dello studente | GET /grade/report/user/index.php?id= | n/a | Provato in lab chiuso. hidden-in-ui=False, visible-in-ui=True |
| Chiamare senza una sessione | AJAX con una sesskey fittizia | n/a | Provato in lab chiuso. servicerequireslogin |
| Chiamare come utente autenticato non iscritto | AJAX esterno, stesso courseid | n/a | Provato in lab chiuso. requireloginerror |
| Leggere i punteggi di altri studenti o scrivere voti | n/a | n/a | Chiuso. Le chiavi di ritorno sono id, itemname, category |
| PHP RCE / OS LPE | n/a | n/a | Chiuso. Questo residuo è una lettura di catalogo |
Un docente o manager che ha già moodle/grade:viewall vede già il catalogo. I chiamanti guest / non autenticati necessitano comunque di un contesto di corso.
Altri residui dello stesso pin: Blackboard img file read, enrol_database SQLi, grades feedback IDOR.
Ho fissato moodle/moodle v5.2.3 dopo MSA-26-0042/0043. I web service dei voti erano in quella finestra MSA. get_gradeitems.php non ha ancora require_capability. L'interfaccia dello studente nascondeva già l'elemento. Il catalogo AJAX no.
Vicoli ciechi già registrati: trattare l'AJAX non autenticato 200 come la fuga (il body è servicerequireslogin); chiamare questo un IDOR sui punteggi perché il nome del metodo contiene grade (lo schema è solo nomi); aspettarsi che get_grade_tree fosse lo stesso residuo (richiede già viewall). Una reverse shell. Teatro.
Moodle v5.2.3 live su php:8.3-apache + MariaDB 11.4. Il seed iscrive labstudent, lascia laboutsider fuori dal corso e crea un elemento manuale visibile più un elemento nascosto il cui nome è il witness. run.sh copia un pin locale o git clone --depth 1 --branch v5.2.3. L'albero di Moodle non è in questo pacchetto.
python3 moodle-grades-gradeitems-Abraxas-Labs.py
oppure
cd lab
./run.sh
Target solo http://127.0.0.1:19590. Progetto compose moodle-grades-gradeitems. Lo stack viene smontato dopo l'esecuzione.
SUCCESS moodle-grades-gradeitems student-ajax=200 hidden-in-ajax=yes hidden-in-ui=no visible-in-ajax=yes visible-in-ui=yes outsider-error=yes unauth-error=yes MOODLE-GRADES-GRADEITEMS-WITNESS
Dopo validate_context, richiedere la stessa capability di get_grade_tree: require_capability('moodle/grade:viewall', $context). Inoltre scartare gli elementi nascosti a meno che il chiamante abbia moodle/grade:viewhidden. Aggiungere un caso Behat/PHPUnit: studente iscritto, elemento manuale nascosto, core_grades_get_gradeitems deve omettere quell'elemento (o 403). L'interfaccia del registro voti dello studente lo nasconde già.
get_gradeitems.phpget_grade_tree.phpservices.php (core_grades_get_gradeitems, nessuna capabilities)GNU Affero GPL v3.0. Vedi LICENSE. Solo lab su loopback. Nessuna garanzia.