一、漏洞描述
Apache與Tomcat都是Apache開源組織開發(fā)的用于處理HTTP服務(wù)的項目,兩者都是免費的,都可以做為獨立的Web服務(wù)器運行。
Apache Tomcat服務(wù)器存在文件包含漏洞,攻擊者可利用該漏洞讀取或包含 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默認(rèn)的conf/server.xm l中配置了2個Connector,一個為8080的對外提供的HTTP協(xié)議端口,另外一個就是默認(rèn)的8009 AJP協(xié)議端口,兩個端口默認(rèn)均監(jiān)聽在外網(wǎng)ip。
如下圖:

tomcat在接收ajp請求的時候調(diào)用org.apache.coyote.ajp.AjpProcessor來處理ajp消息,prepareRequest將ajp里面的內(nèi)容取出來設(shè)置成request對象的Attribute屬性
如下圖:

因此可以通過此種特性從而可以控制request對象的下面三個Attribute屬性
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
然后封裝成對應(yīng)的request之后,繼續(xù)走servlet的映射流程如下圖所示:

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

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

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

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

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

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