一、漏洞描述
Tomcat是Apache開源組織開發的用於處理HTTP服務的項目,兩者都是免費的,都可以做為獨立的Web服務器運行。Apache Tomcat服務器存在文件包含漏洞,攻擊者可利用該漏洞讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,如:webapp 配置文件或源代碼等。
二、漏洞危害等級
高
三、影響版本
Apache Tomcat 6
Tomcat 7 系列 < 7.0.100
Tomcat 8 系列 < 8.5.51
Tomcat 9 系列 < 9.0.31
四、漏洞原理
tomcat默認的conf/server.xml中配置了2個Connector,一個為8080的對外提供的HTTP協議端口,另外一個就是默認的8009 AJP協議端口,兩個端口默認均監聽在外網ip。
tomcat在接收ajp請求的時候調用org.apache.coyote.ajp.AjpProcessor來處理ajp消息,prepareRequest將ajp里面的內容取出來設置成request對象的Attribute屬性。可以通過此種特性從而可以控制request對象的下面三個Attribute屬性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到應用目錄下的任何文件。
五、漏洞復現
本地搭建tomcat環境,訪問127.0.0.1:8080。出現如圖內容,至此tomcat環境搭建完成。
POC項目地址:https://github.com/hypn0s/AJPy
六、漏洞修復
1、如未使用Tomcat AJP協議:
可以直接將 Tomcat 升級到 9.0.31、8.5.51或 7.0.100 版本進行漏洞修復。
如無法立即進行版本更新、或者是更老版本的用戶,建議直接關閉AJPConnector,或將其監聽地址改為僅監聽本機localhost。
具體操作:
(1)編輯 <CATALINA_BASE>/conf/server.xml,找到如下行(<CATALINA_BASE> 為 Tomcat 的工作目錄):
<Connector port="8009"protocol="AJP/1.3"redirectPort="8443"/>
(2)將此行注釋掉(也可刪掉該行):
<!--<Connectorport="8009"protocol="AJP/1.3"redirectPort="8443"/>-->
(3)保存后需重新啟動,規則方可生效。
2、如果使用了Tomcat AJP協議:
建議將Tomcat立即升級到9.0.31、8.5.51或7.0.100版本進行修復,同時為AJP Connector配置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"/>
如無法立即進行版本更新、或者是更老版本的用戶,建議為AJPConnector配置requiredSecret來設置AJP協議認證憑證。例如(注意必須將YOUR_TOMCAT_AJP_SECRET更改為一個安全性高、無法被輕易猜解的值):
<Connector port="8009"protocol="AJP/1.3"redirectPort="8443"address="YOUR_TOMCAT_IP_ADDRESS"requiredSecret="YOUR_TOMCAT_AJP_SECRET"/>