一、漏洞描述
Apache與Tomcat都是Apache開源組織開發的用于處理HTTP服務的項目,兩者都是免費的,都可以做為獨立的Web服務器運行。
Apache Tomcat服務器存在文件包含漏洞,攻擊者可利用該漏洞讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,如:webapp 配置文件或源代碼等。
二、漏洞危害等級
高
三、影響版本
該文件包含漏洞影響以下版本:
- 7.*分支7.0.100之前版本,建議更新到7.0.100版本;
- 8.*分支8.5.51之前版本,建議更新到8.5.51版本;
- 9.*分支9.0.31之前版本,建議更新到9.0.31版本。
四、漏洞原理
tomcat默認的conf/server.xm l中配置了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
然后封裝成對應的request之后,繼續走servlet的映射流程如下圖所示:

其中具體的映射方式就簡略了,具體可以自己查看代碼.
五、兩種利用方式:
1、利用DefaultServlet實現任意文件下載
當url請求未在映射的url列表里面則會通過tomcat默認的DefaultServlet會根據上面的三個屬性來讀取文件,如下圖

通過serveResource方法來獲取資源文件

通過getRelativePath來獲取資源文件路徑

然后再通過控制ajp控制的上述三個屬性來讀取文件,通過操控上述三個屬性從而可以讀取到/WEB-INF下面的所有敏感文件,不限于class、xm l、jar等文件。
2、通過jspservlet實現任意后綴文件包含
當url(比如http://xxx/xxx/xxx.jsp)請求映射在org.apache.jasper.servlet.JspServlet這個servlet的時候也可通過上述三個屬性來控制訪問的jsp文件如下圖:

控制路徑之后就可以以jsp解析該文件 所以只需要一個可控文件內容的文件即可實現rce.
六、利用成功截圖

七、解決方案
1、臨時禁用AJP協議端口,在conf/server.xm l配置文件中注釋掉<Connector port=”8009″ protocol=”AJP/1.3″redirectPort=”8443″ />
2、配置ajp配置中的secretRequired跟secret屬性來限制認證