Apache Tomcat文件包含漏洞分析

發布時間 2020-02-21

一、漏洞概述


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屬性,如下圖所示:



通過分析復現發現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路徑。如下圖所示:



最后,會將path帶入到getResource(path)方法中造成任意文件讀取。如下圖所示:



利用該漏洞成功讀取到/WEB-INF/目錄下web.xml文件。



2.2 Jsp文件包含漏洞


當ajp URI設置為jsp路徑時,Tomcat會調用JspServlet的service方法處理,如下圖所示:



同樣會獲取javax.servlet.include.path_info、javax.servlet.include.servlet_path這兩個屬性(經過上面的分析我們已經知道可以通過ajp協議控制這兩個屬性)。將這兩個屬性對應的值拼接到jspURi變量中,最后交給serviceJspFile方法處理,如下圖所示:



Venus.txt文件代碼如下所示:



成功RCE結果如下圖所示:



三、影響版本


Tomcat 6

Tomcat 7

Tomcat 8

Tomcat 9


四、規避方案


將Tomcat立即升級到9.0.31、8.5.51或7.0.100版本進行修復。


禁用AJP協議。

編輯 /conf/server.xml,找到如下行:

<Connector port="8009"protocol="AJP/1.3" redirectPort="8443" />

將此行注釋掉(也可刪掉該行):

<!--<Connectorport="8009" protocol="AJP/1.3"redirectPort="8443" />-->


配置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"/>