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處理請求的: ?
?
可以得知,“1.jsp ”(末尾有一個和空格)并不能匹配到?JspServlet,而是會交由DefaultServlet去處理。當處理 PUT 請求時:
?
會調用resources.rebind:
?
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,才能防止漏洞。
?