我正在探索一段代码中的一些安全问题,并想知道是否有办法打破System.out.println("");
语句并将字符串视为可执行代码?
例如,我有以下两行:
String exit = "System.exit(0);";
System.out.println(exit);
因此,我希望JVM将其视为可执行代码,而不是将"System.exit(0);"
打印到控制台。它甚至可能吗?如果是的话,有没有人有关于如何做的想法?
谢谢
答案 0 :(得分:7)
甚至可能吗?
没有
不是没有先故意弄乱你的JVM等等。
答案 1 :(得分:2)
有可能:
现在用一个接受字符串的方法编写一个类,执行所有这四个步骤:
JavaInterpreter.execute("System.exit(0);");
答案 2 :(得分:2)
是的,这是可能的。它在概念上很容易实现,但实施起来非常困难。我不会测试我的答案,所以这可能是完全错误的。
编写自定义PrintStream类。这个PrintStream应该为每个输入行生成一个像
这样的字符串public class Xid implements Runnable { public void run ( ) { line } }
其中id对于每一行都是唯一的,而line是该行的文本。
然后它应该将该文本发送给编译器。
然后它应该加载类Xid并创建它的实例并运行它。
在您拥有类似的PrintStream类之后,您可以创建它的实例out
并使用System.setOut(out)。
答案 3 :(得分:0)
我正在探索一段代码中的一些安全问题,并且想知道是否有办法打破System.out.println(“”);声明并将字符串视为可执行代码?
根据埃默里的回答,可以做到这一点。但是,为了做到这一点,您首先必须能够将代码注入应用程序(*)。如果你可以注入代码,那么有更简单的方法可以关闭JVM。所以:
*此代码注入可能需要使用一些现有的或新的Java安全漏洞,或者它可能只涉及修改Java应用程序的源代码或构建过程,或者在主机损坏后修改应用程序的字节码。 / SUP>