Weblogic CVE-2023-21931 漏洞挖掘技巧:后反序列化利用
字数 1526 2025-08-24 16:48:07
Weblogic后反序列化漏洞挖掘与利用技术分析
概述
Weblogic反序列化漏洞研究近年来主要集中在反序列化触发点的挖掘上,但实际上还存在许多"后反序列化"漏洞点。这类漏洞在反序列化过程中并不直接触发,而是在后续操作中完成利用。本文以CVE-2023-21931和CVE-2023-21839为例,详细分析后反序列化漏洞的挖掘思路和利用技巧。
后反序列化漏洞概念
传统反序列化漏洞
- 利用
readObject()、readResolve()、readExternal()等反序列化方法操作恶意序列化数据 - 关注点在反序列化过程中的恶意攻击
后反序列化漏洞
- 关注反序列化完成后的操作
- 在达到特定时机或执行特定操作后触发漏洞
- 典型场景:
bind()或rebind()操作后未触发漏洞,但通过lookup()、lookupLink()等方法可触发
lookup方法触发流程分析
Weblogic中lookup()方法的调用堆栈:
BasicServerRef.invoke()解析传入数据_invoke()根据方法名resolve_any调用resolve_any()方法resolve_any()通过resolveObject()解析绑定命名resolveObject()根据上下文调用lookup()- 经过
WLContextImpl、WLEventContextImpl、RootNamingNode、ServerNamingNode、BasicNamingNode等一系列lookup()调用 - 最终在
BasicNamingNode.resolveObject()中调用WLNamingManager.getObjectInstance() getObjectInstance()根据对象接口类型调用getReferent()完成漏洞触发
CVE-2023-21931漏洞分析
漏洞触发点
位于WLNamingManager.getObjectInstance()方法中,当传入的boundObject是LinkRef实现类时:
public static Object getObjectInstance(Object boundObject, Name name, Context ctx, Hashtable env)
throws NamingException {
if (boundObject instanceof LinkRef) {
String linkName = ((LinkRef)boundObject).getLinkName();
InitialContext ic = null;
try {
ic = new InitialContext(env);
boundObject = ic.lookup(linkName); // 漏洞触发点
} catch (NamingException var15) {
// ...
}
}
}
漏洞利用关键
LinkRef类构造方法可控制linkAddrType变量值,通过getLinkName()返回该值:
public class LinkRef extends Reference {
static final String linkAddrType = "LinkAddress";
public LinkRef(String linkName) {
super(linkClassName, new StringRefAddr(linkAddrType, linkName));
}
public String getLinkName() throws NamingException {
RefAddr addr = get(linkAddrType);
if (addr != null && addr instanceof StringRefAddr) {
return (String)((StringRefAddr)addr).getContent();
}
throw new MalformedLinkException();
}
}
利用过程
- 通过
LinkRef构造方法设置恶意JNDI地址 - 完成反序列化后,
getObjectInstance()调用lookup()加载该地址 - 实现远程恶意JNDI加载
CVE-2023-21839漏洞分析
漏洞类分析
ForeignOpaqueReference实现了OpaqueReference接口:
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 = new InitialContext(this.jndiEnvironment);
Object retVal;
try {
retVal = context.lookup(this.remoteJNDIName); // 漏洞点
} finally {
context.close();
}
return retVal;
}
}
触发流程
WLNamingManager.getObjectInstance()检测到OpaqueReference实现类- 调用
getReferent()方法 ForeignOpaqueReference.getReferent()中的lookup()加载恶意JNDI地址
漏洞利用演示
研究环境
可使用Vulfocus提供的Weblogic环境:
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
利用工具
- GOBY已集成这两个漏洞的利用,支持回显和反弹Shell功能
防御建议
- 及时更新Weblogic到安全版本
- 限制不必要的JNDI远程访问
- 监控网络中的异常JNDI请求
- 使用安全产品检测反序列化攻击行为
总结
后反序列化漏洞挖掘思路突破了传统反序列化漏洞的局限,通过分析反序列化后的操作流程发现新的攻击面。这种思路可应用于其他存在类似场景的中间件和框架,未来可能会有更多此类漏洞被发现。