-
先了解下题目里 tornado 看看情况
大概心里有个方向了 -
话不多说,先上图
-
根据题目可知有三个文件,不管三七二十一,先挨个点一遍,看看效果
flag.txt:文件里给出了,flag的位置??这么简单?尝试一波能否访问:
错误信息,不能访问,发现访问需要 filehash,文件名知道,filehash 不知道啊,接着往下看看吧
这里只给了一个单词,先不管吧,小编最初只是了解下单词什么意思,嗯不够纯粹,深入了解一下,才发现这是 python 的一个渲染函数。那么应该考虑是 python 模板注入了
这里就更带劲了,直接给出了获取 filehash 的方法,前提是得知道 cookie_secret -
前面我们知道 tornado render,那么先去了解下这是个什么东西
Tornado小记 – 模板中的Handler
然后牵连出 STTI,参考:SSTI完全学习
概要:
SSTI就是服务器端模板注入(Server-Side Template Injection),也给出了一个注入的概念。
SSTI也是获取了一个输入,然后再后端的渲染处理上进行了语句的拼接,然后执行。SSTI利用的是现在的网站模板引擎,主要针对python、php、java的一些网站处理框架,比如Python的jinja2、mako、tornado、django,php的smarty、twig,java的jade、velocity。当这些框架对运用渲染函数生成html的时候会出现SSTI的问题。
了解完之后,发现在tornado模板中,存在一些可以访问的快速对象,例如:
<title>
{{ escape(handler.settings["cookie"]) }}
</title>
- handler.settings指向RequestHandler.settings,而RequestHandler.settings又指向self.application.settings 。所有handler.settings就指向RequestHandler.application.settings了。而这里面正是我们的环境变量
- 为什么使用 {{}}
Tornado templates support control statements and expressions. Control statements are surrounded by {% and %}, e.g. {% if len(items) > 2 %}. Expressions are surrounded by {{ and }}, e.g. {{ items[0] }}.
根据以上信息,构造如下 payload:
5. 尝试用环境变量:handler.settings
得到了 cookie_secret
,根据之前得到的 filehash 的加密方式:md5(cookie_secret+md5(filename))
或者使用脚本:
import hashlib
def Md5(x):
md5 = hashlib.md5(str(x).encode("utf8")).hexdigest()
return md5
print(Md5("998295d7-756f-4b8a-ab70-ecadb46d9033"+Md5("/fllllllllllllag")))
- 获取加密后的 filehash,进行注入,payload如下;
filename=/fllllllllllllag&filehash=2aaa47cd21fcbb4c37344c705ad3f0ba
7. 总结
STTI 注入初次接触,不是熟悉,不了解 handler.settings 这个东西,基本废了,web 方向涉猎太广,需要学习的东西太多了,,,
还是要多多积累知识,对平时遇到的 payload 整理归类,便于以后使用或者提供思路。