o2oa<=v9.1.3 前台RCE
字数 1726 2025-08-29 08:30:24

O2OA v9.1.3及以下版本安全漏洞分析与利用指南

一、系统权限认证分析

1.1 权限控制机制

  • 系统使用@WebFilter注解拦截路径进入相应的Filter
  • 关键Filter类:
    • AnonymousCipherManagerUserJaxrsFilter
    • CipherManagerJaxrsFilter
    • CipherManagerUserJaxrsFilter

1.2 认证流程

  • 上述Filter会调用HttpTokenwho函数验证token有效性
  • 所有带有@WebFilter注解的类都继承自上述三个Filter之一
  • 权限绕过不可行,只能寻找未授权接口

1.3 未授权接口发现方法

  • 查找@path注解的路径不在@WebFilter拦截范围内的接口
  • 注意:接口需在api.jsondescribe.json中才能访问

二、漏洞一:前台RCE利用Socket(CVE-XXXX-XXXX)

2.1 漏洞原理

  • 20010端口无鉴权接收加密数据
  • 加密密钥硬编码在源码中
  • NodeAgent类的run函数监听20010端口
  • 通过socket传输数据时缺乏安全措施

2.2 利用步骤

2.2.1 未授权文件上传

  1. 构造恶意Main.java文件
  2. 设置syncFile参数
  3. 利用路径穿越(如../)指定上传位置
  4. 使用固定密钥加密数据发送到20010端口

2.2.2 获取Shell

  • Linux系统:上传SSH公钥到~/.ssh/authorized_keys
  • 使用对应私钥连接服务器

2.2.3 进阶利用:未授权命令执行

  1. 利用version命令查看服务器版本
  2. 使用ctl -rst <参数>重新加载war包
    • 先上传恶意war包
    • 执行ctl -rst重新加载服务

2.3 漏洞分析

  • execute_command_pattern处理接收的命令
  • 匹配到ctl命令后执行action.execute(args)
  • 执行流程:
    1. 暂停目标服务
    2. 加载恶意war资源
    3. 使用JarResource.newJarResource(base).copyTo(dir)释放war包
    4. 通过app.start()启动服务,触发恶意代码

2.4 内存马注入

  • 参考Jetty内存马注入技术
  • 可构造持久化后门

三、漏洞二:后台RCE利用GraalVM(CVE-XXXX-XXXX)

3.1 初始密码配置处RCE

3.1.1 利用步骤

  1. 进入"系统配置-安全配置-密码配置"
  2. 选择"通过脚本自定义初始密码"
  3. 插入恶意JS代码
  4. 在"组织管理-个人管理"中新增用户
  5. 保存人员信息触发RCE

3.1.2 技术分析

  • PersonAction.execute()获取密码规则
  • 将JS规则传给initPassword
  • 执行evalAsString最终调用eval
  • GraalVM上下文配置:
    • allowHostClassLoading=true(允许加载Java类)
    • 通过allowHostClassLookup::allowClass设置类黑名单

3.1.3 绕过黑名单

  • 使用java.net.URLClassLoader加载本地资源
  • 结合反射技术执行命令

3.2 其他JS执行点

3.2.1 服务管理-代码配置

  1. 进入"服务管理"
  2. 点击"代码配置-新建代理"
  3. 插入恶意JS:
var u = Java.type('java.net.URLClassLoader');
r = u.getSystemClassLoader().loadClass("java.lang.Runtime");
g = r.getMethod('getRuntime').invoke(null).exec("calc.exe");
  1. 保存后通过定时任务执行

3.2.2 数据中心管理

  1. 进入"数据中心管理"
  2. 新建应用并编辑
  3. 点击"查询配置-新建"
  4. 编写原生SQL脚本触发命令执行

四、潜在漏洞点

4.1 SQL注入

  • 实际环境可能使用非H2数据库
  • 需根据具体数据库类型构造Payload

4.2 JDBC配置

  • 可配置JDBC连接
  • 需要重启服务才能生效(利用受限)

五、防护建议

  1. 升级到最新版本
  2. 限制20010端口访问
  3. 修改默认加密密钥
  4. 加强输入验证,特别是JS执行点
  5. 实施最小权限原则

六、参考资源

  1. GraalVM安全文档
  2. Jetty内存马技术分析
  3. O2OA官方安全公告

注:实际利用时请遵守法律法规,仅在授权测试环境中验证漏洞。本文档仅用于安全研究目的。

O2OA v9.1.3及以下版本安全漏洞分析与利用指南 一、系统权限认证分析 1.1 权限控制机制 系统使用 @WebFilter 注解拦截路径进入相应的Filter 关键Filter类: AnonymousCipherManagerUserJaxrsFilter CipherManagerJaxrsFilter CipherManagerUserJaxrsFilter 1.2 认证流程 上述Filter会调用 HttpToken 的 who 函数验证token有效性 所有带有 @WebFilter 注解的类都继承自上述三个Filter之一 权限绕过不可行,只能寻找未授权接口 1.3 未授权接口发现方法 查找 @path 注解的路径不在 @WebFilter 拦截范围内的接口 注意:接口需在 api.json 或 describe.json 中才能访问 二、漏洞一:前台RCE利用Socket(CVE-XXXX-XXXX) 2.1 漏洞原理 20010端口无鉴权接收加密数据 加密密钥硬编码在源码中 NodeAgent 类的 run 函数监听20010端口 通过 socket 传输数据时缺乏安全措施 2.2 利用步骤 2.2.1 未授权文件上传 构造恶意 Main.java 文件 设置 syncFile 参数 利用路径穿越(如 ../ )指定上传位置 使用固定密钥加密数据发送到20010端口 2.2.2 获取Shell Linux系统:上传SSH公钥到 ~/.ssh/authorized_keys 使用对应私钥连接服务器 2.2.3 进阶利用:未授权命令执行 利用 version 命令查看服务器版本 使用 ctl -rst <参数> 重新加载war包 先上传恶意war包 执行 ctl -rst 重新加载服务 2.3 漏洞分析 execute_command_pattern 处理接收的命令 匹配到 ctl 命令后执行 action.execute(args) 执行流程: 暂停目标服务 加载恶意war资源 使用 JarResource.newJarResource(base).copyTo(dir) 释放war包 通过 app.start() 启动服务,触发恶意代码 2.4 内存马注入 参考Jetty内存马注入技术 可构造持久化后门 三、漏洞二:后台RCE利用GraalVM(CVE-XXXX-XXXX) 3.1 初始密码配置处RCE 3.1.1 利用步骤 进入"系统配置-安全配置-密码配置" 选择"通过脚本自定义初始密码" 插入恶意JS代码 在"组织管理-个人管理"中新增用户 保存人员信息触发RCE 3.1.2 技术分析 PersonAction.execute() 获取密码规则 将JS规则传给 initPassword 执行 evalAsString 最终调用 eval GraalVM上下文配置: allowHostClassLoading=true (允许加载Java类) 通过 allowHostClassLookup::allowClass 设置类黑名单 3.1.3 绕过黑名单 使用 java.net.URLClassLoader 加载本地资源 结合反射技术执行命令 3.2 其他JS执行点 3.2.1 服务管理-代码配置 进入"服务管理" 点击"代码配置-新建代理" 插入恶意JS: 保存后通过定时任务执行 3.2.2 数据中心管理 进入"数据中心管理" 新建应用并编辑 点击"查询配置-新建" 编写原生SQL脚本触发命令执行 四、潜在漏洞点 4.1 SQL注入 实际环境可能使用非H2数据库 需根据具体数据库类型构造Payload 4.2 JDBC配置 可配置JDBC连接 需要重启服务才能生效(利用受限) 五、防护建议 升级到最新版本 限制20010端口访问 修改默认加密密钥 加强输入验证,特别是JS执行点 实施最小权限原则 六、参考资源 GraalVM安全文档 Jetty内存马技术分析 O2OA官方安全公告 注:实际利用时请遵守法律法规,仅在授权测试环境中验证漏洞。本文档仅用于安全研究目的。