0x00

这两天正好在网上看到看到了关于2017一个Joomla的漏洞,所以就尝试跟着做了一下,感觉还是有些云里雾里的,特此梳理。小白一个,请大佬们多多指教,欢迎交流

0x01

前提,下载Joomla!3.7.0版本(我已经上传到了自己博客里面,可免费下载),应该随便一个版本都可以,这里是直接安装的企业什么什么版(我不记得了),然后,跟着安装就是了

本文,是直接将cms安装到www的路径下的,www就是根目录

0x02 正题

3.7.0新增一个 com_field 组件,这个组件很神奇,不需要授权就可以访问

1.

首先看到\components\com_fields\controller.php(怎么找到这个东西的,我就不说了,因为我也不知道,可能这就是我和大佬的差距吧)

查了一下JFactory 是一个静态类,用来获取各种系统对象的引用

代码不难,最关键的是它先判断view和layout的值(这就表示普通用户可以通过这样的请求来使用管理员的 com_fields),成立就执行下边的语句:

加载JPATH_ADMINISTRATOR中的com_fields组件

base_path设置为 JPATH_COMPONENT_ADMINISTRATOR

2.

那既然和这个组件有关,就去看看com_fields ,来到administrator/components/com_fields/models/fields.php,前面的看了一下代码,确实感觉没什么好刺眼的东西,所以就直接来到了getListQuery函数,大概305行的位置

程序通过 $this->getState 取到 list.fullordering ,然后使用 $db->escape 处理后传入 $query->order 函数,跟进escape函数,位于\libraries\fof\database\driver\mysqli.php(也可以是mysql.php,都是一样的)

3.png)

这个函数熟悉吧,学代码审计的时候,sql注入有讲解这个函数,调用 mysqli_real_escape_string 来转义字符,但是仅对单双引号等字符进行转义,就没有其他过滤了

\administrator\components\com_fields\models\fields.php里面

1
2
3
$query->order($db->escape($listOrdering) . ' ' . $db->escape($orderDirn)); 

$query->order 函数的作用仅仅是将数据拼接到sql语句后,未进行过滤,所以如果 list.fullordering 可控,那就可以进行注入

3.

到这里,其实就已经找到了注入点,但是安全起见,看看在之前的其他函数(其实没必要,因为sql注入这东西,可能是因为本人还资质尚浅,所以我见过的代码中,基本上都是在于数据库交互那一步做防护,其他地方我没有遇到过)

list.fullordering 是一个 state

追踪一下这个东西,找了很久,实在不知道到底是怎么state返回找到display,所以参考了另一篇文章,他的方法是根据最开始的\components\com_fields\controller.php,最后的代码有一个

1
parent::__construct($config);

parent这里,就是父类

查找函数__construct,然后就追溯到\libraries\legacy\controller\legacy.php,

通过$this->$doTask调用display()函数(这里我也不明白)

display()函数就在这个文件中(613行),可以看到它调用了视图($view)

然后跟进display函数来到\administrator\components\com_fields\views\fields\view.html.php

解答了我刚刚找不到state的疑惑

继续往下看,据说是会调用 getState(),但是我没找到,直接看\libraries\legacy\model\legacy.php的这个函数

,然后,跟进populateState函数来到\libraries\legacy\model\list.php,大概495行的样子,有一个判断语句

不知道getUserStateFromRequest函数,再跟进,来到\libraries\cms\application\cms.php

大概就是如果数组的key不在黑名单(blacklisted)中,将会为$list变量根据相应的State进行注册,在这部分函数运行到结束部分,可以看见成功的控制了list数组的fullordering的值

到这里,就没继续的必要了,因为你已经把\administrator\components\com_fields\models\fields.phpescape之前的东西追溯了这么多了,还没发现问题,就没必要再继续了。