Joomla CVE-2020-35616漏洞浅析

 

作为一名安全顾问,你经常会遇到一些特殊的漏洞,同时又很重要,需要尽快修复。 最近,我在寻找新的Joomla exploit和Joomla Security的攻击时就发生了此类事情。

我遇到了Joomla中的一个漏洞,该漏洞赋予非超级用户特权,从而使恶意行为者有可能利用Joomla。

我将讨论已发现的漏洞CVE-2020-35616,并建议如何更新解决此漏洞。

但是在继续之前,我们先来谈谈Joomla及其含义。

 

何为Joomla

Joomla是继WordPress和Shopify之后第三大最受欢迎的免费开源内容管理系统(CMS)。 它用于构建网站和发布网站内容。 其用户友好的特性使其在大众中非常受欢迎。 Joomla使用面向对象的编程技术以及软件设计模式,并用PHP编写。 它将数据存储在MySQL数据库中。

Joomla维护一个ACL(访问控制列表)来控制:

  • 哪些用户可以访问网站的可选功能
  • 用户可以执行的操作

 

最新的Joomla安全公告

最近,Joomla发布安全公告,该公告披露了一个漏洞,该漏洞导致从1.7.0到3.9.22的Joomla版本中的ACL违规。 尽管已发布了安全补丁,在最新版本3.9.23下修复了该漏洞。 由于Joomla是开源的CMS,因此我们可以使用Github的版本比较功能来发现易受攻击的代码和已修补版本间的差异。

 

代码差异——了解补丁并找到Joomla漏洞的根本原因

  • 漏洞版本:3.9.22
  • 已修补版本:3.9.23

使用Github的比较标记功能,我们可以找到两个版本Joomla代码之间的差异。 如果检查此链接,您会发现Joomla CMS的最新版本具有213个修改文件。 仔细检查修改后的文件中的代码,可知Joomla开发人员在Joomla CMS的核心部分引入了一个新功能,即validate

2

validate功能检查以下内容:

第371行,它检查登录用户是否是超级用户。 代码JFactory :: getUser()-> authorise('core.admin',$ data ['extension'])返回一个布尔值,即true或false,这导致以下两种情况:

  • true的情况:如果登录用户是超级用户,则此代码返回true,然后代码跳至第379行,该行进一步验证提供的表单数据并返回经过过滤的数据数组(如果有效),否则返回false。
  • false的情况:如果登录的用户不是超级用户,则此代码返回false,代码跳至第373行,该行检查用户在提交表单时是否提供了任何ACL规则集。 如果提供了ACL规则集,那么它将删除该ACL规则集并执行父级的validate函数以从表单中过滤有效数据。

那么问题来了,需要什么来“unset” ACL规则集?

你可以在cagetory.php上阅读完整代码。

在阅读此代码时,我注意到505行的功能负责保存category表单。 可以注意到,在第567行,该代码检查用户是否提供了任何ACL规则集。 如果提供了ACL规则集,则它将设置新的ACL规则集。

3

 

如何利用Joomla漏洞?

现在,我们知道save函数会设置提交表单中提供的任意ACL规则集。 由于易受攻击的代码版本没有使用上面讨论的validate函数来验证表单数据,这意味着即使是非超级用户也可以使用任意ACL规则集提交表单,并且Joomla将处理ACL规则集。

对于简单的攻击情形,让我们创建三个具有不同权限的用户,例如super-user, manager and administrator。

4

由于此漏洞会影响多个核心view,因此我们此次攻击将仅针对category。

1.SuperUser创建一个新的类别TEST,并将所有权限授予Manager。 但是,Administrator的所有权限都设置为Denied

5

6

2.现在,当Administrator 登录到他/她的帐户时,我们注意到他/她由于缺乏有效的权限而无法执行TEST的任何功能。

7

3.一旦Manager登录到他/她的帐户并编辑类别TEST后。 Manager无权为任何用户设置任何权限。 但是,在提交表单时,Manager会恶意设置新的ACL规则集,该规则集将所有权限授予Administrator。

在Joomla中,每个用户组都有一个唯一的ID。

GROUP             ID
Author              1
Registered        2
Author            3
Editor            4
Publisher         5
Manager           6
Administrator     7
Super Users       8
Guest             9

POST请求表单的ACL规则集的格式为:jform[rules][core.PERMISSION][GROUP_ID]

jform[rules][core.create][ID]
jform[rules][core.delete][ID]
jform[rules][core.edit][ID]
jform[rules][core.edit.state][ID]
jform[rules][core.edit.own][ID]

现在,如果将这些POST请求参数设置为值1,则基本上将这些特定权限设置为Allowed

如上所述,我们希望向组ID为7的Administrator授予所有权限。因此,在保存表单时,我们需要附加以下POST数据。

&jform%5Brules%5D%5Bcore.create%5D%5B7%5D=1&jform%5Brules%5D%5Bcore.delete%5D%5B7%5D=1&jform%5Brules%5D%5Bcore.edit%5D%5B7%5D=1&jform%5Brules%5D%5Bcore.edit.state%5D%5B7%5D=1&jform%5Brules%5D%5Bcore.edit.own%5D%5B7%5D=1

8

4.现在,administrator拥有TEST类别的所有权限,他/她甚至可以编辑类别详细信息。

9

10

要了解有关Joomla漏洞详细信息以及重现此漏洞的更多详细步骤,可观看以下poc视频。

https://blog.securelayer7.net/wp-content/uploads/2020/12/Joomla-Security-Report-PoC.mp4

 

写在最后

Joomla是一个受欢迎的平台,它允许用户轻松地进行内容管理,但是如上所述,它存在漏洞,可能会带来麻烦。 我们建议将Joomla CMS更新到最新版本(v3.9.23),其修补了上述漏洞。

(完)