致远OA rest接口重置密码漏洞分析
字数 1938 2025-08-23 18:31:09
致远OA REST接口重置密码漏洞分析与利用教学文档
漏洞概述
致远OA系统中存在一个通过REST接口重置密码的漏洞,攻击者可以利用该漏洞绕过权限验证机制,修改系统管理员等高权限用户的密码。该漏洞主要影响致远OA V7.1SP1及之前版本,官方在2023年8月发布了相关补丁。
漏洞环境
- 受影响版本:致远OA V7.1SP1及之前版本
- 补丁发布:2023年8月
- 补丁链接:致远安全补丁
技术背景
REST接口实现机制
致远OA通过Jersey框架实现REST接口,通过配置init-param参数添加过滤器类。在进入资源类之前会先进入过滤器类,校验逻辑通常写在过滤器中。
补丁工作原理
补丁通过ResourceCheckRoleAccessFilter类实现权限校验:
- 在
filter方法中,以访问资源类的类名、方法名和当前用户为参数调用RestCheckRoleAccessManagerImpl的checkRole方法 - 验证用户是否具有访问权限,无权限则抛出异常
- 权限配置在
checkRoleAccessInfo.properties文件中
漏洞细节
密码修改接口
MemberResource.class中的changePassword方法可通过指定memberid和password参数修改用户密码。
系统内置用户ID
致远OA中存在一些内置用户,其memberid固定:
- seeyon-guest: -6964000252392685202
- system: -7273032013234748168
- audit-admin: -4401606663639775639
- group-admin: 5725175934914479521
正常REST接口认证流程
- 登录系统管理员账号创建REST用户
- 通过
/seeyon/rest/token/{restusername}/{password}接口获取token - 使用token调用
/seeyon/rest/orgMember/{id}/password/{password}修改密码
权限校验机制
CTPSecurityFilter.class的doFilter方法根据URI特征有7种校验方式:
- 当URI前缀为
/seeyon/rest/时,调用RestAuthenticator.class的authenticate方法- 仅支持token认证,不允许使用Session
- 当URI后缀为
.do或.do;jessionid=时,进入SpringControllerAuthenticator的authenticate方法
漏洞利用
权限绕过方法
通过构造特殊URI使REST请求走SpringController验证:
- 原始REST接口:
/seeyon/rest/orgMember/-7273032013234748168/password/123456 - 修改为:
/seeyon/rest/orgMember/-7273032013234748168/password/123456.do
或
/seeyon/rest/orgMember/-7273032013234748168/password/123456.do;jessionid=
这样请求会进入SpringControllerAuthenticator的验证逻辑,仅需普通用户权限即可修改管理员密码。
武器化利用思路
- 权限提升:利用管理员权限为普通用户赋予特殊权限
- RCE利用:调用需要高权限的RCE接口
- 后门创建:使用管理员权限创建隐蔽的普通用户账号
修复方案
致远OA 8.2及之后版本在CTPSecurityFilter.class中:
- 除验证URI路径以
.do结尾外 - 额外验证该URI是否为REST接口
- 限制普通用户通过SpringController验证逻辑访问REST接口
漏洞复现步骤
- 获取目标系统内置用户ID(如system用户的-7273032013234748168)
- 构造恶意请求URL:
/seeyon/rest/orgMember/-7273032013234748168/password/123456.do - 使用任意普通用户权限发送请求
- 验证system用户密码是否被修改为123456
防御建议
- 及时升级到致远OA 8.2或更高版本
- 应用官方发布的安全补丁
- 限制REST接口的访问权限
- 监控系统日志中的异常密码修改行为
总结
该漏洞通过精心构造的URL路径绕过REST接口的严格权限验证,利用SpringController较宽松的验证机制实现权限提升。漏洞利用门槛低但危害大,可导致系统完全被控制。管理员应及时采取防护措施,避免系统遭受攻击。