Tomcat 爆出高危漏洞!可導致網站、數據泄露!附解決方案
- 2020 年 3 月 4 日
- 筆記
作者 | anquanke 來源 | anquanke.com/post/id/199448
漏洞背景
安全公告編號:CNTA-2020-0004
2020年02月20日, 360CERT 監測發現 國家資訊安全漏洞共享平台(CNVD) 收錄了 CNVD-2020-10487 Apache Tomcat文件包含漏洞
CNVD-2020-10487/CVE-2020-1938是文件包含漏洞,攻擊者可利用該高危漏洞讀取或包含 Tomcat 上所有 webapp 目錄下的任意文件,如:webapp 配置文件或源程式碼等。受影響的版本包括:Tomcat 6,Tomcat 7的7.0.100以下版本,Tomcat 8的8.5.51以下版本,Tomcat 9的9.0.31以下版本。
CNVD 對該漏洞的綜合評級為「高危」。
影響版本
1、Apache Tomcat 9.x < 9.0.31 2、Apache Tomcat 8.x < 8.5.51 3、Apache Tomcat 7.x < 7.0.100 4、Apache Tomcat 6.x
漏洞分析
3.1 AJP Connector
Apache Tomcat伺服器通過Connector連接器組件與客戶程式建立連接,Connector表示接收請求並返迴響應的端點。即Connector組件負責接收客戶的請求,以及把Tomcat伺服器的響應結果發送給客戶。在Apache Tomcat伺服器中我們平時用的最多的8080埠,就是所謂的Http Connector,使用Http(HTTP/1.1)協議
在conf/server.xml文件里,他對應的配置為
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" />
而 AJP Connector,它使用的是 AJP 協議(Apache Jserv Protocol)是定向包協議。因為性能原因,使用二進位格式來傳輸可讀性文本,它能降低 HTTP 請求的處理成本,因此主要在需要集群、反向代理的場景被使用。
Ajp協議對應的配置為
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Tomcat伺服器默認對外網開啟該埠 Web客戶訪問Tomcat伺服器的兩種方式:

3.2 程式碼分析
漏洞產生的主要位置在處理Ajp請求內容的地方org.apache.coyote.ajp.AbstractAjpProcessor.java#prepareRequest()

這裡首先判斷SCAREQ_ATTRIBUTE,意思是如果使用的Ajp屬性並不在上述的列表中,那麼就進入這個條件

SCAREQREMOTEPORT對應的是AJPREMOTEPORT,這裡指的是對遠程埠的轉發,Ajp13並沒有轉發遠程埠,但是接受轉發的數據作為遠程埠。

於是這裡我們可以進行對Ajp設置特定的屬性,封裝為request對象的Attribute屬性 比如以下三個屬性可以被設置
javax.servlet.include.request_uri javax.servlet.include.path_info javax.servlet.include.servlet_path
3.3 任意文件讀取

當請求被分發到org.apache.catalina.servlets.DefaultServlet#serveResource()方法

調用getRelativePath方法,需要獲取到request_uri不為null,然後從request對象中獲取並設置pathInfo屬性值和servletPath屬性值

接著往下看到getResource方法時,會把path作為參數傳入,獲取到文件的源碼

漏洞演示:讀取到/WEB-INF/web.xml文件

3.4 命令執行
當在處理 jsp 請求的uri時,會調用 org.apache.jasper.servlet.JspServlet#service()

最後會將pathinfo交給serviceJspFile處理,以jsp解析該文件,所以當我們可以控制伺服器上的jsp文件的時候,比如存在jsp的文件上傳,這時,就能夠造成rce

漏洞演示:造成rce

修復建議 與 下載地址:
更新到如下Tomcat 版本
Tomcat 分支 |
版本號 |
---|---|
Tomcat 7 |
7.0.0100 |
Tomcat 8 |
8.5.51 |
Tomcat 9 |
9.0.31 |
Apache Tomcat 6 已經停止維護,請升級到最新受支援的 Tomcat 版本以免遭受漏洞影響。
7.0.100版本:https://tomcat.apache.org/download-70.cgi
8.5.51版本:https://tomcat.apache.org/download-80.cgi
9.0.31版本 https://tomcat.apache.org/download-90.cgi