mysql漏洞2017,Joomla! 3.7 Core SQL 注入 (CVE-2017-8917)漏洞分析

本文分析了Joomla 3.7.0版本中的一个未授权状态下的SQL注入漏洞,详细介绍了漏洞原理及利用过程,并提供了修复方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Author: p0wd3r (知道创宇404安全实验室)

Date: 2017-05-18

0x00 漏洞概述

漏洞简介

漏洞影响

未授权状态下SQL注入

影响版本: 3.7.0

0x01 漏洞复现

Joomla 在 3.7.0 中新增了一个 com_field组件,其控制器的构造函数如下,在components/com_fields/controller.php中:

2279661d2500a50314e9cfbcb2c3f624.png

可以看到当访问的view是fields,layout是modal的时候,程序会从JPATH_ADMINISTRATOR中加载com_fields,这就意味着普通用户可以通过这样的请求来使用管理员的com_fields。

接下来我们看管理员的com_fields组件,我们来到administrator/components/com_fields/models/fields.php,其中的getListQuery的部分代码如下:

38ffce1e8463a98518ed27b4c4b73862.png

程序通过$this->getState取到list.fullordering,然后使用$db->escape处理后传入$query->order函数,mysqli的escape函数代码如下:

cac52161a0068a575810c368407350e9.png

这里调用mysqli_real_escape_string来转义字符,该函数具体作用如下:

8e4ff4e86bc3c90ed7e28e8626bb5dd0.png

仅对单双引号等字符进行转义,并未做更多过滤。另外$query->order函数的作用仅仅是将数据拼接到ORDER BY语句后,也并未进行过滤,所以如果list.fullordering可控,那么就可以进行注入。

我们可以看到list.fullordering是一个state,state会在视图的display函数中进行设置:

587222a6661606264cebceccc121bc5c.png

跟进这个设置过程,程序会走到libraries/legacy/model/list.php中的populateState函数中,具体的调用栈如下:

5066bd412117aa68c65cb3e29be3dbe4.png

该函数中有如下一段代码:

if ($list = $app->getUserStateFromRequest($this->context . '.list', 'list', array(), 'array'))

{

foreach ($list as $name => $value)

{

// Exclude if blacklisted

if (!in_array($name, $this->listBlacklist))

{

...

$this->setState('list.' . $name, $value);

}

}

}

程序通过$app->getUserStateFromRequest取到一个$list数组 ,如果数组的key不在黑名单中,则遍历该数组对相应state进行注册,getUserStateFromRequest的代码如下:

9193c8e876b4c46e11f7533b5a73a9d9.png

结合前面的调用来看,我们可以通过请求中的参数list来设置$list变量,因此我们访问http://ip/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(2,concat(0x7e,(version())),0)并开启动态调试动态调试,结果如下:

9b02b6436c809b00d34494172e474fb4.png

可以看到list.fullordering已经被我们控制。

回到getListQuery,该函数会在视图加载时被自动调用,具体函数调用栈如下:

000bbc987483f4e166a698e1c68ec078.png

所以我们的payload也就通过getState传入了这个函数,最终导致SQL注入:

e52fcfc6ba9d90c3b8004219052b4ef0.png

85f942886644d843de3feefab6421d6d.png

0x02 补丁分析

5263f45673a13fb118ad2fb539bb0b6c.png

改为取list.ordering和list.direction作为查询的参数,这两个参数在populateState函数中做了如下处理:

746cfc464a7d85ac3e8eacc89fe4f0f1.png

如果值不在指定范围内则将其更改为默认值,因此无法再将payload带入。

0x03 参考

本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/305/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值