Tomcat PUT高危漏洞(CVE-2017-12615)復現與分析
阿新 • • 發佈:2020-07-21
一、漏洞復現:
- 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,只讀模式。