原生的Java自带命令执行

1、Runtime.exec
一个标准的Runtime.exec的代码demo

  1. import java.io.*;
  2. public class Main {
  3. public static void main(String[] arg) throws IOException {
  4. String command="cmd /c whoami";
  5. Process proc = Runtime.getRuntime().exec(command);
  6. InputStream in = proc.getInputStream();
  7. BufferedReader br = new BufferedReader(new InputStreamReader(in, "UTF8"));
  8. String line = null;
  9. while((line=br.readLine())!=null) {
  10. System.out.println(line);
  11. }
  12. }
  13. }

其中exec存在两种方式的传参,分别为字符串和数组

  1. 数组形式
  2. String[] command={"cmd","/c"," whoami|dir"};
  3. Runtime.getRuntime().exec(cmommand);
  4. Runtime.getRuntime().exec(new String[]{"cmd", "/c", "whoami"});
  5. 也可以直接字符串形式
  6. String command="cmd /c whoami|dir";
  7. Runtime.getRuntime().exec(cmommand);

Runtime.exec的底层是调用了ProccessBuilder.start。

2、ProccessBuilder.start

  1. ProcessBuilder pb = new ProcessBuilder("whoami");
  2. pb.start();

3、ProcessImpl
Runtime和ProcessBuilder执行命令实际上调用了也是ProcessImpl类
可以通过反射调用来进行命令执行

  1. Class clazz = Class.forName("java.lang.ProcessImpl");
  2. Method method = clazz.getDeclaredMethod("start", String[].class, Map.class, String.class, Redirect[].class, boolean.class);
  3. method.setAccessible(true);
  4. Process e = (Process) method.invoke(null, new String[]{"calc"}, null, ".", null, true);

https://xz.aliyun.com/t/6503

值得注意的反射命令执行

image.png
image.png
我们可以看到图一是一个使用反射普通调用了addCommand,然后str为传入的参数,假设这个反射类的Servlet
CommandServlet,那么如果没有进行严格对类进行控制的话,我们就可以调用Java.lang.Runtime.exec来执行任意命令。

如下代码显示,可以看到非常明显的Java反射调用类,传入参数执行命令。

  1. import java.lang.reflect.Constructor;
  2. import java.lang.reflect.Method;
  3. import java.util.*;
  4. import java.io.*;
  5. public class exec {
  6. public static void main(String args[]) {
  7. try {
  8. String name="java.lang.Runtime";
  9. String method="exec";
  10. String str="calc";
  11. Class getCommandClass = Class.forName(name);
  12. Constructor constructor = getCommandClass.getDeclaredConstructor();
  13. constructor.setAccessible(true);
  14. Object getInstance = constructor.newInstance();
  15. // 获取类⽅法
  16. Method getCommandMethod = getCommandClass.getDeclaredMethod(method, String.class);
  17. getCommandMethod.setAccessible(true);
  18. // 调⽤类⽅法
  19. Object mes = getCommandMethod.invoke(getInstance, str);
  20. } catch (Throwable t) {
  21. t.printStackTrace();
  22. }
  23. }
  24. }

如何修复呢,严格设置权限即可
例如把强制反射给删了就好了。
constructor.setAccessible(true);

EL表达式

EL表达式之前学过了

第三方组件

最终也是需要一个runtime或者processbuild等Java原始命令执行命令

JS第三方执行命令

可执行js
Java-ScriptEngineManager

groovy第三方执行命令

需要groovy-all的pom.xml依赖包
groovyshell.evaluate
我们在平时代码审计里遇到的话就找这个POM或者相关的jar就好了,这个遇到的不多

模板渲染SSTI

https://www.yuque.com/iceqaq/rtn9q7/ramqal