Joomla3.4.6 RCE漏洞深度分析
笔者《Qftm》原文发布:https://www.freebuf.com/vuls/216512.html
*严正声明:本文仅限于技术讨论与分享,严禁用于非法途径
0×00 背景
10月9号国内几家安全媒体公布了Joomla RCE的漏洞预警,并且网上已公布漏洞利用EXP,影响版本包括Joomla 3.0.0 – 3.4.6。
0×01 环境搭建
Joomla是一套全球知名的内容管理系统。Joomla是使用PHP语言加上MySQL数据库所开发的软件系统,目前最新版本是3.9.11 。可以在Linux、Windows、MacOSX等各种不同的平台上执行。
Joomla环境搭建下载:https://github.com/joomla/joomla-cms/releases/tag/3.4.6
PS:搭建环境要求php 5.3.10以上
0×02 漏洞分析
Session会话机制
PHP本身对Session的存储默认放在文件中,当有会话产生使用到Session时候,将会在网站服务端设置好的路径写入相应的Session文件,文件的内容为默认序列化处理器序列化后的数据。然而在Joomla中则改变了PHP的默认处理规则,相反将序列化之后的数据存放在数据库的” hzlnp_session”表中存储:
将序列化之后的数据存放在数据库中所对应的处理函数为由session_set_save_handler()设置的\libraries\joomla\session\storage\database.php 中的write():
相应的取值函数read()也位于\libraries\joomla\session\storage\database.php中
接着从代码中可以看出,在存入数据库之前,会将传入数据中的chr(0) . ‘*’ .chr(0) 替换为\0\0\0, 原因是mysql数据库无法处理NULL字节,而protected 修饰符修饰的字段在序列化之后是以\x00\x2a\x00开头的。然后从数据库中取出来的时候,再将字符进行替换还原,防止无法正常反序列化。
Session会话逃逸
session 在 Joomla 中的处理存在一些问题,它会把没有通过验证的用户名和密码存储在hzlnp_session表中
当用户在登陆过程中,会有一个 303 的跳转,主要是用于write()数据库写入用户会话然后read()相应取出会话进行对比,显示结果
通过分析Session会话机制和Session逃逸我们还不明确Session形成的漏洞到底在哪!
首先需要了解一下PHP的序列化的机制,PHP在序列化数据的过程中,如果序列化的字段是一个字符串,那么将会保留该字符串的长度,然后将长度写入到序列化之后的数据,反序列化的时候按照长度进行读取。
知道PHP序列化过程之后,针对Joomla的内置序列化方法write和read函数,如果写入数据库的时候,是\0\0\0, 取出来的时候将会变成chr(0) . ‘*’ . chr(0),这样的话,入库的时候生成的序列化数据长度为6(\0\0\0), 取出来的时候将会成为3(N*N, N表示NULL),依据PHP反序列化原理,该数据在反序列化的时候,如果按照原先的长度进行读取,就会导致溢出。
那么由” \0\0\0”溢出会造成什么问题呢?按照PHP反序列化的特点,PHP按照长度读取指定字段的值,读取完成以分号结束,接着开始下一个,如果我们能够控制两个字段的值,第一个用来溢出第一个字段和第二个字段的前一部分,第二个字段的另一部分用来构造序列化利用的payload,最终序列化结果将会把第一个字段开始部分到第二个字段的前一部分当成第一个字段的全部内容,第二个字段内容成功逃逸出来并且被反序列化。
为了触发我们的任意对象并实现RCE,我们需要将登录框处的两个字段username和password进行处理,第一个字段将导致“溢出”,第二个字段将包含漏洞利用的最后一部分。
漏洞利用大概思路
编写本地测试代码
此处伪代码对Joomla内置的write()、read()函数进行模拟,username字段通过9组”\0\0\0”进行赋值,其值序列化存入数据库db.txt长度为54,反序列化取出长度变为27,加上后面第二个字段password的27个字符构成实际的username值:
O:4:”User”:2:{s:8:”username”;s:57:”xx。。。xxx”;s:8:”password”;s:nn:”payload”;}
由于”;s:8:”password”;s:nn:”长度为23,\0\0\0经read()函数处理之后会减半,所以要想覆盖password字段值,username字段值就要取9组”\0\0\0”,同时password的字段值长度至少需要是两位(nn代表占位符),因为实际上payload的长度会大于10。
测试结果 实现任意对象的注入
构造POP执行链,执行任意代码
首先参考PHITHON 师傅的一篇文章“Joomla远程代码执行漏洞分析“收获很多,依据PHITHON 师傅的思路,同样,在我们可以控制反序列化对象以后,我们只需构造一个能够一步步调用的执行链,即可进行一些危险的操作了。exp构造的执行链,分别利用了JDatabaseDriverMysqli和SimplePie类
我们可以在JDatabaseDriverMysqli类(\libraries\joomla\database\driver\mysqli.php)的析构函数里找到一处敏感操作:
由于exp构造的对象反序列化后,将会成为一个JDatabaseDriverMysqli类对象,不管中间如何执行,最后都将会调用__destruct魔法函数,__destruct将会调用disconnect,disconnect里有一处敏感函数:call_user_func_array。但很遗憾的是,这里的call_user_func_array的第二个参数是我们无法控制的,但是,我们可以进行回调利用:
call_user_func_array([$obj,"任意方法"],array( &$this))
进一步跟踪到SimplePie类(\libraries\simplepie\simplepie.php),通过将SimplePie对象和它本身的init()函数可以组成一个回调函数[new SimplePie(), 'init'],传入call_user_func_array
分析init()函数
通过分析代码发现此处的call_user_func 参数可控,只要满足条件$this->cache=true && $parsed_feed_url['scheme'] !== Null,将其中第二个call_user_func的第一个参数cache_name_function赋值为assert,第二个参数赋值为我们需要执行的代码,这样就可以构成一个可利用的“回调后门“,达到任意代码执行效果。
PS:对于网上爆的利用回调后门在网站根目录下的configuration.php中写入一句话木马getshell这种方式,在真实环境中大多都不能利用成功(权限问题),效果并不是太好。
0×03 漏洞预防
1、版本更新
2、对session信息进行编码存储
0×04 参考链接
https://blog.hacktivesecurity.com/index.php?controller=post&action=view&id_post=41
https://www.leavesongs.com/PENETRATION/joomla-unserialize-code-execute-vulnerability.html
*本文原创作者:Qftmer,本文属于FreeBuf原创奖励计划,未经许可禁止转载
Joomla3.4.6 RCE漏洞深度分析的更多相关文章
- S2-052 RCE漏洞 初步分析
PS:初步分析,只是分析了Struts2 REST插件的部分,本来菜的抠脚不敢发,但看到各大中心发的也没比我高到哪里去,索性发出来做个记事! 漏洞描述 2017年9月5日,Apache Struts发 ...
- Joomla 3.0.0 - 3.4.6 RCE漏洞分析记录
0x00 前言 今天早上看到了国内几家安全媒体发了Joomla RCE漏洞的预警,漏洞利用的EXP也在Github公开了.我大致看了一眼描述,觉得是个挺有意思的漏洞,因此有了这篇分析的文章,其实这个 ...
- Sunlogin RCE漏洞分析和使用
介绍 前两天网上曝出了关于向日葵远控工具(Sunlogin)Windows个人版的RCE漏洞POC.因为利用简单并且网上出现了公开的自动化扫描脚本,所以测试的人很多,也出现了一些真实攻击.漏洞的问 ...
- PhpStudy BackDoor2019 深度分析
笔者<Qftm>原文发布<合天>:https://mp.weixin.qq.com/s?__biz=MjM5MTYxNjQxOA==&mid=2652852661&am ...
- Zimbra无需登录RCE漏洞利用
2019年3月13号,一名国外的安全研究员在他的博客上公布了zimbra RCE漏洞相关信息,但其中并未提到一些漏洞利用细节. 经过一段时间努力,根据网上各位大牛的分析和我自己的理解,在此我将整个漏洞 ...
- WordPress插件Social Warfare<=3.5.2 无需登录RCE漏洞
该漏洞只存在于Social Warfare插进的3.5.0.3.5.1和3.5.2版本中,其他版本不存在. 2019年3月21日插件作者紧急发布了3.5.3版本以修复高危的RCE漏洞,在<=3. ...
- Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现
Joomla 3.0.0 -3.4.6远程代码执行(RCE)漏洞复现 一.漏洞描述 Joomla是一套内容管理系统,是使用PHP语言加上MYSQL数据库所开发的软件系统,最新版本为3.9.12,官网: ...
- U-Boot NFS RCE漏洞(CVE-2019-14192)
U-Boot NFS RCE漏洞(CVE-2019-14192) 原文:https://blog.semmle.com/uboot-rce-nfs-vulnerability/ 翻译:看雪翻译小组 - ...
- 威胁快报|首爆,新披露Jenkins RCE漏洞成ImposterMiner挖矿木马新“跳板”
简介 阿里云安全于近日捕获到一起使用Jenkins RCE漏洞进行攻击的挖矿事件.除挖矿外,攻击者还曾植入具有C&C功能的tsunami木马,也预留了反弹shell的功能,给用户带来极大安全隐 ...
随机推荐
- 006:CSS高级技巧
目录 前言 理论 CSS高级技巧 一:元素的显示与隐藏 在CSS中有三个显示和隐藏的单词比较常见,我们要区分开,他们分别是 display visibility 和 overflow. 他们的主要目的 ...
- FPGA、GPU、CPU三者各自的优缺点是什么呢?
CPU: 英文全称:Central Processing Unit. 中文全称:中央处理器. 厂商:英特尔Intel. 功能:是一台计算机的运算核心和控制核心. 缺点:运算能力(最弱),核处理数(最少 ...
- Android 正 N 边形圆角头像的实现
卖一下广告,欢迎大家关注我的微信公众号,扫一扫下方二维码或搜索微信号 stormjun94(徐公码字),即可关注. 目前专注于 Android 开发,主要分享 Android开发相关知识和一些相关的优 ...
- 蓝桥杯 algo122 未名湖的烦恼 简单题
#include <iostream> using namespace std; int m, n, ans; void solve(int m, int n, int cnt) { &a ...
- 一次五分钟 angularJS (1)—— Binding
引用angularjs 需要使用AngularJS,需要引用AngularJS的文件 ng-app 要将angular用到页面绑定的时候,我们需要指明它的作用域. 在上图中,ng-app=" ...
- 报表统计——java实现查询某年12个月数据,没数据补0
一般图表绘制例如echarts等,返回数据格式都大同小异.重点是利用sql或者java实现数据格式的转型,接下来是关键部分: 1.mapper层sql语句,返回统计好的月份与对应月份的数据. < ...
- MVC4 Jqgrid设计与实现
项目本来使用的是webgrid.后台弃用改成Jqgrid插件. 首先介绍一下webgrid的用法:webgrid是mvc中HtmlHelper自带的.首先创建viewmodel用于数据的绑定,然后在页 ...
- 记录使用echarts的graph类型绘制流程图全过程(一)-x,y位置的计算
先说下本次案例业务需求,输入2个节点,获取数据后绘制出2个节点间的路径,之前使用的是网状图,但是网状图的效果不佳,需要转换成流程图的模式: 那么如何在不修改数据的情况下,实现类似效果尼? 看了下ech ...
- Js获取宽高度的归纳集锦总结
首先,先吓唬一下我们的小白们!在js中的描述宽高的可以细分有22种.属性根据不同的兼容性也分为五种 window.innerWidth //除去菜单栏的窗口宽度,与浏览器相关 window.inner ...
- python编程基础之三
变量 变量定义:变量名 = 值 #不需要给定变量类型 变量命名规范:也就是标识符的命名规则, 1.由数字,字母,下划线组成,不允许数字开头 2.区分大小写 3.不能是系统保留字(keyword) 获 ...