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))
,即先將filename
md5加密,再將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: