
三个链接

第一个就具有filename的名字

render渲染函数

告诉了加密方式,那难点就是怎么找cookie_secret
知识点:
1.SSTI(模板注入)
2.render函数
3.Tornado框架
首先SSTI注入:服务端模板注入
当前使用的一些框架,比如python的flask,php的tp,java的spring等一般都采用成熟的的MVC的模式,用户的输入先进入Controller控制器,然后根据请求类型和请求的指令发送给对应Model业务模型进行业务逻辑判断,数据库存取,最后把结果返回给View视图层,经过模板渲染展示给用户。
简单来说就是,用户输入的东西在进行分析后被传出来视图层进行模板渲染(render),让用户看到结果。模板是不同的,因此会有不同的传输结果。
php常见的模板:twig,smarty,blade。而render函数就存在于模板twig中:
Twig使用一个加载器 loader(Twig_Loader_Array) 来定位模板,以及一个环境变量 environment(Twig_Environment) 来存储配置信息。其中,render() 方法通过其第一个参数载入模板,并通过第二个参数中的变量来渲染模板。使用 Twig 模版引擎渲染页面,其中模版含有 {{name}} 变量,其模版变量值来自于GET请求参数$_GET[“name”]
如果服务端将用户的输入作为了模板的一部分,那么在页面渲染时也必定会将用户输入的内容进行模版编译和解析最后输出。
除此之外,在Twig模板引擎里,,{{var}} 除了可以输出传递的变量以外,还能执行一些基本的表达式然后将其结果作为该模板变量的值。这里用户输入name={{6+10}},则输出“Hello 16”
基于此,我们尝试输入:/error?msg={{1}},输出1,可以确定是模板注入。
至于要寻找cookie_secret,要先知道tornado框架:
Tornado全称Tornado Web Server,是一个用Python语言写成的Web服务器兼Web应用框架 (这道题需要去官方文档去查

Tornado提供了一些对象别名来快速访问对象。Handler指向的处理当前这个页面的RequestHandler对象,handler是RequestHandler的别名,而上面又提到RequestHandler.settings是self.application.settings的别名。所以handler.settings就等于RequestHandler.application.settings。这个self是oneself的意思,哪个对象用就是哪个对象的.application.settings。 所以用handler.settings访问RequestHandler.application.settings: 即输入:/error?msg={{handler.settings}}

将cookie_secert和/fllllllllllllag分别MD5加密后拼接再次加密输入得到flag构造payload: file?filename=/fllllllllllllag&filehash=正确MD5值
这道题难点就是需要查文档,并在文档无法查询的情况下再构造别名查询
贴一个python脚本
import hashlib
hash = hashlib.md5() #创建md5加密对象
hash.update("/fllllllllllllag".encode('UTF-8')) #更新对象要加密的字符串,要先UTF-8编码成二进制,因为md5只加密二进制
s1=hash.hexdigest()#以十六进制输出密文
hash = hashlib.md5()#按要求重复步骤
hash.update(("d77f4dae-3b11-4046-8fa6-d2c17867c914"+s1).encode('utf-8'))
print(hash.hexdigest())