作为一名安全顾问,你经常会遇到一些特殊的漏洞,同时又很重要,需要尽快修复。 最近,我在寻找新的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
。
该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规则集。
如何利用Joomla漏洞?
现在,我们知道save
函数会设置提交表单中提供的任意ACL规则集。 由于易受攻击的代码版本没有使用上面讨论的validate函数来验证表单数据,这意味着即使是非超级用户也可以使用任意ACL规则集提交表单,并且Joomla将处理ACL规则集。
对于简单的攻击情形,让我们创建三个具有不同权限的用户,例如super-user, manager and administrator。
由于此漏洞会影响多个核心view,因此我们此次攻击将仅针对category。
1.SuperUser创建一个新的类别TEST
,并将所有权限授予Manager。 但是,Administrator的所有权限都设置为Denied
2.现在,当Administrator 登录到他/她的帐户时,我们注意到他/她由于缺乏有效的权限而无法执行TEST
的任何功能。
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
4.现在,administrator拥有TEST
类别的所有权限,他/她甚至可以编辑类别详细信息。
要了解有关Joomla漏洞详细信息以及重现此漏洞的更多详细步骤,可观看以下poc视频。
https://blog.securelayer7.net/wp-content/uploads/2020/12/Joomla-Security-Report-PoC.mp4
写在最后
Joomla是一个受欢迎的平台,它允许用户轻松地进行内容管理,但是如上所述,它存在漏洞,可能会带来麻烦。 我们建议将Joomla CMS更新到最新版本(v3.9.23),其修补了上述漏洞。