php代码审计篇 - 信呼OA 前台注入分析一
字数 1328 2025-08-29 22:41:32

信呼OA v2.6.7 SQL注入漏洞分析与利用

系统介绍

信呼OA是一款企业办公自动化系统,官网地址:http://www.rockoa.com

路由分析

信呼OA的路由结构如下:

  • a参数:表示方法
  • m参数:表示目录
  • 如果有多层目录,d表示最外层目录
  • m参数格式:文件名|目录

漏洞点一分析

漏洞位置

webmain/task/openapi/opendkqAction.php文件中的addkqjs方法

漏洞分析流程

  1. 漏洞入口

    • addkqjs方法调用了insert方法
    • 跟踪insert方法发现传入的值被直接拼接到SQL语句中执行
  2. 调用链分析

    • senddata方法调用了addkqjs方法
    • $sn参数通过arrvalue方法从传入的第一参数中获取sn键的值
  3. 触发条件

    • $type必须等于9
    • $rs来自$arr的value
    • $arr来自JSON解码后的$str
    • $str来自POST请求体,完全可控
  4. 调用路径

    • zktimeAction调用了senddata方法并传入9,满足$type=9的条件
  5. 权限绕过

    • 父类中存在鉴权,但只需Host为127.0.0.1192.168.x.x即可绕过

漏洞利用

  1. 构造请求URL

    /index.php?m=opendkq|openapi&d=task&a=zktime
    
  2. 构造payload

    • 需要构造两层JSON
    • Host头设置为127.0.0.1
  3. 自动化工具利用

    • 使用sqlmap结合Burp Suite
    • 修改Host头绕过IP限制

漏洞点二分析

漏洞位置

webmain/task/openapi/openbaseAction.php文件

漏洞分析流程

  1. 参数处理

    • getpostarr()方法要求POST值为JSON格式
    • basemodenum参数赋值给$modenum
    • baseoptid参数赋值给$adminid(经过过滤,无法传入单引号等特殊字符)
  2. 关键验证

    • 21行调用getuserid方法查询$adminid
    • 22行检查查询结果,若无数据则报错终止
    • 最简单方式是传入adminid=1(已知存在的ID)
  3. 注入点分析

    • querydata方法接收三个参数
    • $modenum(即$num)传入initflow方法
    • initflow方法又将其传入initdata方法
    • $num最终被拼接到SQL条件语句中执行,无任何限制

漏洞利用

  1. 构造请求

    • POST请求体为JSON格式
    • 包含basemodenumbaseoptid参数
    • baseoptid设置为已知存在的ID(如1)
  2. 注入payload

    • 通过basemodenum参数构造SQL注入语句

总结

漏洞共性

  1. 两个漏洞都存在IP限制(需本地或内网IP)
  2. 都涉及JSON格式数据处理
  3. 都因参数直接拼接SQL语句导致注入

防护建议

  1. 对所有输入参数进行严格过滤和类型检查
  2. 使用预编译语句或ORM框架
  3. 加强权限验证,不能仅依赖IP限制
  4. 对JSON输入进行严格验证

利用要点

  1. 必须修改Host头绕过IP限制
  2. 注意请求参数格式(JSON)
  3. 部分参数需要构造特定值才能触发漏洞路径
信呼OA v2.6.7 SQL注入漏洞分析与利用 系统介绍 信呼OA是一款企业办公自动化系统,官网地址:http://www.rockoa.com 路由分析 信呼OA的路由结构如下: a 参数:表示方法 m 参数:表示目录 如果有多层目录, d 表示最外层目录 m 参数格式: 文件名|目录 漏洞点一分析 漏洞位置 webmain/task/openapi/opendkqAction.php 文件中的 addkqjs 方法 漏洞分析流程 漏洞入口 : addkqjs 方法调用了 insert 方法 跟踪 insert 方法发现传入的值被直接拼接到SQL语句中执行 调用链分析 : senddata 方法调用了 addkqjs 方法 $sn 参数通过 arrvalue 方法从传入的第一参数中获取 sn 键的值 触发条件 : $type 必须等于9 $rs 来自 $arr 的value $arr 来自JSON解码后的 $str $str 来自POST请求体,完全可控 调用路径 : zktimeAction 调用了 senddata 方法并传入9,满足 $type=9 的条件 权限绕过 : 父类中存在鉴权,但只需Host为 127.0.0.1 或 192.168.x.x 即可绕过 漏洞利用 构造请求URL : 构造payload : 需要构造两层JSON Host头设置为 127.0.0.1 自动化工具利用 : 使用sqlmap结合Burp Suite 修改Host头绕过IP限制 漏洞点二分析 漏洞位置 webmain/task/openapi/openbaseAction.php 文件 漏洞分析流程 参数处理 : getpostarr() 方法要求POST值为JSON格式 basemodenum 参数赋值给 $modenum baseoptid 参数赋值给 $adminid (经过过滤,无法传入单引号等特殊字符) 关键验证 : 21行调用 getuserid 方法查询 $adminid 22行检查查询结果,若无数据则报错终止 最简单方式是传入 adminid=1 (已知存在的ID) 注入点分析 : querydata 方法接收三个参数 $modenum (即 $num )传入 initflow 方法 initflow 方法又将其传入 initdata 方法 $num 最终被拼接到SQL条件语句中执行,无任何限制 漏洞利用 构造请求 : POST请求体为JSON格式 包含 basemodenum 和 baseoptid 参数 baseoptid 设置为已知存在的ID(如1) 注入payload : 通过 basemodenum 参数构造SQL注入语句 总结 漏洞共性 两个漏洞都存在IP限制(需本地或内网IP) 都涉及JSON格式数据处理 都因参数直接拼接SQL语句导致注入 防护建议 对所有输入参数进行严格过滤和类型检查 使用预编译语句或ORM框架 加强权限验证,不能仅依赖IP限制 对JSON输入进行严格验证 利用要点 必须修改Host头绕过IP限制 注意请求参数格式(JSON) 部分参数需要构造特定值才能触发漏洞路径