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()方法的调用堆栈:

  1. BasicServerRef.invoke()解析传入数据
  2. _invoke()根据方法名resolve_any调用resolve_any()方法
  3. resolve_any()通过resolveObject()解析绑定命名
  4. resolveObject()根据上下文调用lookup()
  5. 经过WLContextImplWLEventContextImplRootNamingNodeServerNamingNodeBasicNamingNode等一系列lookup()调用
  6. 最终在BasicNamingNode.resolveObject()中调用WLNamingManager.getObjectInstance()
  7. getObjectInstance()根据对象接口类型调用getReferent()完成漏洞触发

CVE-2023-21931漏洞分析

漏洞触发点

位于WLNamingManager.getObjectInstance()方法中,当传入的boundObjectLinkRef实现类时:

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();
    }
}

利用过程

  1. 通过LinkRef构造方法设置恶意JNDI地址
  2. 完成反序列化后,getObjectInstance()调用lookup()加载该地址
  3. 实现远程恶意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;
    }
}

触发流程

  1. WLNamingManager.getObjectInstance()检测到OpaqueReference实现类
  2. 调用getReferent()方法
  3. 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功能

防御建议

  1. 及时更新Weblogic到安全版本
  2. 限制不必要的JNDI远程访问
  3. 监控网络中的异常JNDI请求
  4. 使用安全产品检测反序列化攻击行为

总结

后反序列化漏洞挖掘思路突破了传统反序列化漏洞的局限,通过分析反序列化后的操作流程发现新的攻击面。这种思路可应用于其他存在类似场景的中间件和框架,未来可能会有更多此类漏洞被发现。

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 实现类时: 漏洞利用关键 LinkRef 类构造方法可控制 linkAddrType 变量值,通过 getLinkName() 返回该值: 利用过程 通过 LinkRef 构造方法设置恶意JNDI地址 完成反序列化后, getObjectInstance() 调用 lookup() 加载该地址 实现远程恶意JNDI加载 CVE-2023-21839漏洞分析 漏洞类分析 ForeignOpaqueReference 实现了 OpaqueReference 接口: 触发流程 WLNamingManager.getObjectInstance() 检测到 OpaqueReference 实现类 调用 getReferent() 方法 ForeignOpaqueReference.getReferent() 中的 lookup() 加载恶意JNDI地址 漏洞利用演示 研究环境 可使用Vulfocus提供的Weblogic环境: 利用工具 GOBY已集成这两个漏洞的利用,支持回显和反弹Shell功能 防御建议 及时更新Weblogic到安全版本 限制不必要的JNDI远程访问 监控网络中的异常JNDI请求 使用安全产品检测反序列化攻击行为 总结 后反序列化漏洞挖掘思路突破了传统反序列化漏洞的局限,通过分析反序列化后的操作流程发现新的攻击面。这种思路可应用于其他存在类似场景的中间件和框架,未来可能会有更多此类漏洞被发现。