Weblogic CVE-2023-21931 漏洞挖掘技巧:后反序列化利用
Weblogic CVE-2023-21931 漏洞挖掘技巧:后反序列化利用
原创 14m3ta7k GobySec 2023-04-20 09:39
G
o
b
y
社
区
第
2
篇
漏
洞
分
析
文
章
全
文
共
:
6
856
字
预
计
阅
读
时
间
:
1
8
分
钟
01概述
近些年,Weblogic 反序列化漏洞一直围绕着反序列化的触发点进行漏洞挖掘,事实上还有很多存在反序列化但无法实时利用的点,在大家平时的漏洞挖掘中容易忽略。在行业内也有一些关于“后反序列化”的进一步讨论,这些看似无法利用的漏洞,其实可以通过一些后续的技巧完成稳定的利用效果。例如,进行
bind()
或
rebind()
操作后,并没有触发漏洞,此时可以尝试其他方法如
lookup()
、
lookupLink()
等触发漏洞。
通过这种思路我们发现了两个 Weblogic 的后反序列化漏洞(CVE-2023-21931、CVE-2023-21839),获得了 Oracle 的官方确认。本文以这两个 Weblogic 漏洞为例,分享”后反序列化漏洞”的利用思路。
我们相信还有很多这类的漏洞在未来会逐渐被挖掘出来,希望本篇文章能够给大家一些启发。
02后反序列化漏洞
W
e
b
l
o
g
i
c
反
序
列
化
漏
洞
挖
掘
思
路
是
利
用
r
e
a
d
O
b
j
e
c
t
(
)
、
r
e
a
d
R
e
s
o
l
v
e
(
)
、
r
e
a
d
E
x
t
e
r
n
a
l
(
)
等
反
序
列
化
方
法
对
恶
意
序
列
化
数
据
进
行
操
作
,
以
达
到
攻
击
目
的
。
常
规
的
漏
洞
思
路
重
点
关
注
W
e
b
l
o
g
i
c
在
反
序
列
化
过
程
中
进
行
恶
意
攻
击
,
而
忽
略
了
反
序
列
化
完
成
后
的
操
作
。
后
反
序
列
化
漏
洞
挖
掘
的
思
路
重
点
关
注
W
e
b
l
o
g
i
c
完
成
反
序
列
化
过
程
后
,
在
达
到
某
个
时
机
或
执
行
操
作
后
触
发
的
漏
洞
攻
击
。
在
W
e
b
l
o
g
i
c
中
,
如
果
进
行
b
i
n
d
(
)
或
r
e
b
i
n
d
(
)
操
作
后
,
并
没
有
触
发
漏
洞
,
此
时
可
以
尝
试
其
他
方
法
如
l
o
o
k
u
p
(
)
、
l
o
o
k
u
p
L
i
n
k
(
)
等
触
发
漏
洞
。
本
文
将
以
l
o
o
k
u
p
(
)
方
法
作
为
漏
洞
触
发
点
,
对
W
e
b
l
o
g
i
c
后
反
序
列
化
漏
洞
的
攻
击
过
程
进
行
分
析
和
漏
洞
实
例
展
示
。
03lookup
通
过
跟
踪
调
用
堆
栈
,
我
们
发
现
l
o
o
k
u
p
(
)
的
流
程
如
下
:
– W
e
b
l
o
g
i
c
在
接
收
到
请
求
后
,
通
过
B
a
s
i
c
S
e
r
v
e
r
R
e
f
类
中
的
i
n
v
o
k
e
(
)
方
法
解
析
传
入
数
据
。
-
通
过
i
n
v
o
k
e
(
)方
法
,
W
e
b
l
o
g
i
c根
据
传
入
的
方
法
名r
e
s
o
l
v
e
a
n
y执
行
的r
e
s
o
l
v
e
_
a
n
y
(
)方
法
。 -
在
r
e
s
o
l
v
e
_
a
n
y
(
)方
法
中
,
通
过r
e
s
o
l
v
e
O
b
j
e
c
t
(
)方
法
对
传
入
的
绑
定
命
名
进
行
解
析
。 -
在
r
e
s
o
l
v
e
O
b
j
e
c
t
(
)方
法
中
,
根
据
上
下
文
信
息
调
用
其
中
的l
o
o
k
u
p
(
)方
法
。 -
根
据
上
下
文
中
的
信
息
,
经
过
在W
L
C
o
n
t
e
x
t
I
m
p
l
、
W
L
E
v
e
n
t
C
o
n
t
e
x
t
I
m
p
l
、W
L
E
v
e
n
t
C
o
n
t
e
x
t
I
m
p
l、
R
o
o
t
N
a
m
i
n
g
N
o
d
e
、
S
e
r
v
e
r
N
a
m
i
n
g
N
o
d
e、
B
a
s
i
c
N
a
m
i
n
g
N
o
d
e类
中
一
系
列
的l
o
o
k
u
p
(
)方
法
调
用
,
实
现B
a
s
i
c
N
a
m
i
n
g
N
o
d
e类
中
的r
e
s
o
l
v
e
O
b
j
e
c
t
(
)方
法
调
用
。 -
由
于
传
入r
e
s
o
l
v
e
O
b
j
e
c
t
(
)方
法
中
的o
b
j不
是N
a
m
i
n
g
N
o
d
e类
的
实
例
,
且m
o
d
e的
值
默
认
为1
,
所
以
会
调
用W
L
N
a
m
i
n
g
M
a
n
a
g
e
r类
中
的g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)方
法
。
最
终
,
可
以
看
到
W
L
N
a
m
i
n
g
M
a
n
a
g
e
r
类
的
g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)
方
法
根
据
传
入
的
对
象
接
口
类
型
,
调
用
对
象
中
的
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
,
完
成
漏
洞
触
发
点
的
l
o
o
k
u
p
(
)
方
法
调
用
。
实
际
上
这
两
个
C
V
E
漏
洞
都
是
通
过
g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)
的
两
个
分
支
触
发
的
。
04CVE-2023-21931
C
V
E
–
2
0
2
3
–
2
1
9
3
1
的
漏
洞
触
发
点
在
W
L
N
a
m
i
n
g
M
a
n
a
g
e
r
类
的
g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)
方
法
中
,
当
传
入
的
b
o
u
n
d
O
b
j
e
c
t
对
象
是
L
i
n
k
R
e
f
的
实
现
类
时
,
则
调
用
传
入
对
象
b
o
u
n
d
O
b
j
e
c
t
的
g
e
t
L
i
n
k
N
a
m
e
(
)
方
法
,
并
通
过
l
o
o
k
u
p
(
)
方
法
对
g
e
t
L
i
n
k
N
a
m
e
(
)
方
法
返
回
的
l
i
n
k
A
d
d
r
T
y
p
e
地
址
进
行
远
程
J
N
D
I
加
载
。
在
实
例
化
L
i
n
k
R
e
f
类
时
,
可
以
通
过
类
中
的
构
造
方
法
给
l
i
n
k
A
d
d
r
T
y
p
e
传
入
一
个
J
N
D
I
地
址
。
这
样
,
我
们
就
可
以
调
用
l
o
o
k
u
p
(
)
方
法
对
自
定
义
的
J
N
D
I
地
址
进
行
远
程
加
载
,
达
到
攻
击
的
目
的
。
package weblogic.jndi.internal;
public final class WLNamingManager {
public static Object getObjectInstance(Object boundObject, Name name, Context ctx, Hashtable env) throws NamingException {
if (boundObject instanceof ClassTypeOpaqueReference) {
......
} else if (boundObject instanceof LinkRef) {
String linkName = ((LinkRef)boundObject).getLinkName();
InitialContext ic = null;
try {
ic = new InitialContext(env);
boundObject = ic.lookup(linkName); // 漏洞触发点
} catch (NamingException var15) {
......
} finally {......}
}
}
}
漏
洞
J
N
D
I
地
址
构
造
在
L
i
n
k
R
e
f
这
个
类
中
,
L
i
n
k
R
e
f
是
J
a
v
a
的
一
个
原
生
类
。
通
过
L
i
n
k
R
e
f
类
中
的
构
造
方
法
,
我
们
可
以
控
制
变
量
l
i
n
k
A
d
d
r
T
y
p
e
的
值
,
再
通
过
g
e
t
L
i
n
k
N
a
m
e
(
)
方
法
将
l
i
n
k
A
d
d
r
T
y
p
e
作
为
字
符
串
返
回
。
package javax.naming;
public class LinkRef extends Reference {
static final String linkClassName = LinkRef.class.getName();
static final String linkAddrType = <span data-raw-text="" "="" data-textnode-index-1681866646750="276" data-index-1681866646750="2786" data-textnode-notemoji-index-1681866646750="2786" class="character">"LinkAddress<span data-raw-text="" "="" data-textnode-index-1681866646750="276" data-index-1681866646750="2798" data-textnode-notemoji-index-1681866646750="2798" class="character">";
public LinkRef(Name linkName) {
super(linkClassName, new StringRefAddr(linkAddrType, linkName.toString()));
}
public LinkRef(String linkName) {
super(linkClassName, new StringRefAddr(linkAddrType, linkName));
}
public String getLinkName() throws NamingException {
if (className != null && className.equals(linkClassName)) {
RefAddr addr = get(linkAddrType);
if (addr != null && addr instanceof StringRefAddr) {
return (String)((StringRefAddr)addr).getContent();
}
}
throw new MalformedLinkException();
}
}
在
上
述
过
程
中
,
r
e
b
i
n
d
(
)
和
l
o
o
k
u
p
(
)
方
法
的
反
序
列
化
过
程
并
未
执
行
恶
意
操
作
,
而
是
在
完
成
反
序
列
化
之
后
,
通
过
调
用
类
W
L
N
a
m
i
n
g
M
a
n
a
g
e
r
中
g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)
方
法
的
l
o
o
k
u
p
(
)
才
触
发
漏
洞
,
进
行
远
程
恶
意
加
载
J
N
D
I
地
址
操
作
的
。
我
们
在
G
o
b
y
中
已
经
集
成
了
C
V
E
–
2
0
2
3
–
2
1
9
3
1
漏
洞
,
并
加
入
了
回
显
和
反
弹
s
h
e
l
l
的
功
能
。
演
示
效
果
如
下
:
05CVE-2023-21839
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
是
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
接
口
的
实
现
类
。
在
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
类
中
声
明
了
两
个
私
有
变
量
:
j
n
d
i
E
n
v
i
r
o
n
m
e
n
t
和
r
e
m
o
t
e
J
N
D
I
N
a
m
e
,
同
时
声
明
了
两
个
构
造
方
法
,
在
有
参
构
造
方
法
中
接
收
e
n
v
和
r
e
m
o
t
e
J
N
D
I
N
a
m
e
,
并
分
别
赋
值
给
了
上
面
的
两
个
私
有
类
变
量
。
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
类
的
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
是
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
接
口
的
实
现
方
法
,
在
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
中
,
r
e
t
V
a
l
=
c
o
n
t
e
x
t
.
l
o
o
k
u
p
(
t
h
i
s
.
r
e
m
o
t
e
J
N
D
I
N
a
m
e
)
;
对
本
类
r
e
m
o
t
e
J
N
D
I
N
a
m
e
变
量
中
的
J
N
D
I
地
址
进
行
远
程
加
载
,
导
致
了
反
序
列
化
漏
洞
。
package weblogic.jndi.internal;
public class ForeignOpaqueReference implements OpaqueReference, Serializable {
private Hashtable jndiEnvironment;
private String remoteJNDIName;
......
public ForeignOpaqueReference(String remoteJNDIName, Hashtable env) {
this.remoteJNDIName = remoteJNDIName;
this.jndiEnvironment = env;
}
public Object getReferent(Name name, Context ctx) throws NamingException {
InitialContext context;
if (this.jndiEnvironment == null) {
context = new InitialContext();
} else {
Hashtable properties = this.decrypt();
context = new InitialContext(properties);
}
Object retVal;
try {
retVal = context.lookup(this.remoteJNDIName); // 漏洞点
} finally {
context.close();
}
return retVal;
}
......
}
getReferent() 调用分析
package weblogic.jndi;
public interface OpaqueReference {
Object getReferent(Name var1, Context var2) throws NamingException;
String toString();
}
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
接
口
有
两
个
抽
象
方
法
:
g
e
t
R
e
f
e
r
e
n
t
(
)
和
t
o
S
t
r
i
n
g
(
)
;
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
类
的
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
调
用
在
W
L
N
a
m
i
n
g
M
a
n
a
g
e
r
类
中
。
在
W
L
N
a
m
i
n
g
M
a
n
a
g
e
r
类
的
g
e
t
O
b
j
e
c
t
I
n
s
t
a
n
c
e
(
)
方
法
中
,
当
传
入
的
b
o
u
n
d
O
b
j
e
c
t
对
象
实
现
了
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
接
口
时
,
则
会
调
用
该
对
象
的
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
,
即
b
o
u
n
d
O
b
j
e
c
t
=
(
(
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
)
b
o
u
n
d
O
b
j
e
c
t
)
.
g
e
t
R
e
f
e
r
e
n
t
(
n
a
m
e
,
c
t
x
)
;
。
正
如
上
方
提
到
的
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
类
实
现
了
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
接
口
,
因
此
会
调
用
该
类
中
的
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
,
导
致
反
序
列
化
代
码
执
行
漏
洞
。
package weblogic.jndi.internal;
public final class WLNamingManager {
public static Object getObjectInstance(Object boundObject, Name name, Context ctx, Hashtable env) throws NamingException {
if (boundObject instanceof ClassTypeOpaqueReference) {
......
} else if (boundObject instanceof OpaqueReference) {
boundObject = ((OpaqueReference)boundObject).getReferent(name, ctx);
} else if (boundObject instanceof LinkRef) {
...
}
}
}
C
V
E
–
2
0
2
3
–
2
1
9
3
1
漏
洞
原
理
相
同
,
C
V
E
–
2
0
2
3
–
2
1
8
3
9
也
是
在
反
序
列
化
过
程
中
没
有
进
行
恶
意
操
作
,
而
是
完
成
反
序
列
化
过
程
后
执
行
了
漏
洞
类
F
o
r
e
i
g
n
O
p
a
q
u
e
R
e
f
e
r
e
n
c
e
中
g
e
t
R
e
f
e
r
e
n
t
(
)
方
法
中
的
l
o
o
k
u
p
(
)
才
触
发
的
漏
洞
。
在
G
o
b
y
中
,
我
们
已
经
集
成
了
C
V
E
–
2
0
2
3
–
2
1
8
3
9
漏
洞
,
并
添
加
了
回
显
以
及
反
弹
S
h
e
l
l
的
功
能
。
以
下
是
演
示
效
果
:
06时间线
C
V
E
–
2
0
2
3
–
2
1
9
3
1
– 2
0
2
2
年
8
月
1
2
日
漏
洞
提
交
官
方
-
2
0
2
2年
8
月
1
9日
漏
洞
官
方
确
认 -
2
0
2
3年
4
月
1
8日
漏
洞
官
方
修
复
C
V
E
–
2
0
2
3
–
2
1
8
3
9
– 2
0
2
2
年
7
月
3
1
日
漏
洞
提
交
官
方
-
2
0
2
2年
8
月
5
日
漏
洞
官
方
确
认 -
2
0
2
3年
1
月
1
6日
漏
洞
官
方
修
复
07 研究环境
V
u
l
f
o
c
u
s
W
e
b
l
o
g
i
c
环
境
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.2.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.1.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.3.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.4.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.2.1.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:14.1.1.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.1.2.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:12.1.3.0.0-jdk-release
docker pull vulfocus/vcpe-1.0-a-oracle-weblogic:10.3.6.0-jdk-release
08参考
1
.
J
a
v
a
“
后
反
序
列
化
漏
洞
”
利
用
思
路
–
R
u
i
l
i
n
(
h
t
t
p
:
/
/
r
u
i
0
.
c
n
/
a
r
c
h
i
v
e
s
/
1
3
3
8
)
2
.
R
u
i
l
1
n
/
a
f
t
e
r
–
d
e
s
e
r
i
a
l
i
z
a
t
i
o
n
–
a
t
t
a
c
k
:
J
a
v
a
A
f
t
e
r
–
D
e
s
e
r
i
a
l
i
z
a
t
i
o
n
A
t
t
a
c
k
(
h
t
t
p
s
:
/
/
g
i
t
h
u
b
.
c
o
m
/
R
u
i
l
1
n
/
a
f
t
e
r
–
d
e
s
e
r
i
a
l
i
z
a
t
i
o
n
–
a
t
t
a
c
k
)
本文中演示的漏洞与功能适配 Goby 版本:Beta 2.4.7,已支持Goby红队版、漏扫版扫描验证。最新版本下载体验:https://gobysec.net/
最新Goby 使用技巧分享
:
•
su18 | Shell中的王者-JAVAWEB内存马【认知篇】
• su18 | Goby利用内存马的一些技术细节【技术篇】
• 14m3ta7k | 跨越语言的艺术:Weblogic序列化漏洞与IIOP协议
更
多
技
术
分
享
G
o
b
y
欢
迎
表
哥
/
表
姐
们
加
入
我
们
的
社
区
大
家
庭
,
一
起
交
流
技
术
、
生
活
趣
事
、
奇
闻
八
卦
,
结
交
无
数
白
帽
好
友
。
也
欢
迎
投
稿
到
G
o
b
y
(
G
o
b
y
介
绍
/
扫
描
/
口
令
爆
破
/
漏
洞
利
用
/
插
件
开
发
/
P
o
C
编
写
/
I
P
库
使
用
场
景
/
W
e
b
s
h
e
l
l
/
漏
洞
分
析
等
文
章
均
可
)
,
审
核
通
过
后
可
奖
励
G
o
b
y
红
队
版
,
快
来
加
入
微
信
群
体
验
吧
~
~
~
– 微
信
群
:
公
众
号
发
暗
号
“
加
群
”
,
参
与
积
分
商
城
、
抽
奖
等
众
多
有
趣
的
活
动
-
获
取
版
本
:
h
t
t
p
s
:
/
/
g
o
b
y
s
e
c
.
n
e
t
/
s
a
l
e -