<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    Spring Messaging 遠程命令執行漏洞(CVE-2018-1270)

    Path spring/CVE-2018-1270

    spring messaging為spring框架提供消息支持,其上層協議是STOMP,底層通信基于SockJS,

    在spring messaging中,其允許客戶端訂閱消息,并使用selector過濾消息。selector用SpEL表達式編寫,并使用StandardEvaluationContext解析,造成命令執行漏洞。

    參考鏈接:

    漏洞環境

    執行如下命令啟動漏洞環境:

    docker-compose up -d

    環境啟動后,訪問http://your-ip:8080即可看到一個Web頁面。

    漏洞復現

    網上大部分文章都說spring messaging是基于websocket通信,其實不然。spring messaging是基于sockjs(可以理解為一個通信協議),而sockjs適配多種瀏覽器:現代瀏覽器中使用websocket通信,老式瀏覽器中使用ajax通信。

    連接后端服務器的流程,可以理解為:

    1. STOMP協議將數據組合成一個文本流
    2. sockjs協議發送文本流,sockjs會選擇一個合適的通道:websocket或xhr(http),與后端通信

    所以我們可以使用http來復現漏洞,稱之為“降維打擊”。

    我編寫了一個簡單的POC腳本exploit.py(需要用python3.6執行),因為該漏洞是訂閱的時候插入SpEL表達式,而對方向這個訂閱發送消息時才會觸發,所以我們需要指定的信息有:

    1. 基礎地址,在vulhub中為http://your-ip:8080/gs-guide-websocket
    2. 待執行的SpEL表達式,如T(java.lang.Runtime).getRuntime().exec('touch /tmp/success')
    3. 某一個訂閱的地址,如vulhub中為:/topic/greetings
    4. 如何觸發這個訂閱,即如何讓后端向這個訂閱發送消息。在vulhub中,我們向/app/hello發送一個包含name的json,即可觸發這個事件。當然在實戰中就不同了,所以這個poc并不具有通用性。

    根據你自己的需求修改POC。如果是vulhub環境,你只需修改1中的url即可。

    執行:

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

    本文章首發在 網安wangan.com 網站上。

    上一篇 下一篇
    討論數量: 0
    只看當前版本


    暫無話題~
    亚洲 欧美 自拍 唯美 另类