
Moodle 5.2.3 - Alta - Remota - Ruta - Blackboard img src copia archivos fuera del árbol de importación
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-blackboard-img
Moodle LMS 5.2.3 - Moodle
Clase: Lectura de archivos Alcance: Remoto
qformat_blackboard_six_base::text_field une img src a $this->filebase sin PARAM_PATH. store_file_for_text_field luego copia esa ruta al área de archivos borrador del usuario. La función de la misma familia get_filecontent ya se protege con clean_param($path, PARAM_PATH). MSA-26-0012 protegió la importación de actividad de base de datos con PARAM_FILE. El img src de Blackboard no estaba en ese conjunto.
Un profesor que puede importar un zip de Blackboard inserta <img src="https://raw.githubusercontent.com/html/config.php">. La "imagen" del borrador es config.php. Los estudiantes no pueden importar.
| ID | sin CVE aún |
| CWE | CWE-22 / CWE-73 |
| CVSS | Medio: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Producto | Moodle |
| Afectado | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Autenticación | profesor (banco de preguntas / importación Blackboard de lección) |
| Licencia | GNU Affero GPL v3.0 |
| Laboratorio | solo 127.0.0.1 |
Escritor: un profesor que puede importar un zip de Blackboard en el banco de preguntas (o lección). El premio típico es config.php (contraseña de la base de datos) como el usuario de PHP. No es RCE a menos que encadene un segundo residuo. No es LPE.
| Privilegio | Método / sink | Reconocimiento / integridad / disponibilidad | Probado en laboratorio o inferido |
|---|---|---|---|
Leer un archivo que el usuario de PHP puede abrir, mediante ../ en img src | text_field une $this->filebase . '/' . $path; store_file_for_text_field copia al área de borrador | Reconocimiento (bytes del archivo) | Probado en laboratorio. Los bytes del borrador coinciden con /var/www/html/config.php y contienen MOODLE-BLACKBOARD-IMG-WITNESS |
| Descargar ese borrador como la "imagen" | itemid del borrador + nombre de archivo @@PLUGINFILE@@ reescrito | Reconocimiento | Probado en laboratorio. GET /draft devolvió 298 bytes, sha256 igual a config.php |
| Cualquiera que luego pueda abrir la pregunta importada | Mismo borrador / pluginfile | Reconocimiento | Inferido. El laboratorio se detuvo en la coincidencia del borrador del profesor |
| Importación de estudiante | mismo zip, role=student | n/a | Probado en laboratorio cerrado. HTTP 403 teacher-only |
Misma ruta a través de clean_param($path, PARAM_PATH) | gadget jail=1 | n/a | Probado en laboratorio cerrado. Sin coincidencia, sin testigo, la ruta permanece bajo filebase |
| RCE de PHP / LPE del SO | n/a | n/a | Cerrado. Este residuo copia bytes de archivo a un borrador. No los ejecuta |
Moodle por defecto sin importación de Blackboard no tiene este fallo. MSA-22-0016 solo limpió baseurl.
Mismos residuos del pin: enrol_database SQLi, grades feedback IDOR, hidden grade items.
Fijé moodle/moodle v5.2.3 después de MSA-26-0042/0043. MSA-26-0012 protegió la importación de actividad de base de datos. Pasé a Blackboard después porque get_filecontent() ya conocía PARAM_PATH y text_field() todavía hacía una unión directa.
Caminos equivocados ya registrados: tratar la importación de estudiante como la fuga (es 403); llamar a esto RCE porque el archivo copiado es PHP (el borrador almacena bytes, no los include); asumir que MSA-22-0016 había terminado el trabajo (solo baseurl). Una reverse shell. Teatro.
Gadget fiel del pin text_field / store_file_for_text_field, no una aplicación PHP completa de Moodle. how=gadget.
python3 moodle-blackboard-img-Abraxas-Labs.py
o
cd lab
./run.sh
Objetivo solo http://127.0.0.1:19560. Proyecto de Compose moodle-blackboard-img. El stack se desmonta tras la ejecución.
SUCCESS moodle-blackboard-img how=gadget pin=v5.2.3 teacher-import=yes draft-match-config=yes student=403 param-path-jail=yes MOODLE-BLACKBOARD-IMG-WITNESS
clean_param($path, PARAM_PATH) sobre img src, luego realpath debe permanecer bajo realpath($this->filebase). Misma forma que get_filecontent().
formatbase.php (text_field, store_file_for_text_field)format.php (get_filecontent ya usa PARAM_PATH)GNU Affero GPL v3.0. Ver LICENSE. Solo laboratorio en loopback. Sin garantía.