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

2024-03-01 1582阅读

温馨提示:这篇文章已超过441天没有更新,请注意相关的内容是否还可用!

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

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

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

    首先引入依赖:

   org.owasp.esapi
   esapi
   2.5.1.0

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

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

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

   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上的测试。

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

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

    打印信息里面,一个是在类路径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指令都进行了转义,自然是无法运行的。 

VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]