WF曲速未来 消息:邪恶的老师——Moodle中的代码注入

WF曲速未来表示:在这篇文章中,说明了Moodle中的一个关键漏洞。Moodle通常集成到更大的系统中,将WebMailer,电子学习平台和其他技术加入到单一体系结构中,共享帐户凭据跨越一个巨大的攻击面,以供未经身份验证的攻击者进行网络钓鱼或提取教师帐户的凭据。

概要

WF曲速未来表示:在这篇文章中,说明了Moodle中的一个关键漏洞。Moodle通常集成到更大的系统中,将WebMailer,电子学习平台和其他技术加入到单一体系结构中,共享帐户凭据跨越一个巨大的攻击面,以供未经身份验证的攻击者进行网络钓鱼或提取教师帐户的凭据。在某些情况下,存在一个用于请求Moodle课程的自动服务,该服务将利用学生的权利进入他可以执行他选择的恶意软件的位置,并在他参加的大学课程中为自己评定长期A。

Moodle是一种广泛使用的开源电子学习软件,拥有超过1.27亿用户,允许教师和学生以数字方式管理课程活动和交换学习材料,这些材料通常由大型大学部署。但检测到的先前Moodle版本中的关键漏洞的技术内在性。它位于Moodle的Quiz组件中,可以通过教师角色成功利用,以执行远程代码执行。如果您正在运行Moodle

影响 - 谁可以利用什么?

必须在使用默认配置运行的最新Moodle(早于3.5.0)的过程中为攻击者分配教师角色。通过另一个漏洞(例如XSS)升级到此角色也是可能的。鉴于这些要求和漏洞的知识,攻击者将能够在运行Moodle的服务器的底层操作系统上执行任意命令。通过使用由Moodle评估的特制数学公式 - 攻击者绕过内部安全机制,阻止恶意命令的执行。

测验组件中的数学公式

Moodle允许教师设置包含多种类型问题的测验。其中包括计算出的问题,允许教师输入一个数学公式,由Moodle动态评估随机输入变量。这可以防止学生作弊并简单地分享他们的结果。例如,教师可以输入添加到的内容?答案公式为 + 。然后,Moodle将生成两个随机数,并在问答文本(例如3.9 + 2.1)中为占位符和插入它们。最后,它将通过调用安全敏感的PHP函数来评估答案6.0eval()公式输入因其恶意潜力而众所周知,因为它允许执行任意PHP代码。

为了强制使用无害的PHP代码,Moodle的开发人员引入了一个验证函数qtype_calculated_find_formula_errors(),该函数在危险调用之前被eval()调用,目的是检测教师提供的公式中的非法和恶意代码。

开发旁路

正如你在上面的源代码中所看到的,最后一次preg_match()调用,是在1939,非常严格,并且将禁止除-+/*%>:^\~

验证器拒绝第一个恶意公式qtype_calculated_find_formula_errors()。如果将它作为占位符并将其嵌入大括号中,如第二个有效负载所示,验证器将不会检测到我们的攻击,但Moodle将1.2在它到达之前用随机数替换我们的占位符eval()。但是,如果我们引入另一个占位符并将其嵌入到我们已有的占位符中,Moodle将只替换内部占位符,并且将在表eval()的第三行中看到一个危险的剩余占位符。此时,由于输入的原因,我们的有效负载将抛出PHP语法错误eval()是无效的PHP代码。因此,我们只需要纠正PHP语法,方法是使用PHP注释从PHP解析器中排除无效部分,从而得到第4行的最终有效公式,最终允许通过GET参数0执行代码。

适应不足的补丁

Moodle了解问题后,他们立即做出了一个快速解决问题的补丁。但是,再重新扫描应用程序后,仍然被检测到相同的漏洞,指向绕过刚刚引入的漏洞补丁。在更精确地检查相关的源代码结果之后,能够绕过补丁并实现与以前相同的影响。对于前三个提议的补丁,这是可能的,我们将在下一个小节中解释每个旁路。

第一个补丁:黑名单

Moodle开发人员提出的第一个补丁是基于拒绝包含漏洞有效负载中使用的PHP注释的公式的想法。正如你在代码中看到的那样,补丁前置了一个foreach循环,用于检查公式是否包含特定字符串。

这个补丁使我们当前的有效载荷不能作为验证功能qtype_calculated_find_formula_errors()检测其发起的PHP注释字符串//,/*,#在我们使用的电流攻击的有效载荷。此修补程序实现了黑名单方法,并基于以下假设:没有攻击者能够将上表中第3行的第3列的无效PHP语法更正为有效的PHP语法而不使用注释。但是,补丁程序不足并允许利用此有效负载的更复杂版本。

二个补丁:拒绝嵌套占位符

第二个补丁的想法是通过在检测占位符时删除“递归”来防止在我们的有效负载中使用的嵌套占位符。但同样,再重新扫描应用程序仍然报告了相同的漏洞,这使我们更精确地查看以下新代码行。

每当我们输入一个嵌套占位符时,}该方法qtype_calculated_find_formula_errors()现在只替换占位符,并且剩余的公式被检测为非法。但是,如果我们将公式改为}两个占位符,并由函数检测并返回find_dataset_names()。一个接一个地,每个占位符都在foreach循环中替换,从我们开始并离开我们的公式1。最后,在替换公式等于111并且验证器批准嵌套占位符,从而打破了此修补程序的意图。考虑到这个技巧,我们只需要适当调整我们的最后一个有效负载,以获得与以前相同的关键效果:

第三个补丁:黑名单和线性替换

第三个补丁结合了前两种方法,看起来非常适合防止嵌套占位符。但是,如果攻击者瞄准了Quiz组件的导入功能并重新导入了恶意破坏的XML问题文件,则攻击者能够控制(参见此处)的$dataset参数并使占位符替换无效。substitute_variables()

突出显示的行显示XML文件在1951行上定义占位符的名称。此占位符从不在1946行中的公式中使用。这将使我们的危险占位符的替换无效,并导致我们在之前的补丁中遇到的相同代码注入漏洞。

首先要感谢Moodle团队在修补问题时的快速响应。WF曲速未来建议更新到最新的Moodle版本。

注: 本文内容由区块链安全公司WF曲速未来(WarpFuture.com) 编译,转载请注明来自WF曲速区。WF是交易所与超级节点的安全技术提供商,为区块链交易所提供媲美某猫双十一级别的账户安全与交易安全对抗云引擎,现交易所每日安全攻防调用量达亿级。知识星球请搜索“曲速区”,微信关注公众号“曲速未来安全区”。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180821A1CMOI00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券