若依(Ruoyi)SpringBoot后台权限系统高危漏洞深度剖析:SQL注入与任意文件读取
1. 若依系统简介与漏洞背景
若依(Ruoyi)是一款基于SpringBoot开发的轻量级权限管理系统,它的设计初衷是为了简化企业级应用的开发流程。我在实际项目中多次接触过这个框架,它的前端和后端代码都经过精心封装,确实能显著降低开发门槛。系统名称取自"你若不离不弃,我必生死相依"的浪漫寓意,但在安全领域,我们更关注的是它能否真正守护用户数据。
这个系统常见于OA办公、CRM客户管理等场景,支持PC端和移动端访问。最新统计显示,国内有超过2000家企业正在使用若依作为后台管理系统。正是由于它的广泛普及,一旦出现安全漏洞,影响范围会非常可观。去年某大型制造企业数据泄露事件,事后分析就与未及时修复的框架漏洞有关。
2. SQL注入漏洞深度解析
2.1 漏洞位置与触发条件
漏洞隐藏在系统管理→角色管理模块的列表查询接口中。具体路径是/system/role/list,这个接口本应只返回角色列表,但由于缺乏参数过滤,攻击者可以通过构造特殊参数实现SQL注入。我在本地测试环境复现时发现,即使没有管理员权限,只要获取到普通用户的会话Cookie,就能利用这个漏洞。
关键问题出在params[dataScope]参数的处理上。开发人员直接将用户输入拼接到了SQL语句中,这是典型的字符串拼接式注入。更危险的是,这个接口使用的是POST请求,传统的WAF很可能不会检测这类隐蔽的攻击。
2.2 攻击原理与技术细节
攻击者主要利用MySQL的报错注入技术。通过extractvalue函数触发XML解析错误,从而带出数据库信息。这里有个技术细节值得注意:原始POC中使用substring函数是为了绕过某些长度限制,但在最新测试中我发现其实可以省略这个步骤。
完整的攻击链是这样的:
- 攻击者登录后台获取有效会话
- 向漏洞接口发送恶意POST请求
- 系统返回包含数据库信息的错误消息
- 通过持续注入获取表结构、用户凭证等敏感数据
POST /system/role/list HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded Cookie: JSESSIONID=xxxxxx params[dataScope]=and extractvalue(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schema=database()),0x7e))2.3 危害评估与实战影响
这个漏洞的危险等级至少是高危。在我参与的一次渗透测试中,通过这个注入点我们最终获取到了:
- 完整的数据库结构
- 管理员账号的MD5密码哈希
- 系统配置信息
- 用户敏感数据
更严重的是,由于若依默认使用MySQL的root账户连接数据库,攻击者甚至可以通过into outfile实现webshell写入。某次应急响应中,我们就遇到攻击者利用这个漏洞批量导出客户资料的案例。
3. 任意文件读取漏洞分析
3.1 漏洞形成机制
文件读取漏洞位于/common/download/resource接口,问题出在路径遍历处理不当。开发人员本意是让用户下载指定目录下的资源文件,但没有对输入的路径进行规范化检查和过滤。
攻击者可以通过../../这样的路径穿越符访问系统任意文件。我测试时发现,在Windows系统上还可以用..\的变形进行利用。这个漏洞最可怕之处在于它不需要任何特殊权限,只要能够登录后台就可以利用。
3.2 典型攻击场景
在实际攻击中,攻击者通常会按这个顺序读取文件:
/etc/passwd确认服务器信息WEB-INF/classes/application.yml获取数据库配置WEB-INF/classes/logback.xml检查日志配置- 系统密钥文件如
id_rsa等
# 通过curl测试漏洞 curl 'http://target.com/common/download/resource?resource=profile/../../../../etc/passwd' \ -H 'Cookie: JSESSIONID=xxxxxx'3.3 组合利用的杀伤力
当SQL注入和文件读取两个漏洞结合使用时,会产生1+1>2的效果。攻击者可以:
- 通过SQL注入获取数据库凭证
- 通过文件读取获取加密密钥
- 解密数据库连接信息
- 建立直接数据库连接导出全部数据
去年某政务系统被入侵事件就是这种组合拳的典型案例,攻击者最终获取了数十万公民的隐私数据。
4. 漏洞修复方案
4.1 紧急缓解措施
对于无法立即升级的系统,建议采取以下临时方案:
- 在Nginx层添加规则拦截包含
../的请求 - 对
params[dataScope]参数进行强制类型转换 - 限制数据库账户权限,撤销FILE权限
// 示例:参数过滤代码 public String filterPath(String input) { return input.replaceAll("\\.\\./", "").replaceAll("\\.\\\\", ""); }4.2 彻底修复方案
官方在v4.5.1版本中已修复这些问题,建议所有用户立即升级。主要修复点包括:
- 使用预编译语句处理SQL查询
- 对文件下载路径进行规范化校验
- 增加权限二次验证
升级后务必检查:
- 数据库连接账户是否已降权
- 服务器上是否残留后门文件
- 日志中是否有异常访问记录
5. 企业防护建议
在安全运维实践中,我总结了以下几点经验:
- 建立框架漏洞监控机制,订阅若依官方的安全公告
- 对所有后台接口实施严格的权限控制
- 定期进行安全扫描,特别是参数注入测试
- 数据库连接坚持最小权限原则
某金融客户在实施这些措施后,成功拦截了多次针对若依系统的攻击尝试。他们现在对所有后台接口都添加了二次认证,即使会话被窃取,攻击者也无法直接利用漏洞。
