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