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

RuoYi-v4.5.0 文件下载接口的坑:从一次调试到发现任意文件读取漏洞

从调试到发现RuoYi文件下载接口的路径拼接陷阱那天下午我正对着屏幕上的404错误发呆。项目里一个简单的文件下载功能突然罢工而日志里只有一句冷冰冰的File not found。作为团队里负责这个模块的开发者我不得不深入RuoYi框架的源码开始了一场意料之外的探险。1. 问题初现消失的文件事情始于一个再普通不过的需求——用户需要下载服务器上的资源文件。我们的系统基于RuoYi v4.5.0构建按照文档调用/common/download/resource接口应该就能完成这个功能。但当我传入/profile/download/test.pdf这样的参数时服务端却返回了文件不存在的错误。典型的调试过程开始了在CommonController类中添加System.out.println输出关键变量检查Global.getProfile()返回的本地路径是否正确验证StringUtils.substringAfter()方法的处理逻辑// 调试时添加的日志输出 System.out.println(localPath: localPath); // 输出D:/ruoyi/uploadPath/ System.out.println(resource参数: resource); // 输出/profile/download/test.pdf System.out.println(处理后路径: downloadPath); // 输出D:/ruoyi/uploadPath/download/test.pdf奇怪的是拼接后的路径看起来完全正确文件也确实存在于该位置。这让我意识到问题可能不在路径拼接本身而是文件读取的环节。2. 深入源码FileUtils的读写逻辑顺着调用链我找到了FileUtils.writeBytes方法。这个工具类方法负责将文件内容写入输出流是实际执行文件操作的关键位置。public static void writeBytes(String filePath, OutputStream os) throws IOException { FileInputStream fis null; try { File file new File(filePath); if (!file.exists()) { throw new FileNotFoundException(filePath); } fis new FileInputStream(file); byte[] b new byte[1024]; int length; while ((length fis.read(b)) 0) { os.write(b, 0, length); } } // ... 异常处理和资源关闭代码 }关键发现点方法直接使用传入的filePath创建File对象没有对路径进行规范化处理(normalize)没有检查路径是否在允许的目录范围内这让我警觉起来——如果我能控制filePath的值理论上可以读取服务器上的任意文件。3. 路径拼接的致命缺陷回到CommonController重点分析downloadPath的生成逻辑String localPath Global.getProfile(); // 固定配置D:/ruoyi/uploadPath/ String downloadPath localPath StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);StringUtils.substringAfter方法的作用是截取/profile/之后的部分。看起来安全的设计背后隐藏着危险输入resource值处理后结果实际访问路径/profile/test.txttest.txtD:/ruoyi/uploadPath/test.txt/profile/../application.yml../application.ymlD:/ruoyi/uploadPath/../application.yml/profile/../../pom.xml../../pom.xmlD:/ruoyi/uploadPath/../../pom.xml漏洞成因总结路径拼接前未对用户输入进行规范化处理未检查最终路径是否仍在允许的目录范围内依赖简单的字符串拼接而非安全的路径API4. 从理论到实践漏洞验证为了确认这个发现我设计了几组测试用例测试案例1读取同级目录文件GET /common/download/resource?resource/profile/../application.properties预期结果返回D:/ruoyi/uploadPath/../application.properties即D:/ruoyi/application.properties测试案例2读取上级目录文件GET /common/download/resource?resource/profile/../../pom.xml预期结果返回项目根目录下的pom.xml文件测试案例3读取系统敏感文件仅用于本地测试验证GET /common/download/resource?resource/profile/../../../../Windows/System32/drivers/etc/hosts注意实际渗透测试中尝试读取系统文件可能违反法律此处仅作技术讨论测试结果证实了我的猜想——通过精心构造的resource参数确实可以读取服务器上的任意文件包括项目配置文件application.yml, application.properties源代码文件.java, .xml系统敏感文件/etc/passwd, C:/Windows/win.ini等5. 修复方案与安全编码实践发现问题后我立即着手修复这个安全隐患。以下是几种可行的解决方案方案1路径规范化目录检查String safePath Paths.get(localPath) .resolve(StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX)) .normalize() .toString(); if (!safePath.startsWith(localPath)) { throw new SecurityException(非法路径访问); }方案2使用白名单校验文件名String filename StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX); if (!filename.matches([a-zA-Z0-9-_]\\.[a-zA-Z0-9])) { throw new SecurityException(非法文件名); }更全面的安全建议输入验证对所有用户提供的路径参数进行严格校验路径规范化使用Paths.normalize()消除../等跳转序列目录限制确保最终路径位于允许的根目录下最小权限原则运行服务的账户应只有必要目录的读取权限日志监控记录所有文件下载请求特别关注异常路径6. 漏洞的深层思考这次调试经历让我对Web应用安全有了更深刻的认识。表面上看这只是一个简单的路径拼接问题但背后反映了几类常见的安全隐患安全反模式过度信任用户输入缺乏边界检查使用字符串操作代替专用路径API错误的安全假设认为前缀检查足够防御性编程要点不信任原则所有外部输入都应视为不可信的明确边界定义清晰的资源访问边界并严格执行深度防御多层防护比单一检查更可靠安全默认值失败时应拒绝而非允许这次调试意外演变成安全审计的经历让我明白了一个道理在软件开发中我们不仅要让代码能工作更要让代码安全地工作。每一个看似无害的字符串拼接每一次对用户输入的信任都可能成为系统安全的阿喀琉斯之踵。

