就出了一个ezbean,还是太菜了。比赛好多,要寄了QWQ
ezbean
考点:RMI二次反序列化+FastJson
这一题出的不太好。因为题目自己改了东西
1 | package com.ctf.ezser.bean; |
题目给了个bean
1 | package com.ctf.ezser.controller; |
然后就是controller了,结合题目给的pom文件里有FastJson1.2.60可以想到二次反序列化。
1 | package com.ctf.ezser.bean; |
但是你本地运行是不通过的。
百度了一下这个错误,是因为RMIConnector没有无参构造,FastJson才会这样,但是拿编码去打题目就通拉。
![]809CA}4MD5C]G%21V)ECM.png](https://cdn.nlark.com/yuque/0/2023/png/32634994/1682266130115-f285e012-dac7-49cd-b821-7a5cf0ae2c66.png#averageHue=%231c1b1a&clientId=u00773044-af77-4&from=paste&height=266&id=uf9480a4f&name=%5D809CA%7D4MD5C%5DG%2521V%29ECM.png&originHeight=332&originWidth=1020&originalType=binary&ratio=1.25&rotation=0&showTitle=false&size=26629&status=done&style=none&taskId=u2317c9f2-fc34-4061-a45f-3511ab00821&title=&width=816)
pathtoshell
OGNL注入,没WP呢
3.29版本
Obisidan
像是类似XSS的东西。不知道咋打呢
Teapot
考点是邮箱伪造,也没WP呢
bypassit1
考点:Spring+JDK原生链?
这个好像是新链子。也是等WP复现。
嗯现在写出来了,来补上预期解。
实际上也很简单,为什么自己没有早点想到呢(不熟练),预期解法和FastJson调用任意的getter和setter一样,Jackson同样也是会调用getter的,这里是可以通过一个Demo来演示的
1 | package org.example; |
1 | package org.example; |
我们简单的调用一下JackJson的writeValueAsString方法
可以发现是成功的调用了getter的,那么为什么会调用到getter呢?我们再getter上给个断点看看
已经获取到了get方法,这边获取的点我就不是很清楚了,有需要的师傅可以自己去看看,我跟了几遍发现是一个递归获取的,就是图中的调用栈循环几次获取,但是和网上的文章有点不一样,我找不到哪里获取了getter。。。
但是最后是在serializeAsFiled里面进行的反射调用,最终也就调用了getter
主要逻辑还是在这里,调试过程中会发现不断进入findValueSerializer方法获取ser,然后一系列的链式调用balabala就获得到了。网上的JackSon反序列化漏洞我调的时候都进不去,都不对劲。那么直接说正文,既然知道了可以getter调用,那我们就来测试一下。
1 | package org.example; |
payload就长这样,不出意外的话就要出意外了
1 | Exception in thread "main" java.lang.IllegalArgumentException: Failed to JDK serialize `POJONode` value: (was java.lang.NullPointerException) (through reference chain: com.sun.org.apache.xalan.internal.xsltc.trax.TemplatesImpl["outputProperties"]) |
报错信息如上,可以看到是已经调用了Templates的但是除了点问题,我们断点给在TempaltesImpl上
在这里我们报错了,就差那么一点点。。。调用栈如下
1 | run:401, TemplatesImpl$1 (com.sun.org.apache.xalan.internal.xsltc.trax) |
会发现我们走到了一个比较奇怪的方法里,writereplace,在网上检索了一番后发现这也是readObject的时候会优先调用的方法,这是PojoNode的父类BaseJsonNode里面的方法
随后
就会在这抛出错误,这就是说明我们没有走正常的反序列化流程,解决方法也很简单,改一下jar包。把这个方法删掉就好了。。。
或者我们再当前项目创建一个一样的类也可以实现代替:
然后把writeReplace方法删掉就可以了
成功RCE。。。然后直接在题目环境打一遍:
最后EXP:
1 | package org.example; |
然后agent.jar完全就是为了让TemplatesImpl成功实例化而存在的。否则会跑错
下面是WM的WP,很猛的!WM里面的爷爷们
AliyunCTF By Straw Hat.pdf
About this Post
This post is written by Boogipop, licensed under CC BY-NC 4.0.