Tomcat PUT高危漏洞(CVE-2017-12615)復現與分析


一、漏洞復現:

  • 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,只讀模式。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM