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 方法:

  1. filepath 参数完全由用户控制,表示附件路径
  2. 方法直接调用 SendText 方法处理该路径
  3. 经过三次 send 方法调用后,最终到达 MailUtils 类的 send 方法

文件读取流程

  1. 邮件发送准备

    • 依次调用 setTossetTitlesetContentsetHtmlsetFiles 方法
    • setFiles 方法负责处理附件文件
  2. 附件处理

    • 创建 DataSource 数组对象
    • 遍历每个文件路径,创建 FileDataSource 对象
    • FileDataSource 构造函数直接接受文件路径作为参数
    • 调用 setAttachments 方法将附件添加到邮件中
  3. 邮件发送

    • 调用 mail.send 方法
    • 内部调用 doSend 方法构建完整邮件消息
    • 最终通过 Transport.send 方法发送邮件
  4. 文件读取关键点

    • Transport.send 方法中调用 send0 方法
    • send0 方法处理邮件内容序列化
    • 通过 writeTo 方法将邮件内容写入输出流
    • 最终通过 getcontentStream 方法获取文件内容流

漏洞成因

漏洞产生的主要原因是 sendMessageWithAttachment 方法中的 filePath 参数完全由用户控制,且系统未对该参数进行任何限制或过滤,导致攻击者可以指定任意文件路径进行读取。

漏洞复现

  1. 定位到 sendMessageWithAttachment 接口
  2. 构造恶意请求,指定 filePath 参数为敏感文件路径(如 /etc/passwd
  3. 系统将读取指定文件内容并作为邮件附件发送

修复建议

  1. 升级到最新版本:最新版本已修复此漏洞,不再允许用户控制 filePath 参数
  2. 参数限制:如果无法立即升级,应对 filePath 参数进行严格限制:
    • 限制文件路径范围(如只能访问特定目录)
    • 验证文件路径合法性
    • 禁止访问系统敏感目录

总结

该漏洞展示了不安全的文件操作可能带来的严重后果。开发过程中应始终遵循最小权限原则,对用户提供的文件路径进行严格验证和限制,避免直接使用用户输入作为文件操作参数。

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 参数进行严格限制: 限制文件路径范围(如只能访问特定目录) 验证文件路径合法性 禁止访问系统敏感目录 总结 该漏洞展示了不安全的文件操作可能带来的严重后果。开发过程中应始终遵循最小权限原则,对用户提供的文件路径进行严格验证和限制,避免直接使用用户输入作为文件操作参数。