o2oa<=v9.1.3 前台RCE
字数 1726 2025-08-29 08:30:24
O2OA v9.1.3及以下版本安全漏洞分析与利用指南
一、系统权限认证分析
1.1 权限控制机制
- 系统使用
@WebFilter注解拦截路径进入相应的Filter - 关键Filter类:
AnonymousCipherManagerUserJaxrsFilterCipherManagerJaxrsFilterCipherManagerUserJaxrsFilter
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:
var u = Java.type('java.net.URLClassLoader');
r = u.getSystemClassLoader().loadClass("java.lang.Runtime");
g = r.getMethod('getRuntime').invoke(null).exec("calc.exe");
- 保存后通过定时任务执行
3.2.2 数据中心管理
- 进入"数据中心管理"
- 新建应用并编辑
- 点击"查询配置-新建"
- 编写原生SQL脚本触发命令执行
四、潜在漏洞点
4.1 SQL注入
- 实际环境可能使用非H2数据库
- 需根据具体数据库类型构造Payload
4.2 JDBC配置
- 可配置JDBC连接
- 需要重启服务才能生效(利用受限)
五、防护建议
- 升级到最新版本
- 限制20010端口访问
- 修改默认加密密钥
- 加强输入验证,特别是JS执行点
- 实施最小权限原则
六、参考资源
- GraalVM安全文档
- Jetty内存马技术分析
- O2OA官方安全公告
注:实际利用时请遵守法律法规,仅在授权测试环境中验证漏洞。本文档仅用于安全研究目的。