[護網杯 2018]easy_tornado
0x00
開啟網頁發現
分別開啟
/flag.txt:
/welcome.txt:
/hints.txt:
還有一點需要注意的是:
/file?filename=/hints.txt&filehash=32aaa29a01b1b5a672bda72c1313619e
就如上面訪問檔案的時候都需要filehash才可以訪問
從/hints.txt中我們可以知道filehash的組成為:
md5(cookie_secret+md5(filename))
從/flag.txt中我們已經知道了flag所在的檔案為/fllllllllllllag,
所以現在我們只需要知道cookie_secret就可以得到flag
然後我去檢視cookie發現沒有cookie
說明我們的方向也許有點問題,繼續檢視其他資訊
在/welcome.txt中我們發現了render
提供給render相應引數,它可以生成相應的html供前端響應
既然使用這個函式提供的html,那也許存在SSTI注入漏洞
有了新的方向,那我們去查詢漏洞
首先開始提供的那三個介面根本沒辦法利用,都進行了filehash驗證,
當輸入錯誤的filehash的時候會發現跳轉到了錯誤介面
看到這裡
?msg=Error
很可能存在漏洞,那我們進行驗證一下
?msg=1
確實可以顯示,繼續
?msg={{1*1}}
百度了一下ORZ是什麼意思才發現是被過濾了,繼續試
?msg={{1^2}}
發現進行了異或運算,不用在進行驗證了
雖然現在發現了SSTI注入,但是cookie_secret在哪裡獲取
百度搜索了關鍵字cookie_secret,發現是tornado模板引擎裡面的一種安全cookie機制
那現在cookie_secret就能和SSTI漏洞結合了,百度查詢後發現,只需要輸入如下就可以獲得cookie_secret
?msg={{handler.settings}}
得到如下結果
接下來就是寫一個python指令碼獲取filehash了
import hashlib hash = hashlib.md5() filename='/fllllllllllllag' cookie_secret="28a80f75-de02-42ef-927c-c99e9be61b1b" hash.update(filename.encode('utf-8')) s1=hash.hexdigest() hash = hashlib.md5() hash.update((cookie_secret+s1).encode('utf-8')) print(hash.hexdigest()) ##hash.digest() ##返回摘要,作為二進位制資料字串值 ##hash.hexdigest() ##返回摘要,作為十六進位制資料字串值
執行指令碼後得到結果
0x01
前面我們已經獲得了flag,但是還有一個地方值得我們研究
那就是為什麼輸入
?msg={{handler.settings}}
可以獲得cookie_secret,原因就是:
在tornado模板中,存在一些可以訪問的快速物件,這裡用到的是handler.settings,
handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,
所以handler.settings就指向RequestHandler.application.settings了,這裡面就是我們的一些環境變數