当前位置:首页 > 网络黑客 > 正文内容

Joomla?3.4.6?RCE复现及分析

访客4年前 (2021-04-15)网络黑客581

作者:whojoe(MS08067安全实验室SRST TEAM成员)

前言

前几天看了下PHP 反序列化字符逃逸学习,有大佬简化了一下joomla3.4.6rce的代码,今天来自己分析学习一下。

环境搭建

Joomla 3.4.6 : [https://downloads.joomla.org/it/cms/joomla3/3-4-6](https://downloads.joomla.org/it/cms/joomla3/3-4-6)

php :5.4.45nts(不支持php7)

影响版本: 3.0.0 --- 3.4.6

漏洞利用: https://github.com/SecurityCN/Vulnerability-analysis/tree/master/Joomla

(https://github.com/SecurityCN/Vulnerability-analysis/tree/master/Joomla)

要求PHP Version >=5.3.10

反序列化长度扩展分析

## 0CTF-2016-piapiapia中的利用代码

这里就直接从大佬那里把代码拿来了

index.php

profile.php

register.php

update.php

class.php

config.php

分析

index.php是登录界面(没啥用)

profile.php是读取文件的(划重点)

register.php是注册的(没啥用)

update.php是更新信息(划重点)

class.php是核心代码(划重点)

config.php flag在里面

在profile.php中可以读取文件,并且上面有反序列化操作,在update.php文件上传没有做任何过滤,但是估计实际环境会限制代码执行,在class.php中有序列化操作,并且对字符串进行了替换,由于没有对传入的单引号进行过滤,所以是存在sql注入的,但是没什么用,数据库中的所有东西都是我们可控的,所以重点就在了序列化和反序列化还有字符串长度替换上,看下过滤代码

可以看到长度唯一改变的就是where,那么我们上传一个文件看一下

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:13:"123123@qq.com";s:8:"nickname";s:5:"joezk";s:5:"photo";s:39:"upload/d421244c920e11775c1d1711a1a11da0";}

这里面的photo是我们想要控制的,那么我们就需要控制nickname字段加上长度的替换来实现任意文件读取,但是nickname长度被限制

这里可以使用数组绕过,那么我们就传一下数组来看一下

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:13:"123123@qq.com";s:8:"nickname";a:1:{i:0;s:5:"joezk";}s:5:"photo";s:39:"upload/d421244c920e11775c1d1711a1a11da0";}

发现里面的结构发生了改变,所以我们就要考虑如何构造,因为后面的s:5:"photo";s:39:"upload/d421244c920e11775c1d1711a1a11da0";}是没用的,所以这一部分就被丢弃了,为了保证还有photo字段,就要把字符串进行扩充,结合前面的正则替换,where变成hacker,增加了一个长度,所以我们的最终序列化之后的应该是这种格式的

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:13:"123123@qq.com";s:8:"nickname";a:1:{i:0;s:5:"where";}s:5:"photo";s:10:"config.php";}";}s:5:"photo";s:39:"upload/d421244c920e11775c1d1711a1a11da0";}

其中的where";}s:5:"photo";s:10:"config.php";}是我们要发送过去的nickname

";}s:5:"photo";s:10:"config.php";}长度为34,那么我们就需要把这34位给挤出去,才能保证这个是可以反序列化的,为了把这34位挤出去,就需要34个where来填充,经过正则匹配后,就会变成34个hacker长度就增加了34位,即可满足我们的要求

即nickname为wherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewherewhere";}s:5:"photo";s:10:"config.php";}

发送数据包

查看数据库中结果

a:4:{s:5:"phone";s:11:"12345678901";s:5:"email";s:13:"123123@qq.com";s:8:"nickname";a:1:{i:0;s:204:"hackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhackerhacker";}s:5:"photo";s:10:"config.php";}";}s:5:"photo";s:39:"upload/d421244c920e11775c1d1711a1a11da0";}

打开profile.php即可查看结果

经过base64解密

joomla中的利用

代码是从大佬那里哪来的,具体如下

username和password我们是可控的

大概的利用链就是通过反序列化来调用evil函数执行我们要执行的命令