相关文章:

RuoYi-v4.5.0 文件下载接口的坑:从一次调试到发现任意文件读取漏洞

从调试到发现:RuoYi文件下载接口的路径拼接陷阱 那天下午,我正对着屏幕上的404错误发呆。项目里一个简单的文件下载功能突然罢工,而日志里只有一句冷冰冰的"File not found"。作为团队里负责这个模块的开发者,我不得不深…...

易语言数据库操作进阶:参数化查询、事务处理与通用组件封装

易语言数据库操作进阶:参数化查询、事务处理与通用组件封装一、学习目标与重点 💡学习目标:1. 理解SQL注入的危害与参数化查询的原理;2. 掌握内置Ado引擎与SQLite3的参数化查询方法(防止SQL注入)&#xff1…...

Qwen-Image-Lightning前端集成:JavaScript实现实时图像预览

Qwen-Image-Lightning前端集成:JavaScript实现实时图像预览 想象一下,你正在开发一个创意工具网站,用户输入一段文字描述,几秒钟后就能看到对应的图片慢慢“画”出来,整个过程流畅自然,还能看到生成进度。…...

保姆级教程:用Stream搞定iOS App抓包,从证书安装到数据查看一步不落

iOS应用数据抓包实战指南:从Stream配置到数据分析全解析 在移动应用开发和测试过程中,数据抓包是一项基础但至关重要的技能。无论是调试API接口、分析网络性能,还是排查数据异常,掌握专业的抓包技术都能显著提升工作效率。对于iOS…...

Apache HTTP Server 安全加固综合指南

好的,我们来聚焦于 Apache HTTP Server 的安全。这是一个非常广泛且重要的主题。我将为您提供一个结构化的、从基础到进阶的 Apache 安全加固指南,您可以将其视为一个“手动版”智能体的检查清单和操作手册。Apache HTTP Server 安全加固综合指南 一、 核…...

3大核心功能革新Apple Silicon Mac游戏体验:PlayCover全攻略

3大核心功能革新Apple Silicon Mac游戏体验:PlayCover全攻略 【免费下载链接】PlayCover Community fork of PlayCover 项目地址: https://gitcode.com/gh_mirrors/pl/PlayCover 还在为Apple Silicon Mac无法运行iOS游戏而困扰吗?PlayCover作为一…...

094华为黄大年茶思屋第3期·难题二:[高性能]数据库智能基数估计算法

华为黄大年茶思屋第3期难题二:[高性能]数据库智能基数估计算法 双思路解题方案:常规行业解法 本源动态原点解法,双框架对照,专家级可落地、可验证 核心亮点:直击数据库基数估计精度瓶颈,提供轻量化、自适应…...

墨语灵犀入门必看:Hunyuan-MT蒸馏版与全量版在古文翻译任务中的权衡

墨语灵犀入门必看:Hunyuan-MT蒸馏版与全量版在古文翻译任务中的权衡 1. 引言:当古典美学遇见AI翻译 想象一下这样的场景:你需要翻译一段深奥的古文,可能是唐诗宋词,也可能是先秦典籍。传统的翻译工具给你的是机械式的…...

