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