Spring Messaging 遠程命令執行漏洞(CVE-2018-1270)
Path spring/CVE-2018-1270
spring messaging為spring框架提供消息支持,其上層協議是STOMP,底層通信基于SockJS,
在spring messaging中,其允許客戶端訂閱消息,并使用selector過濾消息。selector用SpEL表達式編寫,并使用StandardEvaluationContext解析,造成命令執行漏洞。
參考鏈接:
- https://pivotal.io/security/cve-2018-1270
- https://xz.aliyun.com/t/2252
- https://cert.#/warning/detail?id=3efa573a1116c8e6eed3b47f78723f12
- https://github.com/CaledoniaProject/CVE-2018-1270
漏洞環境
執行如下命令啟動漏洞環境:
docker-compose up -d
環境啟動后,訪問http://your-ip:8080即可看到一個Web頁面。
漏洞復現
網上大部分文章都說spring messaging是基于websocket通信,其實不然。spring messaging是基于sockjs(可以理解為一個通信協議),而sockjs適配多種瀏覽器:現代瀏覽器中使用websocket通信,老式瀏覽器中使用ajax通信。
連接后端服務器的流程,可以理解為:
所以我們可以使用http來復現漏洞,稱之為“降維打擊”。
我編寫了一個簡單的POC腳本exploit.py(需要用python3.6執行),因為該漏洞是訂閱的時候插入SpEL表達式,而對方向這個訂閱發送消息時才會觸發,所以我們需要指定的信息有:
- 基礎地址,在vulhub中為
http://your-ip:8080/gs-guide-websocket - 待執行的SpEL表達式,如
T(java.lang.Runtime).getRuntime().exec('touch /tmp/success') - 某一個訂閱的地址,如vulhub中為:
/topic/greetings - 如何觸發這個訂閱,即如何讓后端向這個訂閱發送消息。在vulhub中,我們向
/app/hello發送一個包含name的json,即可觸發這個事件。當然在實戰中就不同了,所以這個poc并不具有通用性。
根據你自己的需求修改POC。如果是vulhub環境,你只需修改1中的url即可。
執行:

進入容器docker-compose exec spring bash,可見/tmp/success已成功創建:

Vulhub 文檔