093华为黄大年茶思屋第3期·难题一:AI大模型训练 – 多维度混合并行策略的自动搜索算法

华为黄大年茶思屋第3期难题一:AI大模型训练 – 多维度混合并行策略的自动搜索算法 双思路解题方案:常规行业解法 本源动态原点解法,双框架对照,专家级可落地、可验证 核心亮点:直击大模型并行策略搜索产业卡点&#x…...

智能微电网多目标优化:粒子群算法的完整数据运行与验证

智能微电网中利用粒子群算法实现多目标优化 有完整数据可运行 :智能微电网中对多目标问题的优化,采用粒子群的完美验证,有详细注释,可以借鉴 文件列表: C_buy2.txt C_sell2.txt C_sub2.txt fitnessEcoVir.m Load2.txt …...

Legacy iOS Kit终极指南:如何零成本复活旧iPhone与iPad设备

Legacy iOS Kit终极指南:如何零成本复活旧iPhone与iPad设备 【免费下载链接】Legacy-iOS-Kit An all-in-one tool to downgrade/restore, save SHSH blobs, and jailbreak legacy iOS devices 项目地址: https://gitcode.com/gh_mirrors/le/Legacy-iOS-Kit L…...

嵌入式C++轻量工具库:零分配字符串与安全格式化

1. toolbox 库概述:面向嵌入式环境的轻量级通用工具集toolbox是一个专为资源受限嵌入式系统(尤其是 Arduino 风格平台)设计的通用工具库。它并非追求功能完备性,而是以确定性、低开销、内存可控为根本设计哲学,直面 MC…...

语音信号处理中的小波分解法降噪方法MATLAB例程

语音信号处理--降噪方法之小波分解法 MATLAB例程语音降噪这事儿,日常太刚需了——打电话时的背景杂音、录音里的环境噪音,都得想办法干掉。小波分解法算是语音降噪里的老牌选手了,比起傅里叶只能看全局频率,小波能同时抓时域和频域…...

Mbed OS下BLE鼠标HID服务开发指南

