CVE-2017-8917个人理解
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 | $query->order($db->escape($listOrdering) . ' ' . $db->escape($orderDirn)); |
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.php
escape之前的东西追溯了这么多了,还没发现问题,就没必要再继续了。