万户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')
漏洞分析
代码执行流程
-
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语句中,而应使用参数化查询等安全编码实践。同时,鉴权机制的设计应考虑到各种绕过可能性,确保系统安全。