梦の博客 欢迎来到我的破站
歌曲封面 未知作品

网站已运行 362 天 20 小时 30 分

Powered by Typecho & Sunny

2 online · 53 ms

Title

Java代码审计之命令执行

云梦

·

Article

java.lang.Runtime执行命令

1、使用说明

java.lang提供了一系列对 Java 编程至关重要的类。具体提供的类可看:https://docs.oracle.com/javase/7/docs/api/java/lang/package-summary.html

其中 Runtime 是 java.lang 中的一个类,主要是与操作系统交互执行操作命令。

而在java.lang.Runtime中我们主要关注exec()方法,使用该方法执行具体的命令,而执行exec()方法有以下六种重载形式,可以传入不同的数据类型的参数,如下图所示:

方法英文释义中文释义(非标准)
exec(String[] cmdarray)Executes the specified command and arguments in a separate process.在单独的进程中执行指定的命令和参数。
exec(String command)Executes the specified string command in a separate process.在单独的进程中执行指定的字符串命令。
exec(String command, String[] envp, File dir)Executes the specified string command in a separate process with the specified environment and working directory.在具有指定环境和工作目录的单独进程中执行指定的字符串命令。
exec(String command, String[] envp)Executes the specified string command in a separate process with the specified environment.在具有指定环境的单独进程中执行指定的字符串命令。
exec(String[] cmdarray, String[] envp)Executes the specified command and arguments in a separate process with the specified environment.在具有指定环境的单独进程中执行指定的命令和参数。
exec(String[] cmdarray, String[] envp, File dir)Executes the specified command and arguments in a separate process with the specified environment and working directory.在具有指定环境和工作目录的单独进程中执行指定的命令和参数。

java.lang.Runtime 的 API 文档https://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html

目前我们只先关注exec(String command)exec(String[] cmdarray)这两种执行方式。

下面通过示例代码来理解。

1.1、exec(String command)

在单独的进程中执行指定的字符串命令。

简单来说就是直接执行字符串命令。

♾️ java 代码:
//简易示例代码
String command = "whoami";
Runtime.getRuntime().exec(command)

1.2、exec(String[] cmdarray)

在单独的进程中执行指定的命令和参数。

简单来说就是以数组的形式接收多个字符串然后执行。

♾️ java 代码:
//简易示例代码
String[] command = { "cmd", "/c", "whoami" };
Runtime.getRuntime().exec(command)

三、java.lang.ProcessBuilder执行命令

1、使用说明

在上面介绍了java.lang。java.lang.Runtime是其中的一个API。而java.lang.ProcessBuilder也是java.lang中的一个API。该类主要用于创建操作系统进程。具体介绍可查看:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html

java.lang.ProcessBuilder中我们要关注command()方法,可通过该方法设置要执行的命令参数。以及start()方法,简单来说使用该方法可以执行命令。以及

1.1、command()方法

官方原文介绍:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#command()

command()方法主要用于设置要执行的命令。

command()方法传参有两种方式,一种是可变的字符串(简单说就是可以传入普通字符串,或者字符串数组),另一种是字符串列表,

♾️ java 代码:
//简易示例代码
ProcessBuilder p = new ProcessBuilder();
p.command("calc");

1.2、start()方法

官方原文介绍:https://docs.oracle.com/javase/7/docs/api/java/lang/ProcessBuilder.html#start()

使用start()方法可以创建一个新的具有命令,或环境,或工作目录,或输入来源,或标准输出和标准错误输出的目标,或redirectErrorStream属性的进程。
新进程中调用的命令和参数有command()方法设置,工作目录将由directory()方法设置,进程环境将由environment()设置。

在使用command()方法设置执行命令参数后,然后由start()方法创建一个新的进程进而在系统中执行了我们设置的命令。

这么看来java.lang.ProcessBuilder#start()Runtime.exec(String[] cmdarray, String[] envp, File dir)有些相似。

♾️ java 代码:
//简易示例代码
Process cmd = new ProcessBuilder(command).start();

四、java.lang.UNIXProcess/ProcessImpl执行命令

1、使用说明

首先对于UNIXProcessProcessImpl可以理解本就是一个东西,因为在 JDK9 的时候把UNIXProcess合并到了ProcessImpl当中了。具体可查看:https://hg.openjdk.java.net/jdk-updates/jdk9u/jdk/rev/98eb910c9a97

UNIXProcessProcessImpl最终都是调用native执行系统命令的类,这个类提供了一个叫forkAndExec的native方法,如方法名所述主要是通过fork&exec来执行本地系统命令。

UNIXProcess类是*nix系统在 java 程序中的体现,可以使用该类创建新进程,实现与”fork”类似的功能(对于Windows系统,使用的是java.lang.ProcessImpl类)

ProcessImpl 是更为底层的实现,Runtime和ProcessBuilder执行命令实际上也是调用了ProcessImpl这个类。

对于 ProcessImpl 类,我们不能直接调用需要配合使用反射。因为 java.lang.ProcessImpl 代码都被 private 封装起来了。并没有设置公共的 API 接口。

现在已有 0 条评论,0 人点赞
Comment
发表
搜 索 消 息 足 迹
你还不曾留言过..
你还不曾留下足迹..
博主