尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
Play Framework是一個開源Star10k+的Web應用框架,使用Scala和Java語言混合編寫。該框架具有可擴展、資源消耗低等特點。我們發現該框架涵蓋客戶人群包括遊戲公司EA、領英、沃爾瑪、三星等多家知名公司。同時我們發現部分區塊鏈錢包項目中也使用到了該框架,該漏洞可能會導致竊取錢包秘鑰等問題
漏洞編號
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
跟蹤 assetAt 函數
這里使用 resourceNameAt 函數獲取標準化的文件名,跟蹤該函數
esourceNameAt 函數首先會將文件路徑進行URL解碼,然後將 path 與 decodedFile進行拼接然後通過 removeExtraSlashes 函數將雙斜杠//替換成單斜杠/,拿到最終的絕對路徑。
但是後面有路徑標準化判斷,會判斷文件路徑標準化後的前綴是否為 /public/ ,跟蹤一下 fileLikeCanonicalPath 函數看看都幹了什麼
該函數中以「/」為分隔符將路徑進行分隔,然後對數組進行遍歷,如果碰到「..」就刪除前一個數組元素,達到標準化路徑
既然代碼中是以「/」分隔,在Windows環境中,我們可以使用反斜杠「\」進行繞過,這樣不會刪掉前面目錄,達到跨目錄的效果,而且前綴依然是 /public/,滿足標準化路徑的判斷。
我們發現在Scala版與Java版均受該漏洞影響。
在官網下載了Scala版的聊天室Demo(https://github.com/playframework/play-scala-chatroom-example/tree/2.6.x),在Windows下使用sbt運行該源碼。
抓取一個靜態文件,然後找到項目編譯後對應的文件路徑
構造payload,讀取項目目錄中的 build.sbt 文件試試,這個文件正常是訪問不到的
400報錯,查了一下發現是akka http不允許特殊符號,那我們進行URL編碼
成功跨目錄讀取到了其他文件。
修復方案
升級到Playframework >=2.6.16版本