Joomla Sqli 漏洞分析

没穿底裤 2020年1月1日02:52:08评论258 views字数 1773阅读5分54秒阅读模式
摘要

阿里巴巴应急响应中心文章出处
博文作者:阿里巴巴安全攻防对抗团队—千霄
发布日期:2015-10-23
博文内容:

一、漏洞分析
漏洞触发的代码位于:/administrator/components/com_contenthistory/models/history.php, getListQuery()函数内:

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

从函数参数和官方注释,可以知道,getState()函数功能是获取一个model的属性及属性对应的值,getState()函数在model的属性未设置时,会执行$this->populateState()来对model的一些属性进行赋值操作。
我们跟进populateState()函数看下做了什么操作,代码位于:/administrator/components/com_contenthistory/models/history.php 内:

该函数从用户输入中取出item_id,type_id,type_alias,等几个变量,对当前model的属性进行赋值,可控变量均强制为integer类型,无法利用。顺着最后一行代码:parent::populateState('h.save_date', 'DESC'),继续跟到父类中看父类populateState()函数的定义,代码位于:libraries/legacy/model/list.php,482行附近:

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

代码对取到的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)))
会发现出现错误提示:Unknown column 'Array':

需要增加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)))
执行会返回:

此带回显POC成功执行需要一个前提条件,就是传入的item_id 可以在Joomla_ucm_history表中查询到,否则会返回“500 - Layout default not found.”的提示。根据原文描述,可以暴力猜解item_id或使用time_based payload,不再赘述。

二、漏洞影响
joomla3.2-3.4.4版本

三、修复方案
目前Joomla官方已经跟新3.4.5版本,用户可登陆后台进行更新。
或下载官方升级包升级,下载地址:
https://github.com/joomla/joomla-cms/releases

四、参考链接
https://www.trustwave.com/Resources/SpiderLabs-Blog/Joomla-SQL-Injection-Vulnerability-Exploit-Results-in-Full-Administrative-Access/

阿里巴巴应急响应中心文章出处
博文作者:阿里巴巴安全攻防对抗团队—千霄
发布日期:2015-10-23
博文内容:

一、漏洞分析
漏洞触发的代码位于:/administrator/components/com_contenthistory/models/history.php, getListQuery()函数内:
Joomla Sqli 漏洞分析
通过SQL及报错信息,可以知道我们的注入payload被插入到了红色框部分内。跟进getState()函数,位于ibraries/legacy/model/legacy.php文件内,代码如下:
Joomla Sqli 漏洞分析
从函数参数和官方注释,可以知道,getState()函数功能是获取一个model的属性及属性对应的值,getState()函数在model的属性未设置时,会执行$this->populateState()来对model的一些属性进行赋值操作。
我们跟进populateState()函数看下做了什么操作,代码位于:/administrator/components/com_contenthistory/models/history.php 内:
Joomla Sqli 漏洞分析
该函数从用户输入中取出item_id,type_id,type_alias,等几个变量,对当前model的属性进行赋值,可控变量均强制为integer类型,无法利用。顺着最后一行代码:parent::populateState('h.save_date', 'DESC'),继续跟到父类中看父类populateState()函数的定义,代码位于:libraries/legacy/model/list.php,482行附近:
Joomla Sqli 漏洞分析
getUserStateFromRequest()函数用于将GET/POST中得list[]变量取回到$list中,并在第三个参数中指定该变量类型为array(),继续跟进:
Joomla Sqli 漏洞分析
代码对取到的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)))
会发现出现错误提示:Unknown column 'Array':
Joomla Sqli 漏洞分析
需要增加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 Sqli 漏洞分析
此带回显POC成功执行需要一个前提条件,就是传入的item_id 可以在Joomla_ucm_history表中查询到,否则会返回“500 - Layout default not found.”的提示。根据原文描述,可以暴力猜解item_id或使用time_based payload,不再赘述。

二、漏洞影响
joomla3.2-3.4.4版本

三、修复方案
目前Joomla官方已经跟新3.4.5版本,用户可登陆后台进行更新。
或下载官方升级包升级,下载地址:
https://github.com/joomla/joomla-cms/releases

四、参考链接
https://www.trustwave.com/Resources/SpiderLabs-Blog/Joomla-SQL-Injection-Vulnerability-Exploit-Results-in-Full-Administrative-Access/

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
没穿底裤
  • 本文由 发表于 2020年1月1日02:52:08
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Joomla Sqli 漏洞分析http://cn-sec.com/archives/76522.html

发表评论

匿名网友 填写信息