信呼OA分析+0day挖掘思路与实操
字数 2191 2025-09-01 11:26:03
信呼OA系统安全分析与0day挖掘实战指南
1. 信呼OA系统概述
信呼OA(信呼办公自动化系统)是一款基于PHP+MySQL开发的开源协同办公系统,主要面向中小型企业、政府机构及组织,提供一体化的办公管理解决方案。
系统特点:
- 简洁易用
- 功能全面
- 高性价比
- 支持二次开发
- 适合多种办公场景需求
环境搭建:
- 官网下载最新版:http://www.rockoa.com/
- 使用小皮面板(或其他PHP环境)部署
- 访问对应端口,按照安装教程创建数据库完成安装
2. 代码审计基础
2.1 路由分析
入口文件index.php分析:
- 引入配置文件和定义路由参数初始值
- 两种路由模式处理
- 检测是否安装和导入view文件(视图)
View.php核心路由处理:
-
路由参数获取:
- 设置
$ajaxbool变量默认为false,有传参则覆盖 $p = PROJECT(值为webmain)- 设置默认模块、操作、数据参数,有get传参则覆盖
- 处理多目录情况:
$m若有|则分割为数组,分别赋值给$m和$_m
- 设置
-
路由规则和方法调用:
- 构建文件路径:
项目绝对路径/webmain/$d/$_m - 考虑两种文件结构:
- 多目录情况:
$actpath = 项目绝对路径/webmain/$d/$_m/$mAction.php - 同模块名文件:
$actfile1 = 项目绝对路径/webmain/$d/$_m/$_mAction.php
- 多目录情况:
- 文件存在则包含,构建对应模块class并实例化
- 鉴权在此处触发
- 方法调用:
$ajaxbool为false调用$a+Action方法,为true调用$a+Ajax方法
- 构建文件路径:
-
模板文件调用:前端文件处理
路由构造示例:
- 调用
webmain/main/xinhu/xinhuAction.php中的setsaveAjax()方法:index.php?d=main&m=xinhu&a=setsave&ajaxbool=true - 调用
webmain/task/api/agentAction.php中的dataAction()方法:index.php?d=task&m=agent|api&a=data
2.2 传参分析
参数处理流程:
$rock->get()方法封装在config/config.php中get方法参数:name(必需),dev(默认空),lx(默认0)
get方法处理流程:
-
解密部分:
- 判断
$lx值(1,3,5)进行对应解密 - 加密字符串结构:5部分用数字0分隔(如
ab0cd0ef0gh01) - 判断字符串开头是否为
rockjm_或basejm决定解密方式
- 判断
-
内容检测部分:
- 过滤
'和%20(防注入) $lx=2时进行字符替换- 遍历
lvlaras数组检测危险字符 - 对特定参数名(
m,a,p等)进行XSS检测
- 过滤
绕过过滤的思路:
- 硬刚过滤规则
- 寻找不使用封装方法的传参点(如
php://input,$_cookie) - 利用加密字符串绕过字符检测(关注参数解密处理点)
2.3 鉴权分析
鉴权机制:
- 代码架构采用类继承,顶级父类为
mainAction - 关键鉴权方法在
__construct()魔术方法中 - 实际鉴权代码在继承类
Action中 - 触发流程:实例化→
__construct()→initProject()→initAction()→getlogin()→logincheck()
类方法重写机制:
- PHP允许子类重写父类方法
- 实例化时会优先检查当前类是否有
initProject()和initAction()方法 - 若无则向上查找父类实现
未授权接口判断:
- 检查实例化的class到父类
Action之间是否有重写initProject()和initAction()方法 - 关注重写方法中是否包含鉴权代码
3. 0day挖掘实战
3.1 SQL注入审计思路
传统方法局限:
- 底层SQL查询方法封装在
include/class/mysql.php - 多数查询直接拼接但传参处有过滤
高效审计方法:
- 关注参数接收后解密/解码处理点
- 检查解密后数据是否直接带入SQL查询
- 寻找不使用封装过滤方法的传参点
3.2 实战案例
案例1:
- 文件:
webmain/flow/input/inputAction.php - 方法:
getselectdataAjax() - 漏洞点:接收base64加密字符串绕过过滤,直接带入
sqlstore方法 - POC:
xinhu_city,id,admin|database() --
案例2:
- 文件:
webmain/system/table/tableAction.php - 方法:
savedbupurlAjax() - 漏洞点:接收base64加密字符串绕过过滤,带入
setval方法 - POC:
123' where `num`='dbupurl' or if(1=1,sleep(0.01),0) -- 123
3.3 扩展挖掘方向
- 搜索其他使用
base64_decode处理的参数接收点 - 检查不使用
$rock->get()的参数获取方式 - 分析加密字符串生成机制,尝试构造有效加密payload
- 关注类方法重写中的鉴权缺失情况
4. 总结
信呼OA系统的安全审计需要特别关注:
- 复杂路由机制下的入口点定位
- 多层封装的参数过滤绕过
- 类继承体系中的鉴权重写
- 加密/编码参数的处理流程
通过系统性地分析路由、传参和鉴权机制,结合特定漏洞模式的快速定位,可以高效发现系统中的安全漏洞。