Skip to content

Commit c40c661

Browse files
authored
Add files via upload
1 parent ad3fc73 commit c40c661

14 files changed

Lines changed: 88 additions & 0 deletions
4.82 MB
Binary file not shown.
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
# CVE-2018-1270
2+
3+
## 漏洞介绍
4+
5+
2018年4月5日漏洞公布: https://pivotal.io/security/cve-2018-1270
6+
7+
![image-20210220154332152](分析.assets/image-20210220154332152.png)
8+
9+
漏洞影响版本:
10+
11+
1. Spring Framework 5.0 to 5.0.4
12+
2. Spring Framework 4.3 to 4.3.14
13+
3. Older unsupported versions are also affected
14+
15+
Spring框架中通过spring-messaging模块来实现STOMP(Simple Text-Orientated Messaging
16+
Protocol),STOMP是一种封装WebSocket的简单消息协议。攻击者可以通过建立WebSocket连接并发送一条消息造成远程代码执行。
17+
18+
## 环境搭建
19+
20+
使用github地址搭建 https://github.com/Venscor/CVE-2018-1270
21+
22+
然后修改`app.js`
23+
24+
![image-20210220152220717](分析.assets/image-20210220152220717.png)
25+
26+
## 漏洞复现
27+
28+
`制作的gif太垃圾了~~`
29+
30+
![1](分析.assets/1.gif)
31+
32+
可以看到成功执行了弹出计算器
33+
34+
## 漏洞分析
35+
36+
我们在靶机中点击Connect后,在app.js中,有如下代码,会建立起Websocket连接:
37+
38+
![image-20210220154922801](分析.assets/image-20210220154922801.png)
39+
40+
其中`header`中可以指定了`selector`
41+
,根据 [Stomp Protocol Specification, Version 1.0](https://stomp.github.io/stomp-specification-1.0.html),通过指定对应的`selecttor`,可以对订阅的信息进行过滤:
42+
43+
然后我们寻找漏洞代码位置。
44+
45+
`org/springframework/messaging/simp/broker/DefaultSubscriptionRegistry.java` 对这个header参数进行了接受和处理:
46+
47+
![image-20210220160150498](分析.assets/image-20210220160150498.png)
48+
49+
在我框框下面有一句`String selector = SimpMessageHeaderAccessor.getFirstNativeHeader(this.getSelectorHeaderName(), headers);`
50+
我们就去看看这个`selector`是什么,通过调试去查看
51+
52+
![image-20210220160459956](分析.assets/image-20210220160459956.png)
53+
54+
发现是`T(java.lang.Runtime).getRuntime().exec('calc')`也就是命令执行的语句
55+
56+
查看调用栈,发现web应用在`handleMessageInternal`对消息进行处理,在`registerSubscription`中注册用户信息,最后调用`addSubscriptionInternal``header`
57+
参数进行处理,并对`selector`进行解析并将其保存到这次会话中。
58+
59+
而这一步就将表达式存放到`expression`
60+
61+
![image-20210220161508697](分析.assets/image-20210220161508697.png)
62+
63+
而要执行这个表达式,我们就只需要去调用`getValue()`方法执行
64+
65+
![image-20210220161825423](分析.assets/image-20210220161825423.png)
66+
67+
可以看到`context`的值来自`message`,而message中就有我们的命令执行
68+
69+
![image-20210220161931650](分析.assets/image-20210220161931650.png)
70+
71+
然后我们跟到这一步就直接执行了
72+
73+
![image-20210220162251047](分析.assets/image-20210220162251047.png)
74+
75+
官方介绍:点击`send`向服务器发送任意消息,Spring在向用户分发消息的时候会调用`filterSubscriptions`
76+
对信息进行过滤,就会执行命令`expression.getValue(context, Boolean.class))`
77+
78+
## 官方修复
79+
80+
漏洞本质在获得了非法的`context`从而执行了SpEL表达式。官方修复是将`context`替换成`messageEvalContext`,而使用这个`messageEvalContext`
81+
,就可以阻止`java.lang.Runtime``java.lang.ProcessBuilder`等类的解析,从而避免了执行命令。
82+
83+
## 参考
84+
85+
> https://xz.aliyun.com/t/2252
86+
>
87+
>https://blog.csdn.net/pacosonswjtu/article/details/51914567
88+
3.02 KB
Loading
16.8 MB
Loading
159 KB
Loading
83.5 KB
Loading
250 KB
Loading
873 KB
Loading
1020 KB
Loading
869 KB
Loading

0 commit comments

Comments
 (0)