
Moodle 5.2.3 — высокий — удалённый — путь — Blackboard img src копирует файлы за пределами дерева импорта
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-blackboard-img
Moodle LMS 5.2.3 - Moodle
Класс: чтение файлов Доступ: удалённый
qformat_blackboard_six_base::text_field присоединяет img src к $this->filebase без PARAM_PATH. Затем store_file_for_text_field копирует этот путь в черновую файловую область пользователя. Метод get_filecontent из того же семейства уже ограничивает путь через clean_param($path, PARAM_PATH). MSA-26-0012 ограничил импорт активности базы данных с помощью PARAM_FILE. Blackboard img src в этот набор не входил.
Учитель, который может импортировать zip-файл Blackboard, подкладывает <img src="https://raw.githubusercontent.com/html/config.php">. Черновое «изображение» — это config.php. Студенты импортировать не могут.
| ID | CVE пока нет |
| CWE | CWE-22 / CWE-73 |
| CVSS | Средний: 6.5 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Продукт | Moodle |
| Затронуто | 5.2.3 тег v5.2.3 (344232c15336c71b80f9aca8359ce0e0a9f3d116) |
| Аутентификация | учитель (банк вопросов / импорт Blackboard в урок) |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1 |
Вектор: учитель, который может импортировать zip-файл Blackboard в банк вопросов (или урок). Типичный приз — config.php (пароль от БД) от имени пользователя PHP. Это не RCE, если только не связать со вторым оставшимся багом. Это не LPE.
| Привилегия | Метод / точка сброса | Разведка / целостность / доступность | Доказано в лаборатории или выведено |
|---|---|---|---|
Чтение файла, который может открыть пользователь PHP, через ../ в img src | text_field присоединяет $this->filebase . '/' . $path; store_file_for_text_field копирует в черновую область | Разведка (байты файла) | Доказано в лаборатории. Байты черновика совпадают с /var/www/html/config.php и содержат MOODLE-BLACKBOARD-IMG-WITNESS |
| Скачивание этого черновика как «изображения» | itemid черновика + переписанное имя файла @@PLUGINFILE@@ | Разведка | Доказано в лаборатории. GET /draft вернул 298 байт, sha256 совпадает с config.php |
| Любой, кто позже сможет открыть импортированный вопрос | Тот же черновик / pluginfile | Разведка | Выведено. Лаборатория остановилась на совпадении черновика учителя |
| Импорт студентом | тот же zip, role=student | н/д | Доказано в лаборатории закрыто. HTTP 403 teacher-only |
Тот же путь через clean_param($path, PARAM_PATH) | гаджет jail=1 | н/д | Доказано в лаборатории закрыто. Нет совпадения, нет свидетеля, путь остаётся внутри filebase |
| PHP RCE / OS LPE | н/д | н/д | Закрыто. Этот оставшийся баг копирует байты файла в черновик. Он их не исполняет |
Moodle по умолчанию без импорта Blackboard — это не данный баг. MSA-22-0016 очистил только baseurl.
Другие оставшиеся баги того же пина: enrol_database SQLi, grades feedback IDOR, hidden grade items.
Я зафиксировал moodle/moodle v5.2.3 после MSA-26-0042/0043. MSA-26-0012 ограничил импорт активности базы данных. Затем я занялся Blackboard, потому что get_filecontent() уже знал о PARAM_PATH, а text_field() всё ещё выполнял необработанное присоединение.
Уже зафиксированные ошибочные пути: считать импорт студентом утечкой (это 403); называть это RCE, потому что скопированный файл — PHP (черновик хранит байты, он их не include); предполагать, что MSA-22-0016 завершил работу (только baseurl). Обратная оболочка. Театр.
Точный гаджет пина text_field / store_file_for_text_field, а не полноценное PHP-приложение Moodle. how=gadget.
python3 moodle-blackboard-img-Abraxas-Labs.py
или
cd lab
./run.sh
Цель только http://127.0.0.1:19560. Проект Compose moodle-blackboard-img. Стек разбирается после запуска.
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) для img src, затем realpath должен оставаться внутри realpath($this->filebase). Та же форма, что и у get_filecontent().
formatbase.php (text_field, store_file_for_text_field)format.php (get_filecontent уже использует PARAM_PATH)GNU Affero GPL v3.0. См. LICENSE. Только лаборатория на loopback. Без гарантий.