Apache Tomcat檔案包含漏洞分析

ADLab發表於2020-02-24
一、漏洞概述
2020年2月20日,國家資訊保安漏洞共享平臺(CNVD)釋出關於Apache Tomcat的安全公告,Apache Tomcat檔案包含漏洞(CNVD-2020-10487,對應CVE-2020-1938)。Tomcat AJP協議由於存在實現缺陷導致相關引數可控,攻擊者利用該漏洞可透過構造特定引數,讀取伺服器webapp下的任意檔案。若伺服器端同時存在檔案上傳功能,攻擊者可進一步實現遠端程式碼的執行。 
二、漏洞分析
   透過對Apache Tomcat原始碼進行分析,發現Tomcat在處理ajp協議時存在漏洞,可透過呼叫request.setAttribute為Tomcat設定任意request屬性,如下圖所示:
Apache Tomcat檔案包含漏洞分析
透過分析復現發現Tomcat ajp協議存在web目錄下任意檔案讀取漏洞以及JSP檔案包含漏洞。當ajp URI設定為非jsp路徑時,Tomcat會呼叫DefaultServlet處理,此時會導致web目錄任意檔案讀取漏洞。當ajp URI設定為jsp路徑時,Tomcat會呼叫JspServlet處理,此時會導致JSP檔案包含漏洞。
2.1 Web目錄任意檔案讀取漏洞
當ajp URI設定為非jsp路徑時,Tomcat會呼叫DefaultServlet處理,我們需要控制如下兩個屬性:
javax.servlet.include.path_info
javax.servlet.include.servlet_path
其中,javax.servlet.include.servlet_path屬性為當前專案路徑、javax.servlet.include.path_info屬性為目錄路徑。然後,透過DefaultServlet類的getRelativePath方法進行拼接獲得path路徑。如下圖所示:
Apache Tomcat檔案包含漏洞分析
最後,會將path帶入到getResource(path)方法中造成任意檔案讀取。如下圖所示:
Apache Tomcat檔案包含漏洞分析利用該漏洞成功讀取到/WEB-INF/目錄下web.xml檔案。
Apache Tomcat檔案包含漏洞分析
2.2 Jsp檔案包含漏洞
當ajp URI設定為jsp路徑時,Tomcat會呼叫JspServlet的service方法處理,如下圖所示:
Apache Tomcat檔案包含漏洞分析
同樣會獲取javax.servlet.include.path_info、javax.servlet.include.servlet_path這兩個屬性(經過上面的分析我們已經知道可以透過ajp協議控制這兩個屬性)。將這兩個屬性  對應的值拼接到jspURi變數中,最後交給serviceJspFile方法處理,如下圖所示:
Apache Tomcat檔案包含漏洞分析
Venus.txt檔案程式碼如下所示:
Apache Tomcat檔案包含漏洞分析
 成功RCE結果如下圖所示:
Apache Tomcat檔案包含漏洞分析
三、影響版本:
Tomcat 6
Tomcat 7
Tomcat 8
Tomcat 9
四、規避方案
(1)將Tomcat立即升級到9.0.31、8.5.51或7.0.100版本進行修復
(2)禁用AJP協議
編輯 /conf/server.xml,找到如下行:
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />
將此行註釋掉(也可刪掉該行):
<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->
(3)配置secret來設定AJP協議的認證憑證
例如(注意必須將YOUR_TOMCAT_AJP_SECRET更改為一個安全性高、無法被輕易猜解的值):
<Connector port="8009"protocol="AJP/1.3" redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS" secret="YOUR_TOMCAT_AJP_SECRET"/>。


Apache Tomcat檔案包含漏洞分析

相關文章