信呼OA分析+0day挖掘思路与实操
字数 2191 2025-09-01 11:26:03

信呼OA系统安全分析与0day挖掘实战指南

1. 信呼OA系统概述

信呼OA(信呼办公自动化系统)是一款基于PHP+MySQL开发的开源协同办公系统,主要面向中小型企业、政府机构及组织,提供一体化的办公管理解决方案。

系统特点

  • 简洁易用
  • 功能全面
  • 高性价比
  • 支持二次开发
  • 适合多种办公场景需求

环境搭建

  1. 官网下载最新版:http://www.rockoa.com/
  2. 使用小皮面板(或其他PHP环境)部署
  3. 访问对应端口,按照安装教程创建数据库完成安装

2. 代码审计基础

2.1 路由分析

入口文件index.php分析

  1. 引入配置文件和定义路由参数初始值
  2. 两种路由模式处理
  3. 检测是否安装和导入view文件(视图)

View.php核心路由处理

  1. 路由参数获取

    • 设置$ajaxbool变量默认为false,有传参则覆盖
    • $p = PROJECT(值为webmain)
    • 设置默认模块、操作、数据参数,有get传参则覆盖
    • 处理多目录情况:$m若有|则分割为数组,分别赋值给$m$_m
  2. 路由规则和方法调用

    • 构建文件路径:项目绝对路径/webmain/$d/$_m
    • 考虑两种文件结构:
      • 多目录情况:$actpath = 项目绝对路径/webmain/$d/$_m/$mAction.php
      • 同模块名文件:$actfile1 = 项目绝对路径/webmain/$d/$_m/$_mAction.php
    • 文件存在则包含,构建对应模块class并实例化
    • 鉴权在此处触发
    • 方法调用:$ajaxbool为false调用$a+Action方法,为true调用$a+Ajax方法
  3. 模板文件调用:前端文件处理

路由构造示例

  1. 调用webmain/main/xinhu/xinhuAction.php中的setsaveAjax()方法:
    index.php?d=main&m=xinhu&a=setsave&ajaxbool=true
    
  2. 调用webmain/task/api/agentAction.php中的dataAction()方法:
    index.php?d=task&m=agent|api&a=data
    

2.2 传参分析

参数处理流程

  1. $rock->get()方法封装在config/config.php
  2. get方法参数:name(必需), dev(默认空), lx(默认0)

get方法处理流程

  1. 解密部分:

    • 判断$lx值(1,3,5)进行对应解密
    • 加密字符串结构:5部分用数字0分隔(如ab0cd0ef0gh01)
    • 判断字符串开头是否为rockjm_basejm决定解密方式
  2. 内容检测部分:

    • 过滤'%20(防注入)
    • $lx=2时进行字符替换
    • 遍历lvlaras数组检测危险字符
    • 对特定参数名(m,a,p等)进行XSS检测

绕过过滤的思路

  1. 硬刚过滤规则
  2. 寻找不使用封装方法的传参点(如php://input, $_cookie)
  3. 利用加密字符串绕过字符检测(关注参数解密处理点)

2.3 鉴权分析

鉴权机制

  1. 代码架构采用类继承,顶级父类为mainAction
  2. 关键鉴权方法在__construct()魔术方法中
  3. 实际鉴权代码在继承类Action
  4. 触发流程:实例化→__construct()initProject()initAction()getlogin()logincheck()

类方法重写机制

  • PHP允许子类重写父类方法
  • 实例化时会优先检查当前类是否有initProject()initAction()方法
  • 若无则向上查找父类实现

未授权接口判断

  • 检查实例化的class到父类Action之间是否有重写initProject()initAction()方法
  • 关注重写方法中是否包含鉴权代码

3. 0day挖掘实战

3.1 SQL注入审计思路

传统方法局限

  • 底层SQL查询方法封装在include/class/mysql.php
  • 多数查询直接拼接但传参处有过滤

高效审计方法

  1. 关注参数接收后解密/解码处理点
  2. 检查解密后数据是否直接带入SQL查询
  3. 寻找不使用封装过滤方法的传参点

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 扩展挖掘方向

  1. 搜索其他使用base64_decode处理的参数接收点
  2. 检查不使用$rock->get()的参数获取方式
  3. 分析加密字符串生成机制,尝试构造有效加密payload
  4. 关注类方法重写中的鉴权缺失情况

4. 总结

信呼OA系统的安全审计需要特别关注:

  1. 复杂路由机制下的入口点定位
  2. 多层封装的参数过滤绕过
  3. 类继承体系中的鉴权重写
  4. 加密/编码参数的处理流程

通过系统性地分析路由、传参和鉴权机制,结合特定漏洞模式的快速定位,可以高效发现系统中的安全漏洞。

信呼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() 方法: 调用 webmain/task/api/agentAction.php 中的 dataAction() 方法: 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: 案例2 : 文件: webmain/system/table/tableAction.php 方法: savedbupurlAjax() 漏洞点:接收base64加密字符串绕过过滤,带入 setval 方法 POC: 3.3 扩展挖掘方向 搜索其他使用 base64_decode 处理的参数接收点 检查不使用 $rock->get() 的参数获取方式 分析加密字符串生成机制,尝试构造有效加密payload 关注类方法重写中的鉴权缺失情况 4. 总结 信呼OA系统的安全审计需要特别关注: 复杂路由机制下的入口点定位 多层封装的参数过滤绕过 类继承体系中的鉴权重写 加密/编码参数的处理流程 通过系统性地分析路由、传参和鉴权机制,结合特定漏洞模式的快速定位,可以高效发现系统中的安全漏洞。