Play Franmework框架漏洞|涉及多個區塊鏈項目

尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️

加入LINE好友

Play Framework是一個開源Star10k+的Web應用框架,使用Scala和Java語言混合編寫。該框架具有可擴展、資源消耗低等特點。我們發現該框架涵蓋客戶人群包括遊戲公司EA、領英、沃爾瑪、三星等多家知名公司。同時我們發現部分區塊鏈錢包項目中也使用到了該框架,該漏洞可能會導致竊取錢包秘鑰等問題

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

漏洞編號

CVE-2018-13864

影響範圍

Play Framework 2.6.12-2.6.15

漏洞詳情

當應用程序在Windows上運行時,Play Assets控制器未正確處理路徑。然後,這將應用程序暴露給路徑遍歷漏洞利用。

在Play Framework的 routes 文件中可以看到靜態資源解析路由的配置信息

# Map static resources from the /public folder to the /assets URL path GET /assets/*file controllers.Assets.at(path=”/public”, file)

該路由調用 controllers.Assets.at 函數將 /assets/* 指向文件目錄 /public ,即可解析該目錄中的CSS、JS文件等。跟蹤controllers.Assets.at 函數

漏洞文件:

:/framework/src/play/src/main/scala/play/api/controllers/Assets.scala

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

跟蹤 assetAt 函數

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

這里使用 resourceNameAt 函數獲取標準化的文件名,跟蹤該函數

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

esourceNameAt 函數首先會將文件路徑進行URL解碼,然後將 path 與 decodedFile進行拼接然後通過 removeExtraSlashes 函數將雙斜杠//替換成單斜杠/,拿到最終的絕對路徑。

但是後面有路徑標準化判斷,會判斷文件路徑標準化後的前綴是否為 /public/ ,跟蹤一下 fileLikeCanonicalPath 函數看看都幹了什麼

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

該函數中以「/」為分隔符將路徑進行分隔,然後對數組進行遍歷,如果碰到「..」就刪除前一個數組元素,達到標準化路徑

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

既然代碼中是以「/」分隔,在Windows環境中,我們可以使用反斜杠「\」進行繞過,這樣不會刪掉前面目錄,達到跨目錄的效果,而且前綴依然是 /public/,滿足標準化路徑的判斷。

我們發現在Scala版與Java版均受該漏洞影響。

在官網下載了Scala版的聊天室Demo(https://github.com/playframework/play-scala-chatroom-example/tree/2.6.x),在Windows下使用sbt運行該源碼。

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

抓取一個靜態文件,然後找到項目編譯後對應的文件路徑

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

構造payload,讀取項目目錄中的 build.sbt 文件試試,這個文件正常是訪問不到的

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

400報錯,查了一下發現是akka http不允許特殊符號,那我們進行URL編碼

Play Franmework框架漏洞|涉及多個區塊鏈項目-雪花新聞

成功跨目錄讀取到了其他文件。

修復方案

升級到Playframework >=2.6.16版本