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指令都进行了转义,自然是无法运行的。 

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luffy5459

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值