当前位置:   article > 正文

java中Runtime.exec()可能带来的命令注入安全问题的解决办法_runtime.getrintime().exe(path) 安全问题解决方法

runtime.getrintime().exe(path) 安全问题解决方法

    我们在使用Runtime.getRuntime().exec()的时候,可以指定一个命令或者脚本,让它执行,类似于调用系统指令来进行完成一项任务。

    但是这个方法如果有安全检查,它会被报出一个Command Injection的风险,也就是命令注入的风险,因为命令可能是外部传入,这个时候,正常的命令都不会有任何问题,但是如果被人恶意指定,比如删除系统服务,删除一些特定目录等的操作,就可能造成非常严重的后果。

    所以,一般对于Runtime.exec()这里,需要使用一些安全框架来进行安全检查,一般推荐使用的是 org.owasp.esapi 下的esapi库来进行过滤。

    首先引入依赖:

  1. <dependency>
  2. <groupId>org.owasp.esapi</groupId>
  3. <artifactId>esapi</artifactId>
  4. <version>2.5.1.0</version>
  5. </dependency>

    除此之外,在java中使用,一定要额外引入三个配置文件,它们分别是:ESAPI.properties,validation.properties,esapi-java-logging.properties 。这三个属性配置文件缺一不可,缺少任何一个都会报错。地址在这里:https://github.com/ESAPI/esapi-java-legacy/tree/develop/configuration/esapi

    这三个配置文件放入resources目录。

   java示例:

  1. package com.xxx.hello.util;
  2. import org.owasp.esapi.codecs.WindowsCodec;
  3. import org.owasp.esapi.reference.DefaultEncoder;
  4. import java.io.IOException;
  5. public class ProcessExecutor {
  6. private static final String CMD_PREFIX = "cmd.exe /c start ";
  7. public static int execCommand(String command) throws IOException, InterruptedException {
  8. Runtime runtime = Runtime.getRuntime();
  9. String secureCmd = DefaultEncoder.getInstance().encodeForOS(new WindowsCodec(), command);
  10. System.out.println("secure command -> " + secureCmd);
  11. Process exec = runtime.exec(CMD_PREFIX + secureCmd);
  12. return exec.waitFor();
  13. }
  14. }

    这是一个方法,我们要在别的地方调用,这里会传入一个指令或者脚本,我测试的时候,传入的是bin\test.bat,也就是当前项目下的bin目录中的一个test.bat脚本,这是在windows上的测试。

    我们运行,可以看打印信息:

 

    打印信息里面,一个是在类路径CLASSPATH下加载到了ESAPI.properties文件,这就是上面提到的ESAPI配置文件放在resources目录下的原因。

    另外一个是控制台打印的命令信息是bin^\test^.bat,可以看出,通过DefaultEncoder.encodeForOS(new WindowsCodec(), command)进行编码的时候,对命令中的特殊字符都进行了一个转义,这里"^"就是批处理脚本中的转义字符,和一般转义字符"\"有区别。

    这里需要注意的是,我们只需要对有可能产生风险的部分进行编码,而不是对整个exec(command)命令进行编码,如果我们把这里cmd.exe /c start bin\test.bat进行编码,那么这里反而会报出另一个错误。

  1. secure command -> cmd^.exe^ ^/c^ start^ bin^\test^.bat
  2. may be file not found,Cannot run program "cmd^.exe^": CreateProcess error=2, 系统找不到指定的文件。

    这里对整个命令进行编码,最后连cmd.exe指令都进行了转义,自然是无法运行的。 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/309218
推荐阅读
相关标签
  

闽ICP备14008679号