`[GKCTF 2021]babycat-revenge
一进入题目界面如上所示,简简单单,没法注册,登录试了下弱口令还有注入都不是,也没有什么其他页面
找不到线索就抓个包来看看
好家伙,这个注册页面的注册代码露出来了,大概意思是得传入username和password才能注册,默认是不传值所以无法使用
这里源代码显示传值得传json数据,且得是POST方式,参考了登陆时的json数据包来注册
注册成功后登录
又看到了熟悉的上传功能和下载功能,这里先抓包看看下载功能
这个包这个下载的文件路径,不用多说也知道,任意文件读取吧
这里它已经提示了网站的文件路径,这题的网站是Java写的,war包的结构就不多说了
查一查web.xml吧
可以看到有这么几个类,路径也告诉了,那就去把他们的代码下载下来吧
../../WEB-INF/classes/com/web/servlet/registerServlet.class
这里是乱码很正常,我们先把所有类文件都下载下来
这里拿jd-gui反编译看源代码
这些代码我大致看了下,问题应该是出在上传文件这里,但是有个问题就是你要想上传文件必须得role是admin
所以得回头看看登录和注册那里,怎么把role弄成admin
emem核心代码应该是注册时的这部分代码,这个代码大体意思是它会正则匹配我们注册时传入的json数据包的所有role部分
但因为他用的是while循环赋值到一个变量上,所以该变量实际上是匹配到的最后一个结果,如**{“username”:“admin”,“password”:“admin”,“role”:“admin”,“role”:“test”}**他匹配到的应该是"role":“test”,然后下面会把注册时传入的数据中的"role":"test"部分做替换,变成{“username”:“admin”,“password”:“admin”,“role”:“admin”,“role”:“guest”},这里应该就是漏洞点了。这里还需要注意的一点,role的值一定不能为空,不能让他正则匹配不到,因为如果它匹配不到下面会直接设置它为guest
这里实在没办法了,json和Java的做的不是很多,只能看看大佬的文章学习学习
这段是大佬文章里的原话,菜鸡只能说大佬牛逼,相关的json中的注释我搜了下也没有什么有用的消息,很好奇大佬的知识点是去哪里看到的haha
回到正题,大佬用的思想其实应该也是顺着上面我解析的那样得到的思路
思路一
既然这题要求一定要有role给正则匹配然后进行替换,那我们可以多传几个role,反正他也只会匹配一个进行替换,然后我们利用JSON解析的特性,json 中键值一样的数据解析时后面的会覆盖前面的,因此可以构造如下载荷。
{"username":"admin","password":"password","role":"test","role":"admin"}
这个载荷传入时正则只会匹配到"role":"test"然后替换,“role”:"admin"匹配不到是因为加了这个注释符已经不满足正则的匹配规则了,然后载荷变成如下
{"username":"admin","password":"password","role":"guest","role":"admin"}
接着gson解析json,上面也说了键值一样的数据解析时后面的会覆盖前面的,再加上是注释符会被忽略,所以解析出来的role就是admin
思路二
思路二和思路一利用的原理都一样,利用json不会解析注释内容以及必须要有role给正则匹配这一点,我们可以在注释中放一个role给正则匹配,这样并不影响json解析,因此构造载荷如下
{"username":"admin","password":"pass","role":"admin"}
选哪一个载荷都行,进行注册
然后登陆
接下来去看看上传部分的代码
这里看到好像有waf
这是上传文件白名单,允许上传的文件中有 xml 文件。
Java代码审计没咋做过,看了下WP是说看代码可以发现注册业务中导入了 com.web.dao.baseDao,在其源码中用到了方法 XMLDecoder。
其中 System.getenv(“CATALINA_HOME”) 可以使用前面的文件包含读取 /proc/self/environ 得到为 /usr/local/tomcat。因此可以尝试将 db.xml 覆盖为恶意代码后使用注册业务触发 XMLDecoder 反序列化。
上传业务中还对上传的内容执行了检测。
此时考虑使用 hint 中提到的 PrintWriter 去写入冰蝎的一句话,构造出如下载荷上传。
下面CDATA括起来的就是冰蝎的jsp木马
传上去后还需要再注册一个账户触发漏洞,然后用冰蝎连接,密码默认为rebeyond
总结
Java的代码审计做的还是太少了,Java反序列化也不是很熟,搜了一下XMLDecoder在JDK 1.4~JDK 11中都存在反序列化漏洞安全风险。看来以后还得多多做一些Java反序列化的题目。
参考文章
https://www.lemonprefect.cn/zh-CN/posts/751c0b7.html#babycat-revenge


![[GKCTF 2021]babycat-revenge [GKCTF 2021]babycat-revenge](http://www.mshxw.com/aiimages/31/531647.png)
