有没有办法逃离打印语句并将字符串变量视为java中的有效代码?

时间:2012-04-11 00:43:51

标签: java security

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

例如,我有以下两行:

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

因此,我希望JVM将其视为可执行代码,而不是将"System.exit(0);"打印到控制台。它甚至可能吗?如果是的话,有没有人有关于如何做的想法?

谢谢

4 个答案:

答案 0 :(得分:7)

  

甚至可能吗?

没有

不是没有先故意弄乱你的JVM等等。

答案 1 :(得分:2)

有可能:

  1. 使用您想要的任何代码生成java源文件。
  2. 执行“javac”编译
  3. 使用class-loader
  4. 将字节代码加载到JVM中
  5. 执行该类(即调用方法)。
  6. 现在用一个接受字符串的方法编写一个类,执行所有这四个步骤:

    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应用程序的明智方法。

*此代码注入可能需要使用一些现有的或新的Java安全漏洞,或者它可能只涉及修改Java应用程序的源代码或构建过程,或者在主机损坏后修改应用程序的字节码。 / SUP>