
Moodle 5.2.3 - Alto - Remoto - Caminho - Blackboard img src copia arquivos fora da árvore de importação
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-blackboard-img
Moodle LMS 5.2.3 - Moodle
Classe: Leitura de arquivo Alcance: Remoto
qformat_blackboard_six_base::text_field concatena img src em $this->filebase sem PARAM_PATH. store_file_for_text_field então copia esse caminho para a área de arquivos de rascunho do usuário. get_filecontent da mesma família já restringe com clean_param($path, PARAM_PATH). MSA-26-0012 restringiu a importação de atividade de banco de dados com PARAM_FILE. O img src do Blackboard não estava nesse conjunto.
Um professor que pode importar um zip do Blackboard insere <img src="https://raw.githubusercontent.com/html/config.php">. A "imagem" do rascunho é config.php. Alunos não podem importar.
| ID | sem CVE ainda |
| CWE | CWE-22 / CWE-73 |
| CVSS | Médio: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Produto | Moodle |
| Afetado | 5.2.3 tag v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Autenticação | professor (banco de questões / importação Blackboard de lição) |
| Licença | GNU Affero GPL v3.0 |
| Lab | apenas 127.0.0.1 |
Escritor: um professor que pode importar um zip do Blackboard no banco de questões (ou lição). O prêmio típico é config.php (senha do BD) como o usuário do PHP. Não é RCE a menos que encadeiem um segundo resquício. Não é LPE.
| Privilégio | Método / sink | Recon / integridade / disponibilidade | Comprovado em lab ou inferido |
|---|---|---|---|
Ler um arquivo que o usuário do PHP pode abrir, via ../ em img src | text_field concatena $this->filebase . '/' . $path; store_file_for_text_field copia para a área de rascunho | Recon (bytes do arquivo) | Comprovado em lab. Os bytes do rascunho correspondem a /var/www/html/config.php e contêm MOODLE-BLACKBOARD-IMG-WITNESS |
| Baixar esse rascunho como a "imagem" | itemid do rascunho + nome de arquivo @@PLUGINFILE@@ reescrito | Recon | Comprovado em lab. GET /draft retornou 298 bytes, sha256 igual ao config.php |
| Qualquer um que possa depois abrir a questão importada | Mesmo rascunho / pluginfile | Recon | Inferido. O lab parou na correspondência do rascunho do professor |
| Importação por aluno | mesmo zip, role=student | n/a | Comprovado em lab fechado. HTTP 403 teacher-only |
Mesmo caminho através de clean_param($path, PARAM_PATH) | gadget jail=1 | n/a | Comprovado em lab fechado. Sem correspondência, sem witness, caminho permanece sob filebase |
| RCE em PHP / LPE no SO | n/a | n/a | Fechado. Este resquício copia bytes de arquivo para um rascunho. Não os executa |
Moodle padrão sem importação Blackboard não é este bug. MSA-22-0016 apenas limpou baseurl.
Mesmos resquícios do pin: enrol_database SQLi, grades feedback IDOR, hidden grade items.
Eu fixei moodle/moodle v5.2.3 após MSA-26-0042/0043. MSA-26-0012 restringiu a importação de atividade de banco de dados. Eu foquei no Blackboard em seguida porque get_filecontent() já conhecia PARAM_PATH e text_field() ainda fazia uma concatenação crua.
Caminhos errados já registrados: tratar a importação por aluno como o vazamento (é 403); chamar isso de RCE porque o arquivo copiado é PHP (o rascunho armazena bytes, não os include); assumir que MSA-22-0016 tinha concluído o trabalho (apenas baseurl). Um reverse shell. Teatro.
Gadget fiel do pin text_field / store_file_for_text_field, não um app Moodle PHP completo. how=gadget.
python3 moodle-blackboard-img-Abraxas-Labs.py
ou
cd lab
./run.sh
Alvo apenas http://127.0.0.1:19560. Projeto Compose moodle-blackboard-img. A stack é desmontada após a execução.
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) em img src, então realpath deve permanecer sob realpath($this->filebase). Mesma forma que get_filecontent().
formatbase.php (text_field, store_file_for_text_field)format.php (get_filecontent já usa PARAM_PATH)GNU Affero GPL v3.0. Veja LICENSE. Apenas lab em loopback. Sem garantia.