护网杯2018的一道tornado模板注入题目

1
2
3
4
5
6
7
8
/flag.txt
flag in /fllllllllllllag

/welcome.txt
render

/hints.txt
md5(cookie_secret+md5(filename))

给出了以上信息,并且url格式是file?filename=/hints.txt&filehash=1665701fc163e54b3bdc373b5e48446d这样的,直接修改filename为flag的话,得到错误信息:

1
/error?msg=Error

并且页面显示Error,直接修改msg页面显示内容也会改变,根据render提示应该是模板注入,但存在过滤,ORZ

在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量

得到secret后,就是计算访问flag文件的hash,获取flag

1
2
3
4
5
6
7
import hashlib

filename = '/fllllllllllllag'
cookie_secret = 'xxxx'
file_md5 = hashlib.md5(filename).hexdigest()
print file_md5
print hashlib.md5(cookie_secret+file_md5).hexdigest()