|
| 1 | +# CVE-2018-1270 |
| 2 | + |
| 3 | +## 漏洞介绍 |
| 4 | + |
| 5 | +2018年4月5日漏洞公布: https://pivotal.io/security/cve-2018-1270 |
| 6 | + |
| 7 | + |
| 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 | + |
| 25 | + |
| 26 | +## 漏洞复现 |
| 27 | + |
| 28 | +`制作的gif太垃圾了~~` |
| 29 | + |
| 30 | + |
| 31 | + |
| 32 | +可以看到成功执行了弹出计算器 |
| 33 | + |
| 34 | +## 漏洞分析 |
| 35 | + |
| 36 | +我们在靶机中点击Connect后,在app.js中,有如下代码,会建立起Websocket连接: |
| 37 | + |
| 38 | + |
| 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 | + |
| 48 | + |
| 49 | +在我框框下面有一句`String selector = SimpMessageHeaderAccessor.getFirstNativeHeader(this.getSelectorHeaderName(), headers);` |
| 50 | +我们就去看看这个`selector`是什么,通过调试去查看 |
| 51 | + |
| 52 | + |
| 53 | + |
| 54 | +发现是`T(java.lang.Runtime).getRuntime().exec('calc')`也就是命令执行的语句 |
| 55 | + |
| 56 | +查看调用栈,发现web应用在`handleMessageInternal`对消息进行处理,在`registerSubscription`中注册用户信息,最后调用`addSubscriptionInternal`对`header` |
| 57 | +参数进行处理,并对`selector`进行解析并将其保存到这次会话中。 |
| 58 | + |
| 59 | +而这一步就将表达式存放到`expression`中 |
| 60 | + |
| 61 | + |
| 62 | + |
| 63 | +而要执行这个表达式,我们就只需要去调用`getValue()`方法执行 |
| 64 | + |
| 65 | + |
| 66 | + |
| 67 | +可以看到`context`的值来自`message`,而message中就有我们的命令执行 |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | +然后我们跟到这一步就直接执行了 |
| 72 | + |
| 73 | + |
| 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 | +
|
0 commit comments