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方法
漏洞分析流程
-
漏洞入口:
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即可绕过
- 父类中存在鉴权,但只需Host为
漏洞利用
-
构造请求URL:
/index.php?m=opendkq|openapi&d=task&a=zktime -
构造payload:
- 需要构造两层JSON
- Host头设置为
127.0.0.1
-
自动化工具利用:
- 使用sqlmap结合Burp Suite
- 修改Host头绕过IP限制
漏洞点二分析
漏洞位置
webmain/task/openapi/openbaseAction.php文件
漏洞分析流程
-
参数处理:
getpostarr()方法要求POST值为JSON格式basemodenum参数赋值给$modenumbaseoptid参数赋值给$adminid(经过过滤,无法传入单引号等特殊字符)
-
关键验证:
- 21行调用
getuserid方法查询$adminid - 22行检查查询结果,若无数据则报错终止
- 最简单方式是传入
adminid=1(已知存在的ID)
- 21行调用
-
注入点分析:
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)
- 部分参数需要构造特定值才能触发漏洞路径