欢迎来到云服务器

网络技术

Joomla 3.x Sql注入裂痕阐明

一、裂痕阐明

裂痕触发的代码位于:/administrator/components/com_contenthistory/models/history.php,getListQuery()函数内:

Joomla 3.x Sql注入裂痕阐明

通过SQL及报错信息,可以知道我们的注入payload被插入到了赤色框部门内。跟进getState()函数,位于ibraries/legacy/model/legacy.php文件内,代码如下:

Joomla 3.x Sql注入裂痕阐明

从函数参数和官方注释,可以知道,getState()函数成果是获取一个model的属性及属性对应的值,getState()函数在model的属性未配置时,会执行$this->populateState()来对model的一些属性举办赋值操纵。

我们跟进populateState()函数看下做了什么操纵,代码位于:/administrator/components/com_contenthistory/models/history.php 内:

Joomla 3.x Sql注入裂痕阐明该函数从用户输入中取出item_id,type_id,type_alias,等几个变量,对当前model的属性举办赋值,可控变量均强制为integer范例,无法操作。顺着最后一行代码:parent::populateState('h.save_date', 'DESC'),继承跟到父类中看父类populateState()函数的界说,代码位于:libraries/legacy/model/list.php,482行四周:

Joomla 3.x Sql注入裂痕阐明

getUserStateFromRequest()函数用于将GET/POST中得list[]变量取回到$list中,并在第三个参数中指定该变量范例为array(),继承跟进:

Joomla 3.x Sql注入裂痕阐明代码对取到的list[]数组举办了遍历,并做相应的过滤、拆分,可以看到list[select]没有处理惩罚逻辑,会进入default的case,后续$this->setState('list.' . $name, $value)代码执行后,导致请求中list[select]变量没有任何变量被直接赋值给Model属性,继承转头看文章最开始的注入位置,,此时我们可以节制$this->getState('list.select')的返回值,结构SQL注入。

       确认了输入可控的位置,结构有效的payload,还需要办理几个小问题。结构POC:index.php?option=com_contenthistory&view=history&item_id=1&type_id=1&list[select]=(exp(~(select* from(select md5(1))x)))

会发明呈现错误提示:Unknowncolumn 'Array':

Joomla 3.x Sql注入裂痕阐明需要增加list[ordering]=将原SQL中的order by字段值清空。


最终可执行POC:

/index.php?option=com_contenthistory&view=history&item_id=1&list[ordering]=&type_id=1&list[select]=(exp(~(select* from(select md5(1))x)))

执行会返回:

Joomla 3.x Sql注入裂痕阐明

此带回显POC乐成执行需要一个前提条件,就是传入的item_id 可以在Joomla_ucm_history表中查询到,不然会返回“500 - Layout default not found.”的提示。按照原文描写,可以暴力猜解item_id或利用time_basedpayload,不再赘述。

二、裂痕影响

joomla3.2-3.4.4版本

三、修复方案

今朝Joomla官方已经更新3.4.5版本,用户可登岸靠山举办更新。

或下载官方进级包进级,下载地点:

https://github.com/joomla/joomla-cms/releases

腾讯云代理

Copyright © 2003-2021 MFISP.COM. 国外vps服务器租用 梦飞云服务器租用 版权所有 粤ICP备11019662号