abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · moodle-enrol-database-sqli
Moodle LMS 5.2.3 - Moodle
类别: SQLi 可达性: 远程
enrol_database::db_get_sql 仍然使用斜杠转义并拼接。MSA-26-0005 / MDL-88138 将 auth_db 参数化为 Execute($sql, [$value])。此插件没有照搬该形式。设置中的默认值:dbsybasequoting=0、localcoursefield=idnumber。汇聚点是外部选课数据库。Moodle 核心 $DB 不在此路径上。
在启用了 enrol_database 的站点上,具有编辑权限的教师设置课程 idnumber。Cron 将其插值。额外的行从选课数据库返回。
| ID | 暂无 CVE |
| CWE | CWE-89 |
| CVSS | 高危:8.1 CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:N |
| 产品 | Moodle |
| 受影响版本 | 5.2.3 标签 v5.2.3(344232c15336c71b80f9aca8359ce0e0a9f3d116)。插件 enrol_database 必须启用。 |
| 认证 | 具有编辑权限的教师(课程 idnumber,默认本地映射) |
| 许可证 | GNU Affero GPL v3.0 |
| 实验环境 | 仅 127.0.0.1 |
在启用了 enrol_database 的站点上,具有编辑权限的教师通过设置课程 idnumber,在外部选课数据库上注入 SQL。随后 Cron sync_enrolments 会执行该 SQL。
| 权限 | 方法 / 汇聚点 | 侦察 / 完整性 / 可用性 | 实验验证或推断 |
|---|---|---|---|
| 将 SQL 片段拼接进外部选课 SELECT | Cron sync_enrolments -> db_get_sql($table, array($coursefield=>$course->mapping), ...) -> $extdb->Execute($sql) | 查询字符串的完整性 | 实验验证。拼接后的 SQL 为 WHERE courseid = 'LABCOURSE\'' OR 1=1 -- ' |
| 读取该外部数据库上其他课程的选课行 | 字符串闭合后的同一 SELECT | 侦察 | 实验验证。正常:1 行 teacher-local。注入:2 行,包括 MOODLE-ENROL-DATABASE-SQLI-WITNESS |
| 插件关闭时跳过查询 | 同一 gadget,plugin=off | 不适用 | 实验验证已关闭。executed=false,SQL 为空,0 行 |
| 将同一载荷作为绑定参数 | MSA-26-0005 的 auth_db 遗留:Execute($sql, [$value]) | 不适用 | 实验验证已关闭。style=param 返回 0 行,SQL 包含 ? |
| 对额外行中指定的 Moodle 用户进行选课 / 退课 / 角色分配 | Cron 应用 requestedenrols 之后 | 选课记录的完整性 | 推断。实验止步于选课数据库上的额外行 |
| 以选课数据库用户身份执行 FILE / INTO OUTFILE | 若该账户具有 FILE 权限,则同一汇聚点 | 该数据库主机的完整性 / 可用性 | 推断。未演示。非操作系统本地提权 |
| 学生可控路径 | 仅当管理员映射 localuserfield=email(或类似字段)时 | 不适用 | 推断。默认路径为教师 idnumber |
此遗留问题中已关闭的路径:Moodle 核心 $DB;插件禁用(无查询);未认证访问;操作系统 shell;堆叠查询(此 mysqli gadget 为单语句)。未启用 enrol_database 的默认 Moodle 不存在此漏洞。
同一版本遗留问题:Blackboard 图片文件读取、成绩反馈 IDOR、隐藏成绩项。
在 MSA-26-0042/0043 之后,我锁定了 moodle/moodle v5.2.3。MSA-26-0005 通过占位符关闭了 auth_db。我打开了 enrol_database,因为它与同类外部数据库通信,并且仍然存在 db_addslashes。
dbsybasequoting 默认为 0,因此只有 ' 会被双写。idnumber 中的反斜杠加引号会闭合 MySQL 字符串。
已记录的弯路:将 Moodle 核心 $DB 视为汇聚点(并非如此);因为 FILE 作为 MySQL 权限存在就称其为操作系统本地提权(未演示,非此遗留问题);将学生邮箱作为默认映射(管理员必须更改 localuserfield)。反弹 shell。作秀。
忠实复现版本锁定构建者的 gadget,而非完整的 Moodle PHP 应用。php:8.3-cli 提供复制的 db_get_sql / db_addslashes / db_encode。mysql:8.0 保存两行选课记录。
python3 moodle-enrol-database-sqli-Abraxas-Labs.py
或
cd lab
./run.sh
仅针对 http://127.0.0.1:19570。Compose 项目 moodle-enrol-database-sqli。运行后栈会拆除。
SUCCESS moodle-enrol-database-sqli how=gadget plugin-off=no-query clean-rows=1 inject-rows=2 sql-concat=yes param-rows=0 extra=yes sink=enrol-db MOODLE-ENROL-DATABASE-SQLI-WITNESS
照搬 auth_db 的参数化查询(MDL-88138)。将映射的课程 / 用户值作为 Execute($sql, [$value]) 传入。不要将 db_addslashes 拼接到 '$value' 中。添加测试,确保课程 idnumber 中的引号不会返回其他课程的行。
lib.php(db_get_sql、db_addslashes、sync_enrolments)auth_dbGNU Affero GPL v3.0。参见 LICENSE。仅限回环实验环境。无担保。