Joomla 3.X RCE 0day漏洞预警

时间:2019-10-17 13:05:03来源:信息安全服务部作者:梦之想科技

漏洞简介


严重程度:高

CVE编号:暂无

影响版本:3.0.0 至 3.4.6 版本


漏洞危害


该漏洞是一个PHP对象注入漏洞,与CVE-2015-8562类似,成功利用可导致远程命令执行(RCE)。


漏洞详情


JOOMLA会话以PHP OBJECTS的形式存储在数据库中,且由PHP会话函数处理。它是一种有意思的攻击向量,因为未认证用户的会话也可存储,因此对象注入(OBJECT INJECTION)能够导致未认证的远程代码执行(RCE)后果。

网站截图:


使用已公开利用脚本(HTTPS://GITHUB.COM/KIKS7/RUSTY_JOOMLA_RCE)来检测网站是否存在该漏洞。


显示“VULNERABLE”,则表示该RCE漏洞存在

对网站进行Getshell和反弹shell操作:


工具返回了一句话木马连接密码和地址,并反弹了shell到指定IP地址和端口。

连接地址:http://网站地址/configuration.php    

密码:xtigeyyhorlnaeqwihsgcipvdjlguuxorsumwjoxkoodeawpkx

反弹shell:使用了-l参数来指定,这里为192.168.133.1,端口使用-p参数,这里为443。

一句话密码已经插入到了configuration.php文件中


使用蚁剑连接木马:


同时,VPS收到了反弹的shell。

漏洞分析:

 ‘libraries/joomla/session/ storage.php’中的session_set_save_handler()函数定义了read(()和write()两种方式,以便于’libraries/joomla/session/session.php:__start’中的session_start()函数来调用读和写的功能。

这是一个经典的Joomla(3.4.6之前)的会话示例,该会话存储在数据库中供未经身份验证的用户使用(在表__session上):


定义了许多对象,但最有趣的是在会话中如何处理输入参数。

如果我们使用参数进行常规操作,则这些参数和操作的结果消息将存储在会话对象中,如下所示:


当我们在 Joomla中执行POST请求时,通常会有303重定向将我们重定向至结果页。这是利用的重要事项,因为第一个请求(含参数)将只会导致 Joomla 执行动作并存储(例如调用write() 函数)会话,之后303重定向将进行检索(如调用read() 函数)并将信息显示给用户。

read()函数代码:
640.webp.jpg

write()函数代码:

6401.webp.jpg

在write函数中,接受两个参数。一个为session_id(来自Cookie)和序列化的数据对象。在将数据存储到数据库之前,将’\x00\x2a\x00’ (chr(0).’*’.chr(0))替换为’\0\0\0’。那是因为Mysql无法保存空字节,并且$protected变量被赋予了’\x00\x2a\x00’前缀。

在read函数中,当读取时,read函数会用’\x00\x2a\x00’替换’\0\0\0’,来重构对象。

这种替换问题在于他用3个字节替换了6个字节。


此行为已从3.0.0版本引入,并影响到Joomla,直到3.4.6。从3.4.7开始,该代码段仍然存在,但会话已通过base64编码并存储在数据库中。

如之前所述,我们能够通过动作参数来操纵该会话对象。这样,我们就能够注入将被3个字节替换的‘\0\0\0’,导致对象因大小不正确而不合法。如果我们将登录表单看做一个目标,在 username 字段中放入‘my\0\0\0username’,那么我们将在数据库中得到如下对象:

s:8:s:"username";s:16:"my\0\0\0username"

当该会话对象从 read 函数中读取时,‘\0\0\0’将被以如上所述方式所替代,得到如下值:

s:8:s:"username";s:16:"myN*Nusername" ->无效的大小

替换的字符串只有13个字节长,但声明的字符串大小仍然为16!

现在,我们可以利用这一“溢出”优势,并构筑一个新的目标,它将使我们达到最终目标……RCE。


修复建议


建议用户更新至最新版本3.9.12,或禁用system,exec等一系列危险函数。