CVE-2018-1270,CVE-2018-1273:Spring Expression Language 漏洞分析

本文深入分析了Spring框架中的两个重大漏洞CVE-2018-1270和CVE-2018-1273,它们源于Spring Expression Language(SpEL)的滥用。攻击者可通过构造恶意请求参数触发远程代码执行。文章详细探讨了SpEL的类类型表达式、类实例化以及如何利用这些功能发起攻击,并给出了实战案例和修复建议,包括使用华为云WAF防护、漏洞扫描服务和升级Spring框架版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0x00 背景

 

 

最近Spring框架不大太平,接连爆出来多个RCE远程代码执行的CVE漏洞,其中有CVE-2018-1270,CVE-2018-1273,通过对造成漏洞部分代码进行分析,发现都是因为滥用SpEL的StandardEvaluationContext。

 

0x01 漏洞影响

攻击者可以在未获得授权的情况下,将精心制作的请求参数注入到存在该漏洞的服务器上,从而发起远程代码执行攻击。

受影响的范围

· Spring Data Commons 1.13 - 1.13.10 (Ingalls SR10)

· Spring Data REST 2.6 - 2.6.10 (Ingalls SR10)
· Spring Data Commons 2.0 to 2.0.5 (Kay SR5)
· Spring Data REST 3.0 - 3.0.5 (Kay SR5)
· 更早的版本也会受到影响

 

0x02 SpEL

 

 

SpEL是一门非常简单的表达式语言,但是功能或者权限来说太大了,因此这里如果表达式能够被外部污染,基本上都可以造成RCE。

SpEL的具体语法,我这里就不一一介绍了,详情参考官方文档。我这里只说两个能够被有效利用的点。

关于CVE-2018-1270的信息似乎并未直接提供于所给的参考资料中,而提到的是其他类似的Spring Data REST漏洞CVE-2017-8046和CVE-2018-1273。然而,在讨论这些相似类型的漏洞时,可以推测CVE-2018-1270可能也涉及到了SpEL(Spring Expression Language)表达式的不安全处理,这通常意味着应用程序未能正确验证或转义用户输入的数据就将其作为表达式的一部分来解析。 对于CVE-2017-8046而言,该漏洞存在于Spring Data REST 2.6到2.6.10版本以及特定版本的Spring Data Commons中[^1]。当通过PATCH请求更新资源属性时,如果路径参数未经过适当的安全检查就被传递给了`setValue()`函数,则可能导致恶意构造的JSON Patch文档中的数据被执行为SpEL表达式,从而允许远程代码执行。 至于CVE-2018-1273,受影响的是Spring Data Commons及其关联组件的不同版本范围内。此漏洞同样源于对用户提交的内容缺乏足够的防护措施,使得攻击者能够利用精心设计的HTTP POST请求向服务器发送含有恶意SpEL表达式的payload,进而控制应用逻辑甚至操作系统层面的操作[^5]。 尽管这里没有具体描述CVE-2018-1270的技术细节,但从上述两个案例可以看出,这类RCE(Remote Code Execution, 远程代码执行)漏洞往往依赖于以下几个方面: - **易受攻击的应用程序接口**:通常是那些接受来自客户端未经充分校验的数据并试图动态评估它们的地方。 - **存在缺陷的功能模块**:比如在此处提及的支持RFC6902标准的JSON-Patch操作或是某些形式的对象映射机制。 要复现这样的漏洞,一般建议遵循如下指导原则而不是具体的步骤说明: ### 准备工作 #### 构建实验环境 建立一个隔离且可控的实验室环境非常重要,这样可以在不影响生产系统的前提下探索潜在风险。可以选择Docker容器化部署方式快速搭建目标软件栈,并确保安装了已知存在问题的具体版本号的服务端件。 ```bash docker pull vulhub/spring:cve-2017-8046 # 或者针对不同漏洞选择合适的镜像标签 docker run -d --name spring-vuln-app -p 8080:8080 vulhub/spring:cve-2017-8046 ``` > 注意:以上命令仅作为一个例子展示如何启动带有指定漏洞的应用实例;实际操作前应查阅官方资料确认适用于CVE-2018-1270的最佳实践方案。 #### 获取必要的工具集 准备好用于发起网络请求的工具,例如curl、Postman或其他任何支持自定义HTTP头字段设置的API调试器。另外还需要具备一定的编程能力以便编写脚本来自动化测试过程。 ### 测试流程 #### 发送特制请求 基于之前了解到的知识点,尝试构造能触发内部错误响应或者异常行为的有效载荷。由于本问题是围绕着SpEL表达式的滥用展开的,因此应该特别关注能否让服务端解释特殊字符序列(如`${}`包围起来的部分)为合法语句。 ```json { "field": "${T(java.lang.Runtime).getRuntime().exec('touch /tmp/exploit_worked')}" } ``` 这段JSON片段展示了怎样嵌入一段简单的Java反射调用来创建文件标记以证明概念可行性。当然,真实场景下的有效负载可能会更加复杂多变,取决于待测平台特性及权限级别等因素的影响。 #### 验证结果反馈 最后一步就是观察系统反应情况,看是否成功实现了预期之外的动作。可以通过查看日志记录、监控进程状态变化亦或是直接检验物理存储介质上的新实体等方式来进行判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值