1. 项目概述Mbed BLE Mouse 是一个面向 Arduino 兼容开发板的蓝牙低功耗(BLE)人机接口设备(HID)库,专为运行 Mbed OS 的嵌入式平台设计。该库将具备 BLE 能力的微控制器(如 Arduino Nano 33 BLE、Nano 33 B…...

零门槛实战:Python百度搜索API从入门到精通

零门槛实战:Python百度搜索API从入门到精通 【免费下载链接】python-baidusearch 自己手写的百度搜索接口的封装,pip安装,支持命令行执行。Baidu Search unofficial API for Python with no external dependencies 项目地址: https://gitco…...

未来最有前景的行业及终身发展方向指南

未来最有前景的行业及终身发展方向指南根据最新行业趋势分析,以下5个行业不仅前景广阔,更适合作为终身职业发展方向,并附上具体实施步骤:一、人工智能与大模型应用为什么值得长期投入:国家"十五五"规划重点支…...

Python处理MDX词典数据实战:从解析到Excel导出完整流程

Python处理MDX词典数据实战:从解析到Excel导出完整流程 在语言学习和词典开发领域,MDX格式因其高效的压缩和检索能力成为主流词典存储格式之一。但对于需要批量分析或迁移数据的开发者而言,直接操作这种二进制文件始终是个技术门槛。本文将带…...

手把手教你用云测试平台搞定安卓/iOS/鸿蒙兼容性测试(含Testin/百度MTC实战)

云测试平台实战指南:零成本解决安卓/iOS/鸿蒙兼容性问题 当你的应用需要同时覆盖三大移动平台时,真机设备采购成本可能高达数十万元。去年我们团队上线一款社交应用时,仅购买主流测试设备就花掉了23万预算——直到发现云测试平台能以1/100的…...

25岁的Java工程师:我的AI转型之路,附完整学习路线与资料下载

一位Java开发者在AI大模型兴起后面临职业危机,通过博学谷的系统培训成功转型AI领域。经过6个月刻苦学习,在老师指导下克服数学基础薄弱等困难,最终获得月薪15K的AI工作机会。作者分享了自己的转型经历、完整学习路线和AI大模型资源&#xff0…...

SourceTree 合并提交实战:5分钟搞定零散提交的批量处理(附Cherry Pick技巧)

SourceTree高效提交管理:从零散提交到优雅合并的完整指南 在团队协作开发中,代码提交历史就像项目的日记本——杂乱无章的记录会让后续的维护和问题追踪变得异常困难。想象一下,当你需要回溯某个功能的开发过程时,面对几十个"…...

Anaconda3安装和安装pycharm(保姆级教程)

目录 一.安装Anaconda3 二.安装pycharm 三.设置配置(可选根据自己的习惯来) Anaconda3 与 PyCharm 介绍、安装及关系 Anaconda3 是一个集成了 Python 解释器、大量数据分析和机器学习常用库(如 numpy、pandas),还自带 conda 环境管理工具的…...

(理论篇)深入剖析认证崩溃——从弱口令到暴力破解

概述:在应用程序的安全防御体系中,身份认证是守卫系统大门的第一道关卡。这道关卡的失守,通常被称为“认证崩溃”。 攻击者通过利用认证或会话管理中的缺陷,能够成功破译密码、密钥或会话令牌,从而获得非授权访问权限。…...

RAW图像处理避坑指南:如何正确分离和组合RGGB四通道(Python版)

RAW图像处理避坑指南:如何正确分离和组合RGGB四通道(Python版) 第一次处理RAW图像时,我犯了一个低级错误——直接把RGGB四个通道当作普通的RGB图像来处理。结果生成的图像色彩完全错乱,红色变成了诡异的紫色&#xff0…...

ret2text Ctfhub

简单的栈溢出gets函数,v4,在ebp-0x70shiftF12先传入形参,因为是64位,可以查看是将sh写入rdi寄存器中,之后调用函数system将常量区的地址写入rdi寄存器中,之后对rdi进行寄存器间接寻址.rodata:字…...

CoPaw赋能物联网(IoT)后端开发:设备数据解析与告警规则生成

CoPaw赋能物联网(IoT)后端开发:设备数据解析与告警规则生成 1. 物联网开发的现实挑战 想象一下这样的场景:你刚接手一个大型物联网平台项目,需要接入上百种不同类型的设备。这些设备来自不同厂商,协议文档…...

Vue-Flow-Editor:用SVG魔法点亮你的流程图创作之旅

Vue-Flow-Editor:用SVG魔法点亮你的流程图创作之旅 【免费下载链接】vue-flow-editor Vue Svg 实现的flow可视化编辑器 项目地址: https://gitcode.com/gh_mirrors/vu/vue-flow-editor 想象一下,你正在设计一个复杂的业务流程,脑海中…...

windows下git使用教程2(gitee仓库与代码提交)

前序文章: windows下git使用教程1(安装与使用) 代码仓库gitee的使用 介绍了git的基础操作,这篇文章介绍一下远程仓库和代码提交的操作。 1.远程仓库 远程仓库是托管在网络服务器上的 Git 仓库,和你本地电脑上的 本…...

技术解密:LilToon卡通渲染着色器的模块化革命与跨平台实践指南

技术解密:LilToon卡通渲染着色器的模块化革命与跨平台实践指南 【免费下载链接】lilToon Feature-rich shaders for avatars 项目地址: https://gitcode.com/gh_mirrors/li/lilToon 在Unity实时渲染生态中,卡通渲染技术长期面临风格化与性能优化的…...

从知识概念预测到精准推送:构建下一代个性化习题推荐引擎

1. 为什么我们需要下一代习题推荐系统? 每次打开在线学习平台时,你是否遇到过这样的困扰:系统推荐的题目要么简单得像112,要么难到让你怀疑人生?更糟的是,反复出现的同类题型让你想摔键盘。这背后暴露的正是…...

仅限首批MCP认证伙伴内部流出:OAuth 2026架构设计图原始版(含签名链路、密钥轮转SOP与审计日志字段规范)

第一章:OAuth 2026架构设计图概览与MCP认证背景OAuth 2026 是下一代授权框架的演进标准,由 IETF OAuth Working Group 于 2025 年底正式发布,旨在应对零信任架构、跨域设备协同及量子安全过渡等新兴挑战。其核心创新在于将传统“客户端-资源服…...