【漏洞预警】开源在线学习系统 Moodle 远程代码执行漏洞

近日白帽汇安全研究院关注到开源在线学习系统Moodle存在远程代码执行漏洞。此次远程代码执行漏洞出现在Moodle的Quiz组件中,通过教师角色可以成功执行利用该漏洞。

Moodle版本小于3.5.0将受此漏洞影响。

Moodle是一款被广泛使用的开源在线学习系统,有超过1.27亿的教师和学生在使用它。目前根据华顺信安FOFA系统显示,目前全网共有68967个系统对外开放,该系统主要应用于教育学习方向的平台,相关方面企业单位需高度重视。

image.png

  Moodle全球分布情况(仅为分布情况,非漏洞影响情况)

image.png

  Moodle国内分布情况(仅为分布情况,非漏洞影响情况)

【漏洞原理与危害】

攻击者须在Moodle低于3.5.0的系统中使用教师的角色并且使用系统默认配置进行执行,或通过其他漏洞(比如XSS)提权到教师角色权限也可以。攻击者可以通过使用Moodle中特定的数学公式绕过防止恶意命令执行的内部安全机制,在运行Moodle服务器的底层操作系统上执行任意命令。

Moodle允许教师设置一个包含多种问题类型的评估公式,其中一个允许教师输入一个用来计算由Moodle定义的随机变量,以防止学生作弊或者传送答案,如教师可以输入{x}加{y}等于几,答案的公式可以写成{x}+{y} ,然后Moodle会生成两个随机变量插入到问答的文本占位符{x}和{y}处。最后通过调用php中安全比较敏感的eval()函数来评估答案,众所周知该函数的可以执行任意php代码。 

image.png

为了强制只执行无害的php代码,Moodle的开发者已经引入了一个校验函数qtype_calculated_find_formula_errors(),该函数在危险函数eval()调用之前调用,目的是为了检测教师提供的公式中是否包含非法恶意代码。

image.png

正如在上面的源代码中看到的样子,最后一次在1939行调用preg_match()是非常严格的,将禁止除-+/*%>:^\~<?=&|!.0-9eE以外的字符在公式中,然而,之前的str_replace()函数嵌套在1927行一个用来替换表达式中所有类似{x}的占位符的循环中,对应的正则表达式中表示占位符的名称在字符集上几乎没有限制,比如{system(ls)}将认为是一个有效的占位符,并将在1928行的循环中进行替换处理。事实上这样就存在了一个安全问题,因为它将在preg_metch() 函数调用返回false之前隐藏所有潜在的恶意字符,使用这种隐藏恶意代码结合占位符嵌套的方式就会出现可以利用的漏洞。

【漏洞影响】

受影响版本:3.4 to 3.4.2,3.3 to 3.3.5, 3.2 to 3.2.8, 3.1 to 3.1.11 及更早版本。

此漏洞将允许攻击者在运行Moodle服务器的操作系统上执行任意命令。

【漏洞CVE】

CVE编号:CVE-2018-1133

【修复建议】

1. 打上漏洞修复相关补丁

2. 升级平台至3.5.0版本以上

白帽汇会持续对该漏洞进行跟进,后续可以关注链接

【参考】

[1] https://blog.ripstech.com/2018/moodle-remote-code-execution/

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。查看原文

为您推荐