CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二

渗透技巧 2年前 (2022) admin
774 0 0

★且听安全-点关注,不迷路!



CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二

★漏洞空间站-优质漏洞资源和小伙伴聚集地!



Moodle(Modular Object-Oriented Dynamic Learning Environment)是一个用于制作网络课程或网站的软件包。


接前文:


CVE-2022-0332 Moodle REST Web接口审计与H5P插件SQL注入漏洞分析

QCyber,公众号:且听安全【最新漏洞预警】CVE-2022-0332 Moodle REST Web接口审计与H5P插件SQL注入漏洞分析


上面已经对Moodle REST Web接口处理机制进行了深入分析,之前还调试了 REST Web 接口的另一个 SQL 注入漏洞 CVE-2021-36397,放在草稿箱很久了,下面放出来分享给大家。

漏洞信息


官网通报如下:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


漏洞分析


补丁对比分析发现主要修改部分位于函数`course_get_recent_courses`:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


定位`course_get_recent_courses`函数(位于`courselib.php`):


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


函数传入4个参数,重点关注参数`$sort`,首先判断其是否为空,不为空将进入`else`分支,代码中只是通过`,`符号分割`$sort`,并未对其进行检查,最后进入SQL查询语句:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


存在SQL注入漏洞可能。分析函数`course_get_recent_courses`被调用情况:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


调用的地方不多,我们重点关注一下函数`get_recent_courses`:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


回顾前面文章中分析的API接口调用逻辑,可知`get_recent_courses`函数应该对应一个API函数接口,在数据库中查询接口与处理函数的映射关系:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


对应的`wsfunction`为`core_course_get_recent_courses`,所以可以很容易构造如下请求:


/moodle/webservice/rest/server.php?wstoken=***&wsfunction=core_course_get_recent_courses&sort=123'...


发送请求,成功进入`get_recent_courses`函数下的断点:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


最终完整SQL查询语句如下:


SELECT c.id,idnumber,summary,summaryformat,startdate,enddate,category,shortname,fullname,timeaccess,component,visible,showactivitydates,showcompletionconditions, ctx.id AS ctxid, ctx.path AS ctxpath, ctx.depth AS ctxdepth, ctx.contextlevel AS ctxlevel, ctx.instanceid AS ctxinstance, ctx.locked AS ctxlocked              FROM {course} c              JOIN {context} ctx                   ON ctx.contextlevel = :contextlevel                   AND ctx.instanceid = c.id              JOIN {user_lastaccess} ul                   ON ul.courseid = c.id             LEFT JOIN {favourite} fav                        ON fav.component = :favouritecomponent                       AND fav.itemtype = :favouriteitemtype                       AND fav.userid = 2                       AND fav.itemid = ul.courseid          LEFT JOIN {enrol} eg ON eg.courseid = c.id AND eg.status = :statusenrolg AND eg.enrol = :guestenrol             WHERE ul.userid = :userid               AND c.visible = :visible               AND (eg.id IS NOT NULL                    OR EXISTS (SELECT e.id                             FROM {enrol} e                             JOIN {user_enrolments} ue ON ue.enrolid = e.id                            WHERE e.courseid = c.id                              AND e.status = :statusenrol                              AND ue.status = :status                              AND ue.userid = :userid2                              AND ue.timestart < :now1                              AND (ue.timeend = 0 OR ue.timeend > :now2)                          ))            ORDER BY 123'


修复方式


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


新版本的`course_get_recent_courses`函数限定了参数`$sort`的取值范围:


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二



由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全及文章作者不为此承担任何责任。



★且听安全-点关注,不迷路!

CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二



★漏洞空间站-优质漏洞资源和小伙伴聚集地!

CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二


原文始发于微信公众号(且听安全):CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二

版权声明:admin 发表于 2022年7月2日 上午8:36。
转载请注明:CVE-2021-36397 Moodle REST Web服务接口SQL漏洞分析之二 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...