从系统安全防护赛JDBCParty 学习高版本JDK和高版本Tomcat打JNDI到RCE
J1rrY 历史精选 346浏览 · 2025-02-15 09:31

之前有佬在群里发了如何反序列化触发到JNDI 这里重新学习整理一下整个流程

看看高版本jdk和高版本tomcat如何触发到RCE

考点:高版本JDK反序列化+高版本JNDI打法

JDK17+反射限制绕过

参考:https://pankas.top/2023/12/05/jdk17-%E5%8F%8D%E5%B0%84%E9%99%90%E5%88%B6%E7%BB%95%E8%BF%87/

这位师傅说的非常详细了

本质上就是 在jdk17及之后无法反射 java.* 包下非public 修饰的属性和方法 通过 UnSafe实现调用类的module和Object类的module一样 达到可以修改的目的

如何找到触发getter的JNDI

实际上就是这个项目 Deserial_Sink_With_JDBC

https://github.com/luelueking/Deserial_Sink_With_JDBC
图片加载失败


为什么只能打RMI

图片加载失败


做了 validateJNDIName 黑名单限制
图片加载失败
只可以打RMI远程方法调用

触发到JNDI的POC

这里toString链是 2024 阿里云CTF chain17官方WP中的 toString 通杀链

需要注意对 BaseJsonNode要去除其 writeReplace方法

建议本地实现包覆盖
图片加载失败


poc类

UnSafeTools类

高版本JNDI打法

建议参考 浅蓝师傅的文章(经典好文~)

探索高版本 JDK 下 JNDI 漏洞的利用方法

tomcat高版本限制

值得注意的是这里 Spring-boot内置版本是tomcat 10.1.31

图片加载失败


Tomcat 在9.0.62后在BeanFactory里对forceString 进行了判断

直接打 BeanFactory的老路已经行不通了 什么EL和SnakeYaml都打不了

建议参考 高版本JNDI注入-高版本Tomcat利用方案 但是这道题实现不了Sink点 需要重新找Sink点

图片加载失败


XXE

浅蓝师傅的文章中有通过 org.apache.catalina.users.MemoryUserDatabaseFactory 打本地工厂类实现XXE 考虑可以通过XXE盲注实现任意文件读取

原文没有具体代码这里贴一下 RMI 恶意服务端

XXE盲注Payload

xxe.xml

test.dtd

这里是Windows环境 可以触发XXE但是 没有实现任意文件读取

可能是Windows环境原因??? 有空Linux试试 但是又要改POC太麻烦了 留个坑

利用CVE-2022-39197实现RCE

群里有佬提了一句 就自己探索一下

参考: CobaltStrike RCE漏洞分析



细心一点可以发现存在第三方依赖 batik-swing

image.png
图片加载失败


结合文章进行相应修改和应用 会发现Sink点是 JSVGCanvas#setURL 可以svg2RCE
图片加载失败


高版本Tomcat实现触发任意类setter

之前我们说过 tomcat高版本 虽然对toString做了限制

但是可以通过JavaBeans Introspector 实现获取任意类的bean之后就可以调用任意类的的setter方法 而且可以实现任意传参

所以我们可以通过 BeanFactory实现调用任意setter方法并且传参

获取JavaBean的WriteMethod也就是所有setter方法
图片加载失败
通过反射实现调用
图片加载失败


图片加载失败
直接触发到 JSVGCanvas#setURL
图片加载失败
至于这里为什svg要这样写

这个是一个间隔了20年的漏洞直接拿来用就是了(可以自己研究一下)

calc.svg

图片加载失败
触发到 org.apache.batik.bridge.BaseScriptingEnvironment#loadScript实现远程类加载

一种是实现EventListenerInitializer类,MANIFEST.MF指定SVG-Handler-Class

一种是实现ScriptHandler类,MANIFEST.MF指定Script-Handler

这里以 文章中提到的EventListenerInitializer为例子
图片加载失败


可以实现远程类加载实例化并且执行 initializeEventListeners方法意味着可以执行任意命令

编写exp.jar

注意这里用的是 batik-ext-1.5.jar 远古版本 这里贴一下下载链接

http://www.java2s.com/Code/Jar/b/Downloadbatikext15jar.htm 导入lib库后

图片加载失败


实现 initializeEventListeners方法

exp.jar

手动加上META-INF/MANIFEST.MF 后打包为jar

图片加载失败


图片加载失败


一定一定注意 exp.jar放在其他端口 同一端口不行(什么鬼bug)

图片加载失败


0 条评论
某人
表情
可输入 255

没有评论