RuoYi-Vue-Plus sendMessageWithAttachment 任意文件读取漏洞
字数 1354 2025-08-30 06:50:27
RuoYi-Vue-Plus sendMessageWithAttachment 任意文件读取漏洞分析
漏洞概述
RuoYi-Vue-Plus 是一个基于 Vue3 和 Spring Boot 3.x 构建的多租户权限管理系统,具备代码生成器、分布式任务调度、多数据源事务等功能模块。在 sendMessageWithAttachment 方法中存在任意文件读取漏洞,攻击者可以利用该漏洞读取服务器上的任意文件,可能导致敏感信息泄露、权限提升、数据篡改等安全问题。
影响版本
- 受影响版本:<= v5.4.0
- 识别方法:Fofa 搜索
body="RuoYi-Vue-Plus后台管理框架"
漏洞分析
漏洞入口
漏洞位于 org.dromara.demo.controller.MailController 类中的 sendMessageWithAttachment 方法:
filepath参数完全由用户控制,表示附件路径- 方法直接调用
SendText方法处理该路径 - 经过三次
send方法调用后,最终到达MailUtils类的send方法
文件读取流程
-
邮件发送准备:
- 依次调用
setTos、setTitle、setContent、setHtml、setFiles方法 setFiles方法负责处理附件文件
- 依次调用
-
附件处理:
- 创建
DataSource数组对象 - 遍历每个文件路径,创建
FileDataSource对象 FileDataSource构造函数直接接受文件路径作为参数- 调用
setAttachments方法将附件添加到邮件中
- 创建
-
邮件发送:
- 调用
mail.send方法 - 内部调用
doSend方法构建完整邮件消息 - 最终通过
Transport.send方法发送邮件
- 调用
-
文件读取关键点:
- 在
Transport.send方法中调用send0方法 send0方法处理邮件内容序列化- 通过
writeTo方法将邮件内容写入输出流 - 最终通过
getcontentStream方法获取文件内容流
- 在
漏洞成因
漏洞产生的主要原因是 sendMessageWithAttachment 方法中的 filePath 参数完全由用户控制,且系统未对该参数进行任何限制或过滤,导致攻击者可以指定任意文件路径进行读取。
漏洞复现
- 定位到
sendMessageWithAttachment接口 - 构造恶意请求,指定
filePath参数为敏感文件路径(如/etc/passwd) - 系统将读取指定文件内容并作为邮件附件发送
修复建议
- 升级到最新版本:最新版本已修复此漏洞,不再允许用户控制
filePath参数 - 参数限制:如果无法立即升级,应对
filePath参数进行严格限制:- 限制文件路径范围(如只能访问特定目录)
- 验证文件路径合法性
- 禁止访问系统敏感目录
总结
该漏洞展示了不安全的文件操作可能带来的严重后果。开发过程中应始终遵循最小权限原则,对用户提供的文件路径进行严格验证和限制,避免直接使用用户输入作为文件操作参数。