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,都是一样的)
在这里插入图片描述
这个函数熟悉吧,学代码审计的时候,sql注入有讲解这个函数,调用 mysqli_real_escape_string 来转义字符,但是仅对单双引号等字符进行转义,就没有其他过滤了
\administrator\components\com_fields\models\fields.php里面

$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,最后的代码有一个

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之前的东西追溯了这么多了,还没发现问题,就没必要再继续了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值