php反序列化cve漏洞复现,CVE-2019-2890 Weblogic t3反序列化漏洞分析

@Adminxe

66ba4834be0e81bbfed7fbe19150fec3.png

0x01 漏洞背景

在WebLogic官方发布的10月份安全补丁中,包含了由Venustech ADLab提交的CVE-2019-2890的修复。该漏洞通过T3协议发送恶意的反序列化数据绕过了Weblogic的黑名单,成功反序列化执行任意命令。通过官方公告可知,该漏洞的利用条件是需要认证。

34b4f5845a180d87e8db2bd706b01f2a.png

0x02 影响范围

Weblogic 10.3.6.0.0

Weblogic 12.1.3.0.0

Weblogic 12.2.1.3.0

0x03 漏洞分析

下面以10.3.6.0作为分析版本。问题出现在PersistentContext类上,通过查看继承关系我们知道PersistentContext类实现了序列化接口Serializable。

1d980a5aa868ec992787ec519d857826.png

PersistentContext类继承关系

我们来看看它的readObject方法,将ObjectInputStream类对象var1传入readSubject方法。

11cdad793773088285788750c0717360.png

readObject方法

跟进readSubject方法发现,会先从var1中读取反序列化数据当中的对象数据。然后调用EncryptionUtil.decrypt方法进行解密,最后解密后的数据被用于反序列化为对象。

c089d4bd9a6c03b7ad1227bbbf851a5b.png

readSubject方法

至此我们知道PersistenContext序列化数据中还携带了其他对象反序列化后的加密数据。如果我们在序列化PersistentContext时,将恶意对象反序列化数据先加密,然后writeObject,就可以让其携带恶意对象,绕过Weblogic黑名单进行反序列化了。

0x04 漏洞利用

根据以上思路,我们编写一个携带恶意对象的PersistenContext类。只需修改下原来代码中的writeSubject方法为如下,其中Poc.getObject()就是我们的恶意对象。

0fa0e757eb0afe3d0ad4429f3f65ae21.png

修改writeSubject方法代码

在进行序列化之前我们要处理四个问题。第一个问题是创建PersistenContext对象报错。

1e64bc73a6c2d9dd5d474f6b8676ff8d.png

创建PersistenContext对象报错信息

这是因为PersistenContext初始化时调用了SecurityServiceManager.isKernelIdentity()进行内核身份判断。isKernelIdentity方法无论如何都会抛出一个NotSupportedException异常,导致我们序列化被终止。

2e3eca3b6033980008229534dab33452.png

SecurityServiceManager.isKernelIdentity()方法

我们可以将其注释掉

ed1af33c31dca12212058a0fd7fdbb50.png

PersistenContext构造方法要修改的代码

第二个问题是反序列化PersistenContext类会出现卡死现象。这是因为PersistenContext等相关的类都会有一个AuthenticatedSubject静态对象要初始化。

75a9dc26310733982922b35aa21b69b4.png

静态AuthenticatedSubject内核id对象

初始化时会进入到如下代码。

d8f8d20cafa26a320241f306786f4ab2.png

导致卡死的代码段

我们需要ceClient变量为true,否则会一直进循环执行ceSubjectManagerLock.wait()进行等待,无法序列化!而ceClient是从系统属性com.bea.core.internal.client获取的,所以在序列化之前需要将该属性设置为true。

cb8a44d6d01d36e94e8c15506e340090.png

ceClient变量的赋值

第三个问题是恶意对象没有被加密。这是因为在调用EncryptionUtil.encrypt方法加密时,会根据Kernel.isServer()为true时才会进行加密,否则返回原数据。

因此加密之前需要调用KernelStatus.setIsServer(true)设置状态为true。

0330cc35e651b87e36bd59f5c5d55d6d.png

加密时的判断

第四个问题,加密时需要SerializedSystemIni.dat文件。 我们需要目标服务器weblogic当前使用域下该文件放到我们poc的根目录。这也是官方将这个漏洞划分为需要认证的原因。

766b5c612ff380f3c8bcb63c5594f6ab.png

加密时需要SerializedSystemIni.dat文件

解决完这四个问题,就可以将PersistenContext对象反序列化为文件了。最后通过t3协议发送反序列化数据给Weblogic,即可执行任意命令。

58df96db8ebbfca691233e4a7c8eae62.png

序列化PersistenContext对象为文件

906910ef873b66e7f84987caccde306d.png

漏洞利用演示

0x05 补丁分析

通过对比,发现最新补丁在反序列化时,使用WSFilteringObjectInputStream对要反序列化的对象进行过滤。

91adb526382a93741ed3a3897d4386cc.png

补丁修复处

WSFilteringObjectInputStream实现了Weblogic下的过滤接口 FilteringObjectInputStream。在其resolveClass方法中,检查要反序列化的类是不是Subject的子类,不是则会抛出一个非法类异常,反序列化终止!

79db4146cfe14fb1d2d98bdb7b249c00.png

补丁修复的方式

0x06 分析总结

这个漏洞需要满足以下两个条件,才能触发成功,较为鸡肋。

Weblogic开启t3协议

可以获取到SerializedSystemIni.dat文件

但是在实际环境中,如果部署在weblogic的站点存在任意文件下载或者任意文件读取,那么配合上该漏洞即可执行任意命令。

0x07 参考文章

喜欢 (3)or分享 (0)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值