Joomla!3.7.0 Sql注入漏洞

漏洞描述

漏洞等级严重

利用级别简单/远程

漏洞类型8.6/10

漏洞类型sql 注入

影响版本:Joomla! 3.7.0 

漏洞风险

这个漏洞出现在3.7.0新引入的一个组件“com_fields”,这个组件任何人都可以访问,无需登陆验证。由于对请求数据过滤不严导致sql 注入,sql注入对导致数据库中的敏感信息泄漏,例如用户的密码hash以及登陆后的用户的session(如果是获取到登陆后管理员的session,那么整个网站的后台系统可能被控制)。

技术细节

面向公众的 com_fields组件从相同名称的管理端组件中借用一些视图。虽然这可能听起来像是一件奇怪的事情,但它实际上是一个非常实际的用途 - 它允许重复使用另一方编写的通用代码,而不是从头开始编写。

1.png

从上面的代码片段可以看到,$config['base_path']变量的值是JPATH_COMPONENT_ADMINISTRATOR常量传过去的,这个常量值代表管理员组件目录的本地路径,这样做会造成 Joomla! 从这个路径获取视图views和模块models,要成功的操作需要构造相关参数和值,view 参数的值是fields ,layout 参数的值是modal。那么构造的URL如下:

访问此URL可以显示这个站点根据各种参数进行排序的所有自定义字段的列表。

需要注意的是这是唯一的一个管理员视图的组件字段(我们前面提到的$config['base_path']变量这块)。这种情况下,我们可以直接从管理员模型获取数据,发现漏洞位于:.MarchModelFields模型下的./administrator/components/com_fields/models/fields.php文件中。

这个可以在getListQuery方法中找到。

2.png

如果不熟悉Joomla!执行SQL查询,$query-> order()真的只是一个方法,其输入将被连接到一个查询的ORDER BY语句,所以你可以检测,将未经检查的用户输入带入到这里,看看会发生什么

3.png

如图所述用户输入传入到list.fullordering,因为FieldsModelFields模型从继承JModelList类,它同样也包含上面的代码段。你可能会注意到它对内容做了一些验证,然后相应地设置list.direction和list.ordering,但是list.fullordering呢?

4.png

在switch语句之后,不管它是否生成了一个有效的list.direction或者list.ordering,我们可以利用这行指令通过我们输入的内容来设置我们想要的值。

所以为了利用这个漏洞,攻击者必须做的是为URL添加适当的参数,以便注入嵌套的SQL查询。

POC

参考

https://blog.sucuri.net/2017/05/sql-injection-vulnerability-joomla-3-7.html


Comments are closed.