致远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类实现权限校验:

  1. filter方法中,以访问资源类的类名、方法名和当前用户为参数调用RestCheckRoleAccessManagerImplcheckRole方法
  2. 验证用户是否具有访问权限,无权限则抛出异常
  3. 权限配置在checkRoleAccessInfo.properties文件中

漏洞细节

密码修改接口

MemberResource.class中的changePassword方法可通过指定memberidpassword参数修改用户密码。

系统内置用户ID

致远OA中存在一些内置用户,其memberid固定:

  • seeyon-guest: -6964000252392685202
  • system: -7273032013234748168
  • audit-admin: -4401606663639775639
  • group-admin: 5725175934914479521

正常REST接口认证流程

  1. 登录系统管理员账号创建REST用户
  2. 通过/seeyon/rest/token/{restusername}/{password}接口获取token
  3. 使用token调用/seeyon/rest/orgMember/{id}/password/{password}修改密码

权限校验机制

CTPSecurityFilter.classdoFilter方法根据URI特征有7种校验方式:

  1. 当URI前缀为/seeyon/rest/时,调用RestAuthenticator.classauthenticate方法
    • 仅支持token认证,不允许使用Session
  2. 当URI后缀为.do.do;jessionid=时,进入SpringControllerAuthenticatorauthenticate方法

漏洞利用

权限绕过方法

通过构造特殊URI使REST请求走SpringController验证:

  1. 原始REST接口:/seeyon/rest/orgMember/-7273032013234748168/password/123456
  2. 修改为:/seeyon/rest/orgMember/-7273032013234748168/password/123456.do

    /seeyon/rest/orgMember/-7273032013234748168/password/123456.do;jessionid=

这样请求会进入SpringControllerAuthenticator的验证逻辑,仅需普通用户权限即可修改管理员密码。

武器化利用思路

  1. 权限提升:利用管理员权限为普通用户赋予特殊权限
  2. RCE利用:调用需要高权限的RCE接口
  3. 后门创建:使用管理员权限创建隐蔽的普通用户账号

修复方案

致远OA 8.2及之后版本在CTPSecurityFilter.class中:

  1. 除验证URI路径以.do结尾外
  2. 额外验证该URI是否为REST接口
  3. 限制普通用户通过SpringController验证逻辑访问REST接口

漏洞复现步骤

  1. 获取目标系统内置用户ID(如system用户的-7273032013234748168)
  2. 构造恶意请求URL:
    /seeyon/rest/orgMember/-7273032013234748168/password/123456.do
    
  3. 使用任意普通用户权限发送请求
  4. 验证system用户密码是否被修改为123456

防御建议

  1. 及时升级到致远OA 8.2或更高版本
  2. 应用官方发布的安全补丁
  3. 限制REST接口的访问权限
  4. 监控系统日志中的异常密码修改行为

总结

该漏洞通过精心构造的URL路径绕过REST接口的严格权限验证,利用SpringController较宽松的验证机制实现权限提升。漏洞利用门槛低但危害大,可导致系统完全被控制。管理员应及时采取防护措施,避免系统遭受攻击。

致远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: 使用任意普通用户权限发送请求 验证system用户密码是否被修改为123456 防御建议 及时升级到致远OA 8.2或更高版本 应用官方发布的安全补丁 限制REST接口的访问权限 监控系统日志中的异常密码修改行为 总结 该漏洞通过精心构造的URL路径绕过REST接口的严格权限验证,利用SpringController较宽松的验证机制实现权限提升。漏洞利用门槛低但危害大,可导致系统完全被控制。管理员应及时采取防护措施,避免系统遭受攻击。