Tomcat 竟爆出高危漏洞?Tomcat-Ajp 協議漏洞分析

漏洞背景

安全公告編號:CNTA-2020-0004

2020年02月20日, 360CERT 監測發現 國家信息安全漏洞共享平臺(CNVD) 收錄了 CNVD-2020-10487 Apache Tomcat文件包含漏洞。

CNVD-2020-10487/CVE-2020-1938是文件包含漏洞,xxx者可利用該高危漏洞讀取或包含 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服務器的兩種方式:

8fc49db7bc7c4223b58d1f3ef1663c61


3.2 代碼分析

漏洞產生的主要位置在處理Ajp請求內容的地方

org.apache.coyote.ajp.AbstractAjpProcessor.java#prepareRequest()

dd129fd542ad4eefacabb0414d038150


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

21583f2fb97742c88fdc62377d282957


SC_A_REQ_REMOTE_PORT對應的是AJP_REMOTE_PORT,這裏指的是對遠程端口的轉發,Ajp13並沒有轉發遠程端口,但是接受轉發的數據作爲遠程端口。

5fd249e636c245a0bc97ebcb73276e99


於是這裏我們可以進行對Ajp設置特定的屬性,封裝爲request對象的Attribute屬性 比如以下三個屬性可以被設置

javax.servlet.include.request_urijavax.servlet.include.path_infojavax.servlet.include.servlet_path

3.3 任意文件讀取

3859f551786a42389473dc982745079a


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

8790df53f32d4d8abdd7411f9a5201c4


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

94a05808243b4fada245e46e76b99cf7


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

411933f8f31e416ba5c956b0ef94b284


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

4cb0b498048e46dcace104e279d7eb67


3.4 命令執行

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

071bb2c7d4884484ab9b131b9307462c


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

d4020663dff14af4b414121100e3d0c1


漏洞演示: 造成rce

3630c16abc5f4b7494922e5188adcdc2


修復建議

Apache Tomcat 6 已經停止維護,請升級到最新受支持的 Tomcat 版本以免遭受漏洞影響,請更新到如下Tomcat 版本:

9402f909e2f54fc4a1d91823f2654d8b


下載鏈接如下:

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

覺得文章不錯就給小老弟點個關注吧,更多內容陸續奉上。

最後,分享一份面試寶典《Java核心知識點整理.pdf》,覆蓋了JVM、鎖、高併發、反射、Spring原理、微服務、Zookeeper、數據庫、數據結構等等。加入我的粉絲羣(Java架構技術棧:644872653獲取免費領取方式。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章