1. 眼熟的计算器:Java反序列化与黑名单绕过的实战
这题一上来就挺有意思的,一个看起来平平无奇的在线计算器,但背后藏着Java反序列化的坑。我拿到题目后,第一反应就是去反编译那个JAR包看看源码。果然,里面有个黑名单机制,把java.lang.Runtime和new这些关键字给禁了,想直接执行命令?没门儿。
但咱们搞安全的,最擅长的就是“绕”。黑名单这玩意儿,本质上就是个猫鼠游戏,你禁你的,我绕我的。我当时的思路是,既然不能直接new一个Runtime对象,那我能不能用反射(Reflection) 来曲线救国呢?反射是Java里一个非常强大的特性,它允许程序在运行时获取类的信息并动态调用方法,很多时候能绕过编译期的限制。
我写了个JavaScript的Payload,核心思路是这样的:先把java.lang.Runtime这个类名拆开,用字符串拼接绕过关键字检测,比如'java.lang.Run' + 'time'。然后通过Java.type()动态加载这个类。获取到Runtime类之后,再用getRuntime()方法拿到实例。执行命令的部分和正常情况一样,runtime.exec('cat /flag')。但这里又有个小麻烦,黑名单也禁了new关键字,我怎么创建Scanner对象来读取命令执行结果呢?
还是得靠反射。我通过Scanner.class.getConstructor()拿到了Scanner的构造方法对象,然后关键的一步来了:不能用new,那就用构造方法对象的newInstance方法来创建实例。但newInstance这个词本身也可能被过滤,所以我又用了字符串拼接,把'n'、


173

被折叠的 条评论
为什么被折叠?



