0


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

我们在使用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进行编码,那么这里反而会报出另一个错误。
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://blog.csdn.net/feinifi/article/details/129763343
版权归原作者 luffy5459 所有, 如有侵权,请联系我们删除。

“java中Runtime.exec()可能带来的命令注入安全问题的解决办法”的评论:

还没有评论