BUU-Web-[護(hù)網(wǎng)杯 2018]easy_tornado
前言
每做一次新類型的題,就是一個新的知識點,將知識點弄通,就是對自己的一次提升。
開工
對3個url都進(jìn)行訪問


每個請求頭都帶有file_name和filehash
再看第三個文件hints.txt中明確寫出了加密方式

這里我們就可以開始構(gòu)建代碼
但是我們發(fā)現(xiàn)輸出結(jié)果于filehash中的結(jié)果不同
我這邊誤以為cookie_secret就是header中的Cookie,以至于加密結(jié)果錯誤
與此同時,我們試著直接訪問/file?filename=/fllllllllllllag
得到了以下報錯結(jié)果

這里試著對msg進(jìn)行模版注入/error?msg={{1}}
模版注入:不正確的使用flask中的render_template_string方法會引發(fā)SSTI。
在Jinja2模板引擎中,{{}}是變量包裹標(biāo)識符。{{}}并不僅僅可以傳遞變量,還可以執(zhí)行一些簡單的表達(dá)式。
通過{{}}變量包裹符進(jìn)行簡單的表達(dá)式測試來判斷是否存在SSTI漏洞
例如{{config}}(查看flask全局變量),{{2*2}}

這里對下劃線做了過濾“_”因此無法直接通過命令獲取flag

通過查閱tornado的官方文檔


也就是說我們需要查找的cookie_secret是存放在對象self.application.settings["cookie_secret"]中

從后續(xù)的文檔中獲取到self.application.settings的別名為RequestHandler.setting



官方給出了能調(diào)用的對象的別名

可以發(fā)現(xiàn)我們需要調(diào)用的RequestHandler的別名是handler
因此settings的位置為[handler.settings]

獲取到cookie_secret后就直接將其放入上面寫好的加密程序中就可以計算出flag文件的hash值
最終獲取到flag


總結(jié)
本次主要就是考察了模版注入的基本知識,做法也較為簡單,起初一直沒搞明白handler是怎么來的,通過逐步查閱官方文檔發(fā)現(xiàn)這個是官方定義的別名。
主要知識點
模版注入(SSTI)
tornado中功能類的別名