我们在使用Runtime.getRuntime().exec()的时候,可以指定一个命令或者脚本,让它执行,类似于调用系统指令来进行完成一项任务。
但是这个方法如果有安全检查,它会被报出一个Command Injection的风险,也就是命令注入的风险,因为命令可能是外部传入,这个时候,正常的命令都不会有任何问题,但是如果被人恶意指定,比如删除系统服务,删除一些特定目录等的操作,就可能造成非常严重的后果。
所以,一般对于Runtime.exec()这里,需要使用一些安全框架来进行安全检查,一般推荐使用的是 org.owasp.esapi 下的esapi库来进行过滤。
首先引入依赖:
<dependency>
<groupId>org.owasp.esapi</groupId>
<artifactId>esapi</artifactId>
<version>2.5.1.0</version>
</dependency>
除此之外,在java中使用,一定要额外引入三个配置文件,它们分别是:ESAPI.properties,validation.properties,esapi-java-logging.properties 。这三个属性配置文件缺一不可,缺少任何一个都会报错。地址在这里:https://github.com/ESAPI/esapi-java-legacy/tree/develop/configuration/esapi
这三个配置文件放入resources目录。
java示例:
package com.xxx.hello.util;
import org.owasp.esapi.codecs.WindowsCodec;
import org.owasp.esapi.reference.DefaultEncoder;
import java.io.IOException;
public class ProcessExecutor {
private static final String CMD_PREFIX = "cmd.exe /c start ";
public static int execCommand(String command) throws IOException, InterruptedException {
Runtime runtime = Runtime.getRuntime();
String secureCmd = DefaultEncoder.getInstance().encodeForOS(new WindowsCodec(), command);
System.out.println("secure command -> " + secureCmd);
Process exec = runtime.exec(CMD_PREFIX + secureCmd);
return exec.waitFor();
}
}
这是一个方法,我们要在别的地方调用,这里会传入一个指令或者脚本,我测试的时候,传入的是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进行编码,那么这里反而会报出另一个错误。文章来源:https://www.toymoban.com/news/detail-481155.html
secure command -> cmd^.exe^ ^/c^ start^ bin^\test^.bat
may be file not found,Cannot run program "cmd^.exe^": CreateProcess error=2, 系统找不到指定的文件。
这里对整个命令进行编码,最后连cmd.exe指令都进行了转义,自然是无法运行的。 文章来源地址https://www.toymoban.com/news/detail-481155.html
到了这里,关于java中Runtime.exec()可能带来的命令注入安全问题的解决办法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!