首页 > 其他 > 详细

Tomcat PUT高危漏洞(CVE-2017-12615)复现与分析

时间:2020-07-21 00:49:21      阅读:129      评论:0      收藏:0      [点我收藏+]

一、漏洞复现:

  • BurpSuite抓包,发送一个PUT的请求,数据包为冰蝎的马
  • 如果存在该漏洞,Response的状态码为201
  • 直接访问该文件,可以看到jsp马已经存在了
  • 使用冰蝎进行连接,获取系统的权限
    技术分享图片
    技术分享图片
    技术分享图片

二、漏洞原因:

  • 在tomcat/conf/web.xml文件中,Tomcat配置可写文件的选项,也就是readonly为false,默认的情况下是true。
<servlet>
        <servlet-name>default</servlet-name>
        <servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class>
        <init-param>
            <param-name>debug</param-name>
            <param-value>0</param-value>
        </init-param>
        <init-param>
            <param-name>listings</param-name>
            <param-value>false</param-value>
        </init-param>
        <init-param><param-name>readonly</param-name><param-value>false</param-value></init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

三、漏洞的原理

  • Tomcat在$CATALINA_BASE/conf/web.xml中默认定义了两个Servlet,JspServlet和DefaultServlet。
  • JspServlet负责处理.jsp和.jspx的所有JSP文件的请求,DefaultServlet是默认的Servlet,当客户端的请求不能匹配到其他的Servlet,例如我们自定义的Servlet时,将又DefaultServlet进行处理,所以,一般情况下,DeafultServlet将为我们处理图片、JavaScript文件、CSS文件。
  • 当我们的请求为“1.jsp/”时,不能匹配到JspServlet,Tomcat将会把这个请求交给DeafultServlet进行处理。
  • 用Java反编译工具打开apache-tomcat-7.0.90\lib\catalina.jar,查看org.apache.catalina.servlets.DefaultServlet这个类的doPut方法。
protected void doPut(HttpServletRequest req, HttpServletResponse resp)
    throws ServletException, IOException
  {
    if (this.readOnly)
    {
      resp.sendError(403);
      return;
    }
    String path = getRelativePath(req);
    
   .........

    try
    {
      Resource newResource = new Resource(resourceInputStream);
      if (exists) {
        this.resources.rebind(path, newResource);
      } else {
        this.resources.bind(path, newResource);
      }
    }
    catch (NamingException e)
    {
      result = false;
    }
   .........
  }
  • 生成文件的语句为 this.resources.bind(path, newResource);和 this.resources.rebind(path, newResource);,而this.resources对象是由init()的下面的代码实例化的
    技术分享图片

  • 点进ProxyDirContext找一下bind方法,可以看到这里面又用了this.dirContext.bind(),继续往下跟代码
    技术分享图片

  • 继续往下,最后跳到到了FileDirContext.java的bind(),这里面又调用rebind()方法
    技术分享图片
    技术分享图片

  • 最后通过rebind方法生成文件
    技术分享图片

三、总结:

  • 源码接收请求时没有将最后一个"/"进行过滤,创建File时,源码将"/2.jsp/"格式化成"/2.jsp"。
  • 漏洞的解决方法:将conf/web.xml的readonly设置成true,只读模式。

Tomcat PUT高危漏洞(CVE-2017-12615)复现与分析

原文:https://www.cnblogs.com/kimjun/p/13348063.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!