HGAME2025-SigninJava
HGAME2025的SigninJava
前言
现如今无心刷题,只对java题目感兴趣,想学习更多的利用方法
这一题在hint出来之前确实是没有什么思路的,主要还是对spring的bean不了解
有了提示之后虽然进度缓慢,但还是最终做了出来,拿了三血
前面一二血分别是大佬Boogipop和天璇大佬A.R.
嘿嘿
题目

InvokeUtils能够调用任意bean中的方法
SpringContextHolder就是获取上下文中的bean
然后过滤了flagTestService这个bean
提示

思维历程
在最开始我就想知道有什么bean我能够调用
然后动态注册bean出来后,查了资料,问了gpt,在这个过程中我大概记住了beanFactory,Definition这些字眼
然后在debug过程中偶然找到了,于是顺藤摸瓜找到已有的bean(运气比较好

springframework那些太长的都不了解,直接略过
然后找到一个hutool,感觉出现在这里肯定有用

发现了注册bean的方法

接着困扰的问题又来了,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

思路其实到这里就结束了,但是实操上这里会出现问题
主要还是InvokeUtils这个工具类的问题
Method beanMethod = (Method)Arrays.stream(beanObject.getClass().getMethods()).filter((method) -> {
return method.getName().equals(methodName);
}).findFirst().orElse((Object)null);当获取多态的方法时会有随机性,无法指定对应参数的方法

刚开始我本地通了,然后拿去题目结果报错了,我还以为是不同系统的问题
拿去vps上跑一下,也不行,然后debug
结果发现走的根本不是上面那个方法,而是下面的需要传charset
主要当时不知道有随机性,然后就换exec方法,继续在vps上debug
但是这个方法没回显,然后中途老是卡死,重新启动服务后发现走的又是另外的exec方法
这才知道原来有随机性
没办法,只能不断重启题目了
做题


如果报错就重启题目,直到能够执行命令
总结
还是挺有意思的,感觉还是运气比较好,困扰我的三个难题都经过灵光一现解决了
希望自己多沉淀,了解点更深的技术,我现在对java只知道最常见的反序列化。。。。。