阿里云WebShell伏魔挑战赛新思路挖掘
一、前言 去年的Webshell引擎检测绕过思路分享中,主要介绍了当下主流引擎对WebShell检测引擎的几种检测方法,再针对各个检测方法,逐一的利用Java语法的trick去进行绕过。重心放在了检测引擎的行为上,依赖对Java语法和trick的先验知识进行绕过。在今年的比赛中,去年文中列出的绕过方法基本上已经被引擎修复完成。结合今年比赛的经历,分享一下在已有的trick都被ban,如何从0研究出新的绕过思路,把重心转移到Webshell本身上,通过分析jsp的解析过程,挖掘绕过方法。 二、jsp解析逻辑 Tomcat处理jsp的核心的逻辑是它实现了一个处理jsp的Servlet:org.apache.jasper.servlet.JspServlet,这个Servlet处理所有以jsp为后缀的请求。 public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... try { boolean precompile = this.preCompile(request); this.serviceJspFile(request, response, jspUri, precompile); } catch (IOException | ServletException | RuntimeException var5) { Exception e = var5; throw e; } catch (Throwable var6) { Throwable e = var6; ExceptionUtils.handleThrowable(e); throw new ServletException(e); } } 当我们上传一个jsp文件后,在这个service处下断点,然后请求这个jsp,跟进代码,程序在org.apache.jasper.servlet.JspServletWrapper中调用如下代码进行编译 this.ctxt.compile(); 这是一个JspCompilationContext对象,它在JspServletWrapper的构造方法中被生成,其中jspuri是文件名,options保存了jsp文件的参数信息。 this.ctxt = new JspCompilationContext(jspUri, options, config.getServletContext(), this, rctxt); 整个从jsp到生成class的编译过程都是发生在JspCompilationContext的compile方法中 public void compile() throws JasperException, FileNotFoundException { this....