@@ -3,9 +3,11 @@ category: 代码审计
33tag : Java
44---
55
6- # 2-Java代码审计基础 -命令执行
6+ # 2-Java 代码审计基础 -命令执行
77
8- Java调用外部可执行程序或系统命令,主要有以下两种调用方式
8+ <!-- more -->
9+
10+ Java 调用外部可执行程序或系统命令,主要有以下两种调用方式
911
1012``` java
11131 、Runtime . getRuntime(). exec
@@ -17,11 +19,11 @@ Java调用外部可执行程序或系统命令,主要有以下两种调用方
1719
1820### 1.1 简介
1921
20- ` Runtime.getRuntime().exec ` 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能和windows “运行”类似。
22+ ` Runtime.getRuntime().exec ` 用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。功能和 windows “运行”类似。
2123
2224- ` Runtime ` 是一个单例的实例
2325- ` Runtime ` 运行应用程序与运行应用程序的环境进行交互
24- - ` Runtime ` 是Java运行时环境 ,应用程序不能创建属于自己的实例,需要通过` getRuntime() ` 方法获取
26+ - ` Runtime ` 是 Java 运行时环境 ,应用程序不能创建属于自己的实例,需要通过` getRuntime() ` 方法获取
2527
2628调用方式如下:
2729
@@ -33,15 +35,11 @@ private Process exec(String command) throws IOException {
3335}
3436```
3537
36- ` command ` 是要执行的命令,` Runtime.getRuntime() ` 返回当前应用程序的` Runtime ` 对象,该对象的` exec() ` 方法指示Java虚拟机创建一个子进程执行指定的可执行程序 ,并返回与该子进程对应的` Process ` 对象实例。通过` Process ` 可以控制该子进程的执行或获取该子进程的信息。` Procss ` 类将持有该程序返回Java VM的引用 。这个` Procss ` 类是一个抽象类,具体子类的实现依赖于不同的底层操作系统。
38+ ` command ` 是要执行的命令,` Runtime.getRuntime() ` 返回当前应用程序的` Runtime ` 对象,该对象的` exec() ` 方法指示 Java 虚拟机创建一个子进程执行指定的可执行程序 ,并返回与该子进程对应的` Process ` 对象实例。通过` Process ` 可以控制该子进程的执行或获取该子进程的信息。` Procss ` 类将持有该程序返回 Java VM 的引用 。这个` Procss ` 类是一个抽象类,具体子类的实现依赖于不同的底层操作系统。
3739
3840> ` Runtime.exec() ` 不是` cmd ` 或` shell ` 环境,因此无法直接调用` dir ` 等命令,需要在程序中读取运行的操作系统平台,以调用不同的命令解释器(NT:cmd.exe,windows 95/98:command.exe,linux:/bin/sh)
3941
40-
41-
42-
43-
44- ### 1.2 方法API
42+ ### 1.2 方法 API
4543
4644` Runtime.getRuntime().exec ` 共有六个重载方法:
4745
@@ -53,8 +51,8 @@ private Process exec(String command) throws IOException {
53516 . ` public Process exec(String[] cmdarray, String[] envp, File dir) ` // 在指定环境和工作目录的独立进程中执行指定的命令和变量
5452
5553` cmdarray ` :包含所调用命令及其参数的数组。数组第一个元素是命令,其余是参数
56- ` envp ` :字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,则该参数为null
57- ` dir ` :子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为null
54+ ` envp ` :字符串数组,其中每个元素的环境变量的设置格式为 name=value,如果子进程应该继承当前进程的环境,则该参数为 null
55+ ` dir ` :子进程的工作目录;如果子进程应该继承当前进程的工作目录,则该参数为 null
5856
5957参数` cmdArray ` 示例:
6058
@@ -119,15 +117,13 @@ public class RuntimeTest {
119117
120118```
121119
122-
123-
124120## 2、ProcessBuilder
125121
126122### 2.1 简介
127123
128- ` ProcessBuilder ` 类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法,是J2SE 1.5在 ` java.lang ` 中新添加的一个新类,之前都是由Process类处理实现进程的控制管理 。
124+ ` ProcessBuilder ` 类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法,是 J2SE 1.5 在 ` java.lang ` 中新添加的一个新类,之前都是由 Process 类处理实现进程的控制管理 。
129125
130- 每个` ProcessBuilder ` 实例管理一个进程属性集合。` start() ` 方法使用这些属性创建一个新的流程实例。可以从同一个实例多次调用start ()方法,以创建具有相同或相关属性的新子进程。` ProcessBuilder ` 的构造方法接收一个命令参数的数组形式,其中,第一个元素代表要执行的系统命令,后面的元素代表要传给该命令的参数。
126+ 每个` ProcessBuilder ` 实例管理一个进程属性集合。` start() ` 方法使用这些属性创建一个新的流程实例。可以从同一个实例多次调用 start ()方法,以创建具有相同或相关属性的新子进程。` ProcessBuilder ` 的构造方法接收一个命令参数的数组形式,其中,第一个元素代表要执行的系统命令,后面的元素代表要传给该命令的参数。
131127
132128例如
133129
@@ -167,7 +163,7 @@ public class ProcessBuilderTest {
167163
168164```
169165
170- test.py如下
166+ test.py 如下
171167
172168``` python
173169import os
@@ -177,34 +173,34 @@ def runcmd(cmd):
177173 return result
178174
179175if __name__ == ' __main__' :
180- result = runcmd(" calc" )
176+ result = runcmd(" calc" )
181177 print (result)
182178```
183179
184180运行结果
185181
186182![ image-20231017224619085] ( ./img/2-commandExecute/image-20231017224619085.png )
187183
188- 或者cmd改成ipconfig
184+ 或者 cmd 改成 ipconfig
189185
190186![ image-20231017231030708] ( ./img/2-commandExecute/image-20231017231030708.png )
191187
192- ### 2.2 方法API
188+ ### 2.2 方法 API
193189
194190构造方法
195191
196- - ` ProcessBuilder(List<String> command) ` 利用指定的操作系统程序和参数构造一个进程生成器。
192+ - ` ProcessBuilder(List<String> command) ` 利用指定的操作系统程序和参数构造一个进程生成器。
197193- ` ProcessBuilder(String… command) ` 利用指定的操作系统程序和参数构造一个进程生成器。
198194
199- - 方法摘要
195+ - 方法摘要
200196 ` command() ` 返回此进程生成器的操作系统程序和参数。设置此过程构建器的操作系统程序和参数。此方法不会复制命令列表。该列表的后续更新将反映在流程构建器的状态中。不检查命令是否对应于有效的操作系统命令。
201- - ` command(List<String> command) ` 设置此进程生成器的操作系统程序和参数。
202- - ` command(String… command) ` 设置此进程生成器的操作系统程序和参数。
203- - ` directory() ` 返回此进程生成器的工作目录。
204- - ` directory(File directory) ` 设置此进程生成器的工作目录。
205- - ` environment() ` 返回此进程生成器环境的字符串映射视图。 environment方法获得运行进程的环境变量,得到一个Map ,可以修改环境变量
206- - ` redirectErrorStream() ` 通知进程生成器是否合并标准错误和标准输出。如果该属性为真,则由该对象的` start() ` 方法启动的子进程生成的任何错误输出都将与标准输出合并,以便两者都可以使用` Process.getInputStream() ` 方法读取。这使得将错误消息与相应的输出关联起来更容易,而从 ` Process.getErrorStream() ` 返回的流读取将直接到达文件尾,初始值为false 。
207- - ` redirectErrorStream(boolean redirectErrorStream) ` 设置此进程生成器的 redirectErrorStream 属性。
197+ - ` command(List<String> command) ` 设置此进程生成器的操作系统程序和参数。
198+ - ` command(String… command) ` 设置此进程生成器的操作系统程序和参数。
199+ - ` directory() ` 返回此进程生成器的工作目录。
200+ - ` directory(File directory) ` 设置此进程生成器的工作目录。
201+ - ` environment() ` 返回此进程生成器环境的字符串映射视图。 environment 方法获得运行进程的环境变量,得到一个 Map ,可以修改环境变量
202+ - ` redirectErrorStream() ` 通知进程生成器是否合并标准错误和标准输出。如果该属性为真,则由该对象的` start() ` 方法启动的子进程生成的任何错误输出都将与标准输出合并,以便两者都可以使用` Process.getInputStream() ` 方法读取。这使得将错误消息与相应的输出关联起来更容易,而从 ` Process.getErrorStream() ` 返回的流读取将直接到达文件尾,初始值为 false 。
203+ - ` redirectErrorStream(boolean redirectErrorStream) ` 设置此进程生成器的 redirectErrorStream 属性。
208204- ` start() ` 使用此进程生成器的属性启动一个新进程。
209205
210206完整例子:
@@ -241,4 +237,3 @@ public class ProcessBuilderTest {
241237 }
242238}
243239```
244-
0 commit comments