1. 极安网首页
  2. 网络安全技术

weblogic无文件webshell的技术研究

漏洞分析基于 weblogic 12.2.1.4

weblogic FilterChain实现,创建一个Filter,随便打一个断点,观察此时的堆栈信息,如图

weblogic无文件webshell的技术研究-极安网

通过跟踪堆栈信息,我们可以找到,在wrapRun函数中,会判断系统中是否存在filter以及listener。如果存在,则获取FilterChain,然后依次调用Filter。原理与tomcat类似。相关代码如下

  1. weblogic.servlet.internal.WebAppServletContext.ServletInvocationAction#wrapRun 函数
  2. if (!invocationContext.hasFilters() && !invocationContext.hasRequestListeners()) {
  3.     this.stub.execute(this.req, this.rsp);
  4. else {
  5.     FilterChainImpl fc = invocationContext.getFilterChain(this.stub, this.req, this.rsp);
  6.     if (fc == null) {
  7.         this.stub.execute(this.req, this.rsp);
  8.     } else {
  9.         fc.doFilter(this.req, this.rsp);
  10.     }
  11. }

而getFilterChain的代码在 weblogic.servlet.internal.FilterManager中。weblogic中主要使用FilterManager去管理系统中的Filter,包括动态注册一个Filter,获取FilterChain等。动态注册一个Filter的代码如下

  1. void registerFilter(String filterName, String filterClassName, String[] urlPatterns, String[] servletNames, Map initParams, String[] dispatchers) throws DeploymentException {
  2.         FilterWrapper fw = new FilterWrapper(filterName, filterClassName, initParams, this.context);
  3.         if (this.loadFilter(fw)) {
  4.             EnumSet<DispatcherType> types = FilterManager.FilterInfo.translateDispatcherType(dispatchers, this.context, filterName);
  5.             if (urlPatterns != null) {
  6.                 this.addMappingForUrlPatterns(filterName, types, true, urlPatterns);
  7.             }
  8.             if (servletNames != null) {
  9.                 this.addMappingForServletNames(filterName, types, true, servletNames);
  10.             }
  11.             this.filters.put(filterName, fw);
  12.         }
  13.     }

原创文章,作者: Admin ,转载请注明出处:https://secvery.com/3622.html