作者:RicterZ@云鼎實驗室

9 月 19 日,騰訊云安全中心監測到 Apache Tomcat 修復了2個嚴重級別的漏洞, 分別為: 信息泄露漏洞(CVE-2017-12616)、遠程代碼執行漏洞(CVE-2017-12615),在某些場景下,攻擊者將分別能通過這兩個漏洞,獲取用戶服務器上 JSP 文件的源代碼,或是通過精心構造的攻擊請求,向用戶服務器上傳惡意 JSP 文件,通過上傳的 JSP 文件 ,可在用戶服務器上執行任意代碼。

云鼎實驗室通過對于漏洞描述,搭建漏洞環境,并對其進行復現。此漏洞為高危漏洞,即使是非默認配置,但是一旦存在漏洞,那么攻擊者可以成功上傳 Webshell,并控制服務器。

復現

根據描述,在 Windows 服務器下,將 readonly 參數設置為 false 時,即可通過 PUT 方式創建一個 JSP 文件,并可以執行任意代碼。

通過閱讀 conf/web.xml 文件,可以發現:

默認 readonly 為 true,當 readonly 設置為 false 時,可以通過 PUT / DELETE 進行文件操控。

配置 readonly 為 false:

啟動 Tomcat,利用 PUT 請求創建文件:

提示 404。通過描述中的 Windows 受影響,可以結合 Windows 的特性。其一是 NTFS 文件流,其二是文件名的相關限制(如 Windows 中文件名不能以空格結尾)來繞過限制:

訪問發現可以正常輸出:

分析

Tomcat 的 Servlet 是在 conf/web.xml 配置的,通過配置文件可知,當后綴名為 .jsp 和 .jspx 的時候,是通過 JspServlet 處理請求的:

而其他的靜態文件是通過 DefaultServlet 處理的:

可以得知,“1.jsp ”(末尾有一個和空格)并不能匹配到 JspServlet,而是會交由 DefaultServlet 去處理。當處理 PUT 請求時:

會調用 resources.bind

dirContext 為 FileDirContext:

調用 rebind 創建文件:

又由于 Windows 不允許“ ”作為文件名結尾,所以會創建一個 .jsp 文件,導致代碼執行。

Bypass 分析

然而,經過黑盒測試,當 PUT 地址為/1.jsp/時,仍然會創建 JSP,會影響 Linux 和 Windows 服務器,并且 Bypass 了之前的補丁,分析如下。

在進入 bind 函數時,會聲明一個 File 變量:

進入 File 后,會對 name 進行 normalize

最后得到的 path 就是沒有最后 / 的 path 了:

影響

由于存在去掉最后的 / 的特性,那么這個漏洞自然影響 Linux 以及 Windows 版本。而且經過測試,這個漏洞影響全部的 Tomcat 版本,從 5.x 到 9.x 無不中槍。目前來說,最好的解決方式是將 conf/web.xml 中對于 DefaultServlet 的 readonly 設置為 true,才能防止漏洞。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/398/