千家信息网

如何进行spring-messaging远程代码执行漏洞分析

发表于:2024-12-12 作者:千家信息网编辑
千家信息网最后更新 2024年12月12日,这篇文章给大家介绍如何进行spring-messaging远程代码执行漏洞分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。0x00 漏洞概述2018年4月5日,Pivotal
千家信息网最后更新 2024年12月12日如何进行spring-messaging远程代码执行漏洞分析

这篇文章给大家介绍如何进行spring-messaging远程代码执行漏洞分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

0x00 漏洞概述

2018年4月5日,Pivotal Spring官方发布安全公告,Spring框架中存在三个漏洞,其中编号为CVE-2018-1270的漏洞可导致远程代码执行。

360-CERT通过对此漏洞进行了相关分析,认为漏洞影响严重;目前相关PoC已经被发布,建议相关用户尽快进行评估升级。

0x01 漏洞影响面

影响版本
  1. Spring Framework 5.0 to 5.0.4.

  2. Spring Framework 4.3 to 4.3.14

  3. 已不支持的旧版本仍然受影响

修复版本
  1. 5.0.x 用户升级到5.0.5版本

  2. 4.3.x 用户升级到4.3.15版本

0x02 漏洞详情

CVE-2018-1270

Spring框架中通过spring-messaging模块来实现STOMP(Simple Text-Orientated Messaging Protocol),STOMP是一种封装WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行。如果使用了Spring Security项目中的权限认证,可以在一定程度上增加漏洞利用难度。

CVE-2018-1271

当Spring MVC的静态资源存放在Windows系统上时,攻击可以通过构造特殊URL导致目录遍历漏洞。

此漏洞触发条件较高:

  1. Server运行于Windows系统上

  2. 从文件系统提供的文件服务(比如使用file协议,但不是file open)

  3. 没有使用CVE-2018-1199漏洞的补丁

  4. 不使用Tomcat或者是WildFly做Server

CVE-2018-1272

在Spring MVC或者WebFlux应用把客户端请求再转向另一台服务器的场景下,攻击者通过构造和污染Multipart类型请求,可能对另一台服务器实现权限提升攻击。

0x03 CVE-2018-1270漏洞分析

SpEL

Spring表达式语言全称Spring Expression Language,支持查询和操作运行时对象导航图功能.。语法类似于传统EL,而且供额外的功能,能够进行函数调用和简单字符串的模板函数。

SpEL用法

String expression = "T(java.lang.Runtime).getRuntime().exec(/"calc/")";
String result = parser.parse_Expression(expression).getValue().toString();
漏洞触发流程

搭建spring-message 项目demo(https://github.com/spring-guides/gs-messaging-stomp-websocket

其中静态资源app.js运行在客户端与服务器做websocket交互,使用connect()函数建立Stomp链接

function connect() {
var socket = new SockJS('/gs-guide-websocket');
stompClient = Stomp.over(socket);
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function (greeting) {
showGreeting(JSON.parse(greeting.body).content);
});
});
}

Step1

增加一个header头部,添加selector项,value为payload,Stomp协议规范中通过指定selector对订阅的信息进行过滤

Web应用在handleMessageInternal对消息进行处理,注册订阅者registerSubscription,最后调用DefaultSubscriptionRegistry函数对header参数进行处理,对selector值进行了解析,并将其保存至这次会话中。

Step2

点击send向服务器发送任意消息。Spring 在向订阅者分发消息时会调用filterSubscription对消息进行过滤,会执行expression.getValue(context, Boolean.class)造成任意命令执行

补丁分析

补丁地址(https://github.com/spring-projects/spring-framework/commit/e0de9126ed8cf25cf141d3e66420da94e350708a#diff-ca84ec52e20ebb2a3732c6c15f37d37a

-import org.springframework.expression.spel.support.StandardEvaluationContext;
+import org.springframework.expression.spel.support.SimpleEvaluationContext;

删除了StandardEvaluationContext引用,采用了SimpleEvaluationContext , StandardEvaluationContext可以执行任意SpEL表达式,Spring官方在5.0.5之后换用SimpleEvaluationContext,用于实现简单的数据绑定,保持灵活性减少安全隐患

SimpleEvaluationContext地址(https://github.com/spring-projects/spring-framework/blob/v5.0.5.RELEASE/spring-expression/src/main/java/org/springframework/expression/spel/support/SimpleEvaluationContext.java

StandardEvaluationContext地址(https://github.com/spring-projects/spring-framework/blob/v5.0.5.RELEASE/spring-expression/src/main/java/org/springframework/expression/spel/support/StandardEvaluationContext.java

关于如何进行spring-messaging远程代码执行漏洞分析就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

0