一、漏洞描述
Apache與Tomcat都是Apache開源組織開發(fā)的用于處理HTTP服務(wù)的項(xiàng)目,兩者都是免費(fèi)的,都可以做為獨(dú)立的Web服務(wù)器運(yùn)行。
Apache Tomcat服務(wù)器存在文件包含漏洞,攻擊者可利用該漏洞讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,如:webapp 配置文件或源代碼等。
二、漏洞危害等級(jí)
高
三、影響版本
該文件包含漏洞影響以下版本:
- 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個(gè)Connector,一個(gè)為8080的對(duì)外提供的HTTP協(xié)議端口,另外一個(gè)就是默認(rèn)的8009 AJP協(xié)議端口,兩個(gè)端口默認(rèn)均監(jiān)聽在外網(wǎng)ip。
如下圖:

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

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

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

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

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

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

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

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