HGAME2025-SigninJava

HGAME2025的SigninJava

前言

现如今无心刷题,只对java题目感兴趣,想学习更多的利用方法

这一题在hint出来之前确实是没有什么思路的,主要还是对spring的bean不了解

有了提示之后虽然进度缓慢,但还是最终做了出来,拿了三血

前面一二血分别是大佬Boogipop和天璇大佬A.R.

嘿嘿

题目

image-20250213050622723

InvokeUtils能够调用任意bean中的方法

SpringContextHolder就是获取上下文中的bean

然后过滤了flagTestService这个bean

提示

image-20250213050400975

思维历程

在最开始我就想知道有什么bean我能够调用

然后动态注册bean出来后,查了资料,问了gpt,在这个过程中我大概记住了beanFactory,Definition这些字眼

然后在debug过程中偶然找到了,于是顺藤摸瓜找到已有的bean(运气比较好

image-20250213051840062

springframework那些太长的都不了解,直接略过

然后找到一个hutool,感觉出现在这里肯定有用

image-20250213052038399

发现了注册bean的方法

image-20250213052130378

接着困扰的问题又来了,beanName是字符串,但如何将bean传入一个实例啊

这里主要还是对fastjson2不熟悉

不了解JSON.parseObject(JSON.toJSONString(params.get(parameterName)), parameterType, autoTypeFilter, new JSONReader.Feature[0])这样的写法

以及不确定@type到底还能不能进行类型转化

这些困惑主要是在发现注册bean方法之前,顺着registerBean方法debug下来的话困惑少了很多

他的parameterType可以debug发现是Object.class,对JSON反序列化的返回值可以说没啥影响了

然后一直不理解这个autoTypeFilter

private static final Filter autoTypeFilter = JSONReader.autoTypeFilter((String[])((Set)Arrays.stream(SpringContextHolder.getApplicationContext().getBeanDefinitionNames()).map((name) -> {
    int secondDotIndex = name.indexOf(46, name.indexOf(46) + 1);
    return secondDotIndex != -1 ? name.substring(0, secondDotIndex + 1) : null;
}).filter(Objects::nonNull).collect(Collectors.toSet())).toArray(new String[0]));

在我理解之前根本看不懂

刚开始我就设置@type为一些基本类型,然后一直报错

直到我把@type的值设置为org.springframework.context.support.ClassPathXmlApplicationContext成功实例化

我就理解了就是截取前两个包名,用来限制JSON反序列化

然后第三个问题又来了,我该造一个怎样的恶意bean呢

顺着上面思路,既然org.springframework不了解,那我们可以用cn.hutool(因为SpringUtil这个bean让它放入了白名单)

随便翻翻找不到,直接上网搜hutool有没有命令执行的东西

找到RuntimeUtil

image-20250213054712409

思路其实到这里就结束了,但是实操上这里会出现问题

主要还是InvokeUtils这个工具类的问题

Method beanMethod = (Method)Arrays.stream(beanObject.getClass().getMethods()).filter((method) -> {
    return method.getName().equals(methodName);
}).findFirst().orElse((Object)null);

当获取多态的方法时会有随机性,无法指定对应参数的方法

image-20250213055341108

刚开始我本地通了,然后拿去题目结果报错了,我还以为是不同系统的问题

拿去vps上跑一下,也不行,然后debug

结果发现走的根本不是上面那个方法,而是下面的需要传charset

主要当时不知道有随机性,然后就换exec方法,继续在vps上debug

但是这个方法没回显,然后中途老是卡死,重新启动服务后发现走的又是另外的exec方法

这才知道原来有随机性

没办法,只能不断重启题目了

做题

image-20250213060034741

image-20250213051226035

如果报错就重启题目,直到能够执行命令

总结

还是挺有意思的,感觉还是运气比较好,困扰我的三个难题都经过灵光一现解决了

希望自己多沉淀,了解点更深的技术,我现在对java只知道最常见的反序列化。。。。。


HGAME2025-SigninJava
https://zer0peach.github.io/2025/02/13/HGAME2025-SigninJava/
作者
Zer0peach
发布于
2025年2月13日
许可协议