1

我正在探索一段代码中的一些安全问题,并想知道是否有办法打破System.out.println("");语句并将字符串视为可执行代码?

因此,例如,我有以下两行:

String exit = "System.exit(0);";
System.out.println(exit);

"System.exit(0);"因此,我希望 JVM 将其视为可执行代码,而不是打印到控制台。甚至可能吗?如果是这样,是否有人对如何做到这一点有想法?

谢谢

4

4 回答 4

7

甚至可能吗?

不。

并非没有首先故意弄乱您的 JVM 等。

于 2012-04-11T00:47:24.097 回答
2

对的,这是可能的。它在概念上很容易,但实施起来却极其困难。我不会测试我的答案,所以它很可能是完全错误的。

编写自定义 PrintStream 类。此 PrintStream 应为每个输入行生成一个字符串,例如

public class Xid implements Runnable { public void run ( ) { line } }

其中 id 对于每一行都是唯一的,而 line 是该行的文本。

然后它应该将该文本发送到编译器。

然后它应该加载类 Xid 并创建它的实例并运行它。

在你有一个这样的 PrintStream 类之后,你创建它的一个实例out并使用System.setOut(out)

于 2012-04-11T01:12:18.890 回答
2

这是可能的:

  1. 使用您想要的任何代码生成 java 源文件。
  2. 执行“javac”编译
  3. 使用类加载器将字节码加载到 JVM
  4. 执行类(即调用方法)。

现在用一个接受字符串的方法编写一个类,执行所有这 4 个步骤:

JavaInterpreter.execute("System.exit(0);");
于 2012-04-11T00:48:29.500 回答
0

我正在探索一段代码中的一些安全问题,并想知道是否有办法突破 System.out.println(""); 语句并将字符串视为可执行代码?

根据埃默里的回答,可以做到这一点。但是,为了做到这一点,您首先必须能够将代码注入应用程序 (*)。如果你可以注入代码,还有更简单的方法可以关闭 JVM。所以:

  • 这并不代表您的 Java 应用程序中存在新的安全风险,并且
  • 这不是破坏其他人的 Java 应用程序的明智方法。

* 这种代码注入可能需要使用一些现有的或新的 Java 安全漏洞,或者它可能只是涉及修改 Java 应用程序的源代码或构建过程,或者在主机计算机受到攻击后修改应用程序的字节码。

于 2012-04-11T04:05:20.600 回答