看以前前面的过滤,如果传入chr(0).'*'.chr(0)是没什么用的,但是如果传入\0\0\0,就可以对序列化的字符串长度进行缩短,我们刚才的payload需要进行修改才可以用,首先,正常经过序列化的只有两个参数,而我们构造的有三个,正好结合前面的长度缩短删除掉一个参数即可实现,所以最终的payload应该是这样的。

我们来对比一下序列化之后的字符串

O:4:"User":3:{s:8:"username";s:6:"peri0d";s:8:"password";s:4:"1234";s:2:"ts";O:4:"evil":1:{s:3:"cmd";s:6:"whoami";}}

O:4:"User":2:{s:8:"username";s:6:"peri0d";s:2:"ts";O:4:"evil":1:{s:3:"cmd";s:6:"whoami";}}

可以看出两个不同的就是

peri0d";s:8:"password";s:4:"1234

目的就是要把利用长度缩减把password字段给包括到username字段里,这一部分,他的长度是32要去掉

这里面我们的payload是

s:2:"ts";O:4:"evil":1:{s:3:"cmd";s:6:"whoami";}

长度为47

我们只能控制两个参数就是username和password,我们为了保证password字段被username吃掉而且还要保证payload能够被利用,payload就要放在password字段中传入,通过username字段进行缩减从而达到目标,有了思路,就开始构造。

这里我们需要删除的是

";s:8:"password";s:55:"123455

他的长度是28

在正则中

str_replace('\0\0\0', chr(0).'*'.chr(0), $data);

我们每次只能删除的长度是3,所以字符串长度应该是3的倍数,那么就把长度减一,变成27即可,需要9个\0\0\0

执行一下

可以看到我们的payload已经执行了。

漏洞复现

下载poc之后安装需要的包,运行exp

菜刀按上面的网址和密码链接

查看configuration.php发现已经写入一句话

exp分析

在第一行已经定义了代理

PROXS={'http':'127.0.0.1:8080'}

获取cookie

获取csrf token

验证漏洞存在,如果存在的话,执行exploit

从新获取cookie和token,写入一句话,检查一句话是否存在,之后通过一句话执行反弹shell操作

这里跟踪一下写入一句话,漏洞点存在于libraries/joomla/session/storage/database.php中于是我们在这里下断点查看一下

