0x01 前言

java.lang.Runtime 因为有一个 exec方法可以执行本地命令,所以该类常常用来执行本地系统命令。

通过前面我们已经学习了通过反射的各种方法,那么本章节就已该类作为一个例子,实现反射调用exec方法。

0x02 本地whoami

image.png

0x03 不使用反射执行本地命令的代码

  1. package 反射;
  2. import org.apache.commons.io.IOUtils;
  3. public class ExecCmdTest {
  4. public static void main(String[] args) {
  5. // 输出命令执行结果
  6. try {
  7. System.out.println(
  8. IOUtils.toString(
  9. Runtime.getRuntime().exec("whoami").getInputStream(),"UTF-8")
  10. );
  11. } catch (Exception e) {
  12. e.printStackTrace();
  13. }
  14. }
  15. }
  16. // 运行结果
  17. pmiaowu

0x04 通过反射调用Runtime执行exec

  1. package 反射;
  2. import org.apache.commons.io.IOUtils;
  3. import java.io.InputStream;
  4. import java.lang.reflect.Constructor;
  5. import java.lang.reflect.Method;
  6. public class ExecCmdTest {
  7. public static void main(String[] args) {
  8. try {
  9. // 获取Runtime类对象
  10. Class runtimeClass = Class.forName("java.lang.Runtime");
  11. // 获取构造方法
  12. Constructor runtimeConstructor = runtimeClass.getDeclaredConstructor();
  13. runtimeConstructor.setAccessible(true);
  14. // 创建Runtime类实例 相当于 Runtime r = new Runtime();
  15. Object runtimeInstance = runtimeConstructor.newInstance();
  16. // 获取Runtime的exec(String cmd)方法
  17. Method runtimeMethod = runtimeClass.getMethod("exec", String.class);
  18. // 调用exec方法 等于 r.exec(cmd); cmd参数输入要执行的命令
  19. Process p = (Process)runtimeMethod.invoke(runtimeInstance, "whoami");
  20. // 获取命令执行结果
  21. InputStream results = p.getInputStream();
  22. // 输出命令执行结果
  23. System.out.println(IOUtils.toString(results, "UTF-8"));
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. }
  29. // 运行结果
  30. pmiaowu