Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析
一、漏洞描述
Joomla是一套内容管理系统,是使用PHP语言加上MYSQL数据库所开发的软件系统,最新版本为3.9.12,官网: https://downloads.joomla.org/,漏洞位于根目录下的configuration.php,由于该CMS对函数过滤不严格,导致了远程代码执行漏洞,该漏洞可能导致服务器被入侵、信息泄露等严重风险。
  代码执行漏洞也叫代码注入漏洞,指用户通过浏览器提交执行恶意脚本代码,执行恶意构造的脚本代码。
二、漏洞影响版本
Joomla 3.0.0-3.4.6
三、漏洞环境搭建
靶机:win7(使用phpstudy搭建环境)    ip:192.168.86.131
攻击机:kali    ip:192.168.86.129
1、下载joomla 3.4.6下载地址:https://downloads.joomla.org/cms/joomla3/3-4-6
2、下载完成后开始搭建实验环境:开启phpstudy然后访问127.0.0.1
为joomla创建数据库(直接在phpstudy中创建即可)然后再将下载的joomla拷贝到phpstudy中的www目录下即可成功访问

但是在访问的过程中有报错,但是我分析了一下应该是PHP版本的问题(毕竟搭了那么多靶场)我换了一个5.3的版本成功解决:

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第1张图片
开始创建:

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第2张图片


安装完成后需要删除安装目录:

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第3张图片

安装成功:

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第4张图片

漏洞验证前先下载所需要的python包:

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第5张图片

在github上找到EXP:直接kali上git clone https://github.com/kiks7/rusty_joomla_rce.git
探测出来有漏洞:(我的joomla的文件名为zmax)

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第6张图片
发现后门已经被写入:


在靶机查看configuration.php,发现被写入了webshell,


使用菜刀连接,结果成功连接

Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现与分析(序列化与反序列化简单理解)_第7张图片

复现成功,现在来分析这个漏洞:
本次漏洞主要是由于对 session 处理不当,从而可以伪造 session 从而导致 session 反序列。漏洞存在于 libraries/joomla/session/session.php 中,_validate函数,将ua和xff调用set方法设置到了session中(session.client.browser和session.client.forwarded)关于session反序列化可以参考:https://www.cnblogs.com/zzjdbk/p/12995217.html
关于这个漏洞,session反序列化漏洞是因为在序列化和反序列化的过程中使用了不同的引擎,而不同的符号(如“|”)在不同的搜索引擎中有不同的含义——因为反序列化和序列化使用的处理器不同,由于格式的原因会导致数据无法正确反序列化,那么就可以通过构造伪造任意数据。
joomla也没有采用php自带的session处理机制,而是用多种方式(包括database、memcache等)自己编写了存储session的容器(storage)。
其存储格式为『键名 + 竖线 + 经过 serialize() 函数反序列处理的值』,未正确处理多个竖线的情况。那么,我们这里就可以通过注入一个"|"符号,将它前面的部分全部认为是name,而|后面我就可以插入任意serialize字符串,构造反序列化漏洞了。
水平有限,只能分析到这里了……等后面慢慢积淀再分析

 

 

 

序列化与反序列化:

在PHP中,序列化用于存储或传递 PHP 的值的过程中,同时不丢失其类型和结构。

序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。

       反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。

     总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息) 本质上讲,序列化就是把实体对象状态按照一定的格式写入到有序字节流,反序列化就是从有序字节流重建对象,恢复对象状态。

为什么需要序列化与反序列化

我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等, 而这些数据都会以二进制序列的形式在网络上传送。

那么当两个进程进行通信时,能否实现进程间的对象传送呢?答案是可以的!如何做到呢?这就需要序列化与反序列化了!

换句话说,一方面,发送方需要把这个对象转换为字节序列,然后在网络上传送;另一方面,接收方需要从字节序列中恢复出对象。

当我们明晰了为什么需要序列化和反序列化后,我们很自然地会想序列化的好处。其好处一是实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(通常存放在文件里),二是,利用序列化实现远程通信,即在网络上传送对象的字节序列。

总的来说可以归结为以下几点:

  1. 永久性保存对象,保存对象的字节序列到本地文件或者数据库中;
    (2)通过序列化以字节流的形式使对象在网络中进行传递和接收;
    (3)通过序列化在进程间传递对象;

一个对象有状态、行为和标识三种属性

在传递变量的过程中,有可能遇到变量值要跨脚本文件传递的过程。如果一个脚本中想要的调用之前一个脚本的变量,但是之前一个脚本已经执行完毕,所有的变量和内容释放掉了,那该如何操作呢?serialize和unserialize就是解决这一问题的存在,serialize可以将变量转换为字符串,并且在转换的过程中可以保存当前变量的值,而unserialize则可以将serialize生成的字符串转换回变量。通俗来说:通过反序列化在特定条件下可以重建php对象并执行php对象中某些magic函数。

 

你可能感兴趣的:(CMS漏洞复现,RCE,安全漏洞)