欢迎光临
我们一直在努力
"

Joomla对象注入漏洞分析(含漏洞利用方式)

Joomla安全团队紧急发布了3.4.6版本,修复了一个高危0day漏洞

影响版本

from Joomla 1.5 up until 3.4.5

此漏洞无需登录,前台即可代码执行

一、session反序列化

php函数session_set_save_handler()
官方手册介绍如下:
参数 read()
read(string $sessionId)
如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read 回调函数返回空字符串。

在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。 在调用 read 之前,PHP 会调用 open 回调函数。
read 回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。 PHP 会自动反序列化返回的字符串并填充 $_SESSION 超级全局变量。 虽然数据看起来和 serialize() 函数很相似, 但是需要提醒的是,它们是不同的。

简而言之,通过session_set_save_handler()重写read方法,将返回值反序列化后填入$_SESSION
示例如下:

运行结果

14501818385896

可以看出,两次vardump出来的结果,分别为序列化前和序列化后

二、数据库截断

通过官网介绍“The character set named utf8 uses a maximum of three bytes per character and contains only BMP characters. ”,mysql在使用utf8的时候,一个字符的大小的上限为3字节,而当出现四个字节的字符时,是需要用使用utf8mb4编码,不使用的话,会将不识别的四字节的字符连同后面的字符串一同舍弃。
详情参见:http://xteam.baidu.com/?p=177

三、漏洞分析

joomla会将user-agent和x-forwarded-for的内容写入session,外界可控且并未进行任何过滤

之后session写入数据库时,运用前文所讲的四字节字符截断,使得我们写入的session可以被成功反序列化

如下是写入后的内容

而后面则是session的自动反序列化

使用了session_set_save_handler函数重写了read()方法
read()方法如下

read() return后自动进行一次反序列化操作,从而造成了php对象注入

四、漏洞利用

User-aget和X-FORWARDER-FOR均可
修改session

执行代码

注意保证cookie中的数据一致即可

14501821106367

相关链接

[1]https://docs.joomla.org/Security_hotfixes_for_Joomla_EOL_versions
[2]http://php.net/session_set_save_handler

* 作者:百度云安全(企业账号),转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

转载请注明: 转载自Legend‘s BLog

本文链接地址: Joomla对象注入漏洞分析(含漏洞利用方式)



未经允许不得转载:Legend‘s BLog » Joomla对象注入漏洞分析(含漏洞利用方式)

分享到:更多 ()

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

无觅相关文章插件,快速提升流量