題目連結:https://buuoj.cn/challenges#[護網杯 2018]easy_tornado
開啟環境後如下所示。
依次訪問。
這裡需要留意一下 url,在訪問 flag.txt 時,發現 url 為:/file?filename=/flag.txt&filehash=f37c974391ee4a7bc4a23cc8987e0eed。
嘗試將 filehash 引數更改掉,發現被重定向到:/error?msg=Error。
關注到 welcome.txt 的內容:render,並且題目名為:tornado,可以知道,本題的考點是模板注入。
模板引擎(這裡特指用於 Web 開發的模板引擎)是為了使使用者介面與業務資料(內容)分離而產生的,它可以生成特定格式的文件,利用模板引擎來生成前端的 HTML 程式碼。模板引擎會提供一套生成 HTML 程式碼的程式,然後只需要獲取使用者的資料,然後放到渲染函式里,然後生成模板 + 使用者資料的前端 HTML 頁面,然後反饋給瀏覽器,呈現在使用者面前。模板引擎也會提供沙箱機制來進行漏洞防範,但是可以用沙箱逃逸技術來進行繞過。
SSTI 就是伺服器端模板注入(Server-Side Template Injection)。當前使用的一些框架,比如 Python 的 Flask,PHP 的 ThinkPHP,Java 的 Spring 等一般都採用成熟的的 MVC 的模式,使用者的輸入先進入 Controller 控制器,然後根據請求型別和請求的指令傳送給對應 Model 業務模型進行業務邏輯判斷,資料庫存取,最後把結果返回給 View 檢視層,經過模板渲染展示給使用者。漏洞成因是服務端接收了使用者的惡意輸入以後,未經任何處理就將其作為 Web 應用模板內容的一部分,模板引擎在進行目標編譯渲染的過程中,執行了使用者插入的可以破壞模板的語句,因而可能導致了敏感資訊洩露、程式碼執行、GETSHELL 等問題。其影響範圍主要取決於模版引擎的複雜性。凡是使用模板的地方都可能會出現 SSTI 的問題,SSTI 不屬於任何一種語言,沙盒繞過也不是,沙盒繞過只是由於模板引擎發現了很大的安全漏洞,然後模板引擎設計出來的一種防護機制,不允許使用沒有定義或者宣告的模組,這適用於所有的模板引擎。
因此,參考:Tornado模板注入。在 msg 處插入注入程式碼,Payload:error?msg={{handler.settings}}
,成功輸出了 cookie_secret。
依照 hints.txt 的提示進行計算,計算出 filehash 為:70bc8d34f07c4b64e65b21a92cd10c85。
訪問:/file?filename=/fllllllllllllag&filehash=70bc8d34f07c4b64e65b21a92cd10c85,即可獲得 flag。