看以前前面的过滤,如果传入chr(0).’*’.chr(0)是没什么用的,但是如果传入\0\0\0,就可以对序列化的字符串长度进行缩短,有了之前的分析,这里就会好理解许多,可以参考我的另一篇文章PHP 反序列化字符逃逸学习(https://blog.csdn.net/qq_43645782/article/details/105801796)

数据库中的数据

可以看到和正常数据不同的地方的后面也有很多类似函数的参数,把上面的格式化一下

Services 一文中给出所有的字母标示及其含义:

a - array b - boolean d - double i - integer o - common object r - reference s - string C - custom object O - class N - null R - pointer reference U - unicode string

在其中的";s:8:"password";s:603:"AAA长度为27,正好为构造的payload,经过read函数的替换之后变为

之后经过一个303跳转,请求index.php/component/users/?view=login从新调用read()函数,触发payload

这里的password字段被替换为一个类

查看libraries/joomla/database/driver/mysqli.php中206行

存在一个call_user_func_array函数,但是这里面的是我们不可控的,所以需要取寻找另一个利用点,新调用一个对象,在libraries/simplepie/simplepie.php中

这里simplepie是没有定义的,所以需要`new JSimplepieFactory()`,并且在SimplePie类中,需要满足`if ($this->cache && $parsed_feed_url['scheme'] !=='')`才能调用下面的`call_user_func`,并且为了满足能够实现函数使用,需要中的cache_name_function和feed_url为我们的函数和命令

在这个序列化的过程中,我没有理解为什么要新new出来一个JDatabaseDriverMysql对象,这个对象`extends`JDatabaseDriverMysqli,难道是为了再调用JDatabaseDriverMysqli中的方法么,如果有大佬知道的话,欢迎留言评论

参考文章

https://xz.aliyun.com/t/6522

https://www.freebuf.com/vuls/216130.html

https://blog.csdn.net/qq_43645782/article/details/105801796

MS08067实验室官网:www.ms08067.com

公众号:" Ms08067安全实验室"

Ms08067安全实验室目前开放知识星球: WEB安全攻防,内网安全攻防,Python安全攻防,KALI Linux安全攻防,二进制逆向入门

最后期待各位小伙伴的加入!

扫描二维码推送至手机访问。

版权声明:本文由黑客接单发布,如需转载请注明出处。

本文链接:https://therlest.com/106103.html

分享给朋友:

“Joomla?3.4.6?RCE复现及分析” 的相关文章

【干货知识】高級不断渗透第八季-demo就是远程控制

本季度是《高級不断渗透-第七季demo的发展》的持续。 点一下文尾左下角“阅读”可阅读文章第七季文章正文。 在第一季有关后门中,文章内容提及再次编译程序notepad ,来引入有目标源代码后门结构。 在第六季有关后门中,文章内容假定不在获知notepad 的源代码,来引入无目标源代码沟...

我老公老是让他家的亲戚来我家,我该怎么办?请各位帮我想想办法,我

我老公老是让他家的亲戚来我家,我该怎么办?请各位帮我想想办法,我 请各位帮我想想办法,开网店怎么找女装货源唔爱神起助您成就财富人生,想做微商?想开实体店?想开淘宝店?什么才是你创业的最重要步骤?货源!想在微商卖童装母婴用品纸尿裤女装,开童装女装店铺,你去哪里找最好的货源?如何找童装女装一手货源呢?...

苹果笔记本19款air参数_133英寸是多少厘米

Macbook Air厚度分为两个版本,1366x768;CPU型号:Intel酷睿i52467M;CPU主频,2010年10月,Touch Bar位于键盘上方,宽169点5毫米6点6英寸长240毫米。 4款,长240毫米9点4英寸。12寸。 MacBook Air相关尺寸,133扩展:苹果MacB...

怎样辨别有农药残留的蔬菜?

怎样辨别有农药残留的蔬菜? 一、不吃形状、颜色异常的蔬菜: 形状:颜色正常的蔬菜,一般是常规栽培,是未用激素等化学品处理的,可以放心地食用。 “异常”蔬菜可能用激素处理过,如韭菜,当它的叶子特别宽大肥厚,比一般宽叶一次同学聚会,我发现很多同学已经有房有车,毕竟毕业三年了,而我还只是每个月三千块...

英寸和米的换算(这些单位换算你还知道吗?)

英寸和米的换算(这些单位换算你还知道吗?) 一寸等于多少厘米 更新:2016-03-28 14:07:21 查看相关文章 一寸等于多少厘米 1寸=3.3333333厘米(cm) 1英寸(in)=2.54厘米(cm) 一寸等于多少毫米 1寸=33.3333333毫米(mm) 1英寸...

免费永硕黑客网盘,黑客软件公司,网站被黑客攻击要多久才能恢复

写入文件C:WindowsSystem32MF.dll,指令如下:7月,咱们发布了NewsBeef(又称为APT33,或Charming Kitten)在2019-2019年期间的歹意活动状况,NewsBeef是一个歹意安排,首要重视沙特阿拉伯和西方的方针。 NewsBeef缺少先进的进犯才干,此前...

评论列表

性许绮烟
2年前 (2022-07-06)

ay b - boolean d - double i - integer o - common object r - reference s - string C - custom object O -

青迟漠望
2年前 (2022-07-06)

fig.php";}是我们要发送过去的nickname";}s:5:"photo";s:10:"config.php";}长度为34,那么我们就需要把这34位给挤出去,才能保证这个是可以反序列化的,为了把这34位挤出去,就需要34个where来填

断渊铃予
2年前 (2022-07-06)

ig.php分析index.php是登录界面(没啥用)profile.php是读取文件的(划重点)register.php是注册的(没啥用)update.php是更新信息(划重点)class.php是核心代码(划重点)config.php flag在里面在profile.

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。