Tomcat进程注入技术复现

最近学习了一下tomcat进程注入技术,其原理在于Java在Java SE5后引入了Java Instrumentation,该功能指的是可以用独立于应用程序之外的代理程序来监测和协助包括但不限于获取JVM运行时状态,替换和修改类定义等。这里主要利用GitHub上rebeyond的memShell工程对该技术进行复现。

技术关键点

我们希望通过访问web服务器上的任意一个url,无论该url是静态资源抑或jsp文件,无论是原生servlet还是struts action,甚至无论它是否存在,只要我们传递请求给tomcat,tomcat就能响应我们的指令。要实现这一目的,必须找到一个关键的类,这个类要尽可能在http请求调用栈的上方,又不能与具体的URL有耦合,且还能接受客户端request中的数据。分析后发现,org.apache.catalina.core.ApplicationFilterChain类的internalDoFilter方法最符合要求,internalDoFilter方法的原型如下:

private void internalDoFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {}

该方法有ServletRequest和ServletResponse两个参数,里面封装了用户请求的request和response,同时internalDoFilter方法也是自定义filter的入口:

private void internalDoFilter(ServletRequest request, ServletResponse response)
        throws IOException, ServletException {

        //Call the next filter if there is one
        if (pos < n) {
            ApplicationFilterConfig filterConfig = filters[pos++];
            Filter filter = null;
            try {
                filter = filterConfig.getFilter();
                support.fireInstanceEvent(InstanceEvent.BEFORE_FILTER_EVENT,
                                          filter, request, reponse);

                ...

                if ( Global.IS_SECURITY_ENABLED ) {
                    final ServletRequest req = request;
                    final ServletResponse res = response;
                    Principal principal = 
                        ((HttpServletRequest) req).getUserPrincipal();

                    Object[] args = new Object[]{req, res, this};
                    SecurityUtil.doAsPrivilege
                        ("doFilter", filter, classType, args, principal);

                } else {
                    filter.doFilter(request, response, this);
点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