从WMCTF2023_ez_java_again开始的RMIConnector二次反序列化学习
follycat 发表于 湖南 WEB安全 329浏览 · 2025-05-31 07:34

环境搭建

这里用的是CTF复现计划里的docker进行搭建的。

docker命令

访问12345端口即可



解题

首先看到题目中有一个按钮,点击后没啥反应,随后进行查看源代码以及抓包。





抓包到了url参数,并且源码中有url1这个参数,并说明了有安全问题已经被废弃掉了。

因此使用url1这个参数来进行文件读取。



将这俩个文件夹里的文件都读取出来,这个环境里面的.class文件都可以直接读取然后直接放到idea里面查看源码。

直接看他造成反序列化的CmdServlet.class这个类



其中过滤在/WEB-INF/classes/config/serialkiller.xml

根据批注以及xml文件可以发现其中过滤了ChainedTransformer,TrAXFilter等类,将cc1-6基本上全ban了,但是他没有禁用InvokeTransformer这一关键类以及cc7这条链的入口点函数,说明这个类以及cc7的入口点应该是解题必备的。

根据上面的思路进行构造,将cc7的入口点直接和InvokeTransformer进行组合操作,中间不调用ChainedTransformer,但是现在是有一个问题的,就是runtime是无法序列化的,又不能调用ChainedTransformer,所以这里需要一个新的可以执行命令的方法,又或者可以进行二次反序列化,因此这里使用RMI二次反序列化进行绕过。

RMIConnector二次反序列化

原理

RMIConnector是RMI中负责远程连接的类,位于javax.management.remote.rmi.RMIConnector

首先看到其findRMIServerJRMP方法



可以发现其接受一个base64的字符串并将其解密并进行了反序列化操作,也就是oin.readObject();继续向上找谁调用了findRMIServerJRMP,并且传入的base64是可控的,找到findRMIServer这个方法。



可以发现,当path开头为/stub/时将会调用findRMIServerJRMP,并且将传入截取之后的path,继续向上寻找,找到connct中调用了该方法。



当然调用条件为rmiServer=null,寻找可以让rmiServer为null的构造方法,找到RMIConnector



其只构造JMXServiceURLenvironment完美符合条件。

所以只需要构造成这样,然后可以使用cc链对rmiConnector的connct方法进行调用即可触发二次反序列化。

因为不需要多次调用invokerTransformer,所以无需使用chainedTransformer,那就会又有一个问题,就是transform的key(input)应该如何传入。



如果可以使用TiedMapEntry的话可以直接将需要的类传给他的第二个参数,由于没有ConstantTransformer,这将会直接改变key的值(cc1中ConstantTransformer的作用)。

payload

cc6调用RMIConnector:





绕过黑名单

当然在这个题中TiedMapEntry是被禁用了的,同之前的思路还是使用cc7的入口点来调用RMIConnector。

这里需要注意一点的就是key的设置,由于这里没有TiedMapEntry,所以key是无法直接反射进行传参的,并且LazyMap是基于hashMap1和hashMap2进行懒加载的,所以在实际储存和访问key时需要先反射来访问hashMap1中的table数组,从中获取到我们需要修改的key的Node对象(这个对象中包含了key和value),对该node对象进行反射修改key。

因此应该这样修改key的值

通过调试可以看到值的改变,首先可以看到table数组中的值为node对象



然后看到其中的key和value



继续调试,发现key从1被替换为rmiConnector



cc7调用RMIConnector:

当然二次反序列化也可以调用其他的链子并不一定要是cc6,也可以直接加载字节码。



参考文章

https://tttang.com/archive/1701/#toc_rmiconnector

https://www.freebuf.com/articles/web/372573.html#/

https://www.yuque.com/dat0u/ctf/en3rym0131fuby60